[英]OpenGL Texture Coordinates in Pixel Space
我正在开发一个使用 OpenGL ES 2 进行绘图的 iPhone 应用程序。 我知道通常纹理坐标定义在 0-1 范围内,但理想情况下,为了便于阅读,我希望将它们从 0-1023(我的 TextureAtlas 的大小)的 map 。 我已经看到了以这种方式定义坐标的示例代码,但无法弄清楚以前的调用是允许这样做的。 glMatrixMode(GL_TEXTURE)
似乎可能涉及它,但我不太确定如何实现它。
我的最终目标是完成这样的事情,我将在图集中使用的纹理位于左上角 48px 正方形中:
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)
但是,如果您想将纹理与屏幕像素完美对齐,请记住您指定的坐标不是四边形的像素,而是边缘,根据投影,边缘可能与屏幕像素边缘对齐,而不是中心,因此可能需要其他纹理坐标。
我浪费了1个小时来寻找直观的数字,但令人惊讶的是没有人画。 所以我做了。
给定4像素纹理,归一化纹理坐标[0,1],非归一化纹理坐标[0, width),gl_FragCoord[0, width]如下
参考
事实证明这在 OpenGl ES 2 中是可能的。这是我完成它的方法:
片段着色器:
precision mediump float;
varying vec2 v_texCoord;
uniform sampler2D textureSample;
uniform float texScale;
void main()
{
vec2 mult=(2.0*v_texCoord - 1.0)/(2.0*texScale);
gl_FragColor = texture2D(textureSample,mult);
}
对象-C:
GLshort texCoords[]={
512,512,
0,512,
512,0,
0,0,
};
GLfloat textureWidth = 512.0; //texture size, assumed square, power of 2
texCoordLoc = glGetAttribLocation ( program, "a_texCoord");
GLuint textureScale = glGetUniformLocation ( program, "texScale");
glUniform1f(textureScale, textureWidth);
glVertexAttribPointer ( texCoordLoc, 2, GL_SHORT, GL_FALSE, 0, texCoords);
如果有人对这在性能方面如何工作有意见,我会很感兴趣。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.