iphone - 像素空间中的 OpenGL 纹理坐标

标签 iphone objective-c cocoa-touch opengl-es

我正在开发一款使用 OpenGL ES 2 进行绘图的 iPhone 应用程序。我知道通常纹理坐标是在 0-1 范围内定义的,但理想情况下,为了便于阅读,我想将它们映射到 0-1023(我的 TextureAtlas 的大小)。我看过以这种方式定义坐标的示例代码,但无法弄清楚之前进行的哪些调用允许这样做。 glMatrixMode(GL_TEXTURE) 看起来可能涉及,但我不太确定如何实现它。

我的最终目标是完成这样的事情,我将在图集中使用的纹理位于左上角 48 像素的正方形中:

GLshort texcoords[]={
  48,48,
  0,48,
  48,0,
  0,0,
};
glVertexAttribPointer(ATTRIB_TEXTUREPOSITON, 2, GL_SHORT, 0, 0, texcoords);
glEnableVertexAttribArray(ATTRIB_TEXTUREPOSITON);

最佳答案

这已被问过几次,但我手头没有链接,所以快速粗略地解释一下。假设纹理是 8 像素宽:

 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
 ^   ^   ^   ^   ^   ^   ^   ^   ^
0.0  |   |   |   |   |   |   |  1.0
 |   |   |   |   |   |   |   |   |
0/8 1/8 2/8 3/8 4/8 5/8 6/8 7/8 8/8

数字表示纹理的像素,条形表示纹理的边缘,在最近过滤的情况下表示像素之间的边界。然而,你想要击中像素的中心。所以你对纹理坐标感兴趣

(0/8 + 1/8)/2 = 1/(2 * 8)

(1/8 + 2/8)/2 = 3/(2 * 8)

...

(7/8 + 8/8)/2 = 15/(2 * 8)

或者更一般地,对于 N 宽纹理中的像素 i,适当的纹理坐标是

(2i + 1)/(2N)

但是,如果您希望纹理与屏幕像素完美对齐,请记住您指定的坐标不是四边形的像素,而是边缘,根据投影的不同,边缘可能与屏幕像素边缘而不是中心对齐,因此可能需要其他纹理坐标。

关于iphone - 像素空间中的 OpenGL 纹理坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5879403/

相关文章:

ios - 如何在没有 "MFMessageComposeViewController "的情况下以编程方式在 iPhone 上发送短信?

iphone - ios如何验证电话号码

iphone - 在 Objective-C 中分配/初始化实例变量的正确方法?

objective-c - 如何知道对象地址是否为 0x0?

ios - 如何修复 Alljoyn iOS SDK 构建失败并出现以下错误?

iphone - CGContext 使用两个不透明的 UIColor 绘制

iphone - 如何在UITableview中选择多行

ios - 在键盘顶部添加一个完成按钮

ios - iOS应用中的Google Translate API集成

ios - 为什么我的自定义 UITableViewCell 宽度在初始加载时不正确?