繁体   English   中英

OpenGL 像素空间中的纹理坐标

[英]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]如下

在此处输入图像描述

参考

  1. P270 在https://www.khronos.org/registry/gles/specs/3.1/es_spec_3.1.pdf
  2. https://www.opengl.org/sdk/docs/man/html/gl_FragCoord.xhtml
  3. https://www.opengl.org/wiki/Sampler_(GLSL)

事实证明这在 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM