为了账号安全,请及时绑定邮箱和手机立即绑定

像素空间中的OpenGL纹理坐标

像素空间中的OpenGL纹理坐标

一只甜甜圈 2019-08-13 14:03:44
像素空间中的OpenGL纹理坐标我正在开发一款使用OpenGL ES 2进行绘图的iPhone应用程序。我知道通常纹理坐标是在0-1范围内定义的,但理想情况下我想将它们从0-1023(我的TextureAtlas的大小)映射出来以便于阅读。我已经看到了以这种方式定义坐标的示例代码,但是无法确定以前允许这样做的调用。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);
查看完整描述

3 回答

?
慕容708150

TA贡献1831条经验 获得超4个赞

这已被问了好几次,但我手边没有链接,所以快速而粗略的解释。假设纹理宽度为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)


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


查看完整回答
反对 回复 2019-08-13
?
湖上湖

TA贡献2003条经验 获得超2个赞

事实证明这在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);}

OBJ-C:

GLshort texCoords[]={
    512,512,
    0,512,
    512,0,
    0,0,};GLfloat textureWidth = 512.0; //texture size, assumed square, power of 2texCoordLoc = glGetAttribLocation ( program, "a_texCoord");GLuint textureScale = glGetUniformLocation ( program, "texScale");glUniform1f(textureScale, textureWidth);glVertexAttribPointer ( texCoordLoc, 2, GL_SHORT, GL_FALSE, 0, texCoords);

如果有人对如何在性能方面发挥作用发表评论,我会感兴趣。


查看完整回答
反对 回复 2019-08-13
  • 3 回答
  • 0 关注
  • 901 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信