我正在开发一款使用 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/