我正在开发一款使用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);
Run Code Online (Sandbox Code Playgroud) 我正在进入GLSL并需要一些纹理查找帮助.我正在尝试使用纹理进行存储,但我无法获得"正确"的纹理查找.我更喜欢使用通常的texture2D方法(使用GLSL 1.2),但结果不够好.
使用texture2D:

使用texelFetch:

现在很明显第一个问题出了问题.这是我想要做的事情(是的尺寸是正确的,除非有一些我不知道的事情):
vec4 texelFetch(sampler2D tex, ivec2 size, ivec2 coord)
{
return texture2D(tex, vec2(float(coord.x) / float(size.x),
float(coord.y) / float(size.y)));
}
Run Code Online (Sandbox Code Playgroud)
那么,这将如何正确完成?
我的问题是关于texturecoordinate如何精确地映射到纹理中的纹素(不考虑过滤).
(0,0)例如是参考左上角像素的左上角还是参考左上角像素的中心?
如果使用近滤波,在纹理坐标(0.5,0.5)处获取什么像素?
怎么样(1.0,1.0),它是指右下角像素的右下角还是右下角像素的左上角?(我记得几年前,一些ATI和NVIDIA卡之间存在差异.它现在是标准化的吗?)
如果使用texelFetch()而不是textureLod(),访问像素的正确方法是什么?
是吗
ivec2 size = textureSize(sampler,0);
ivec2 iCoords = ivec2(int(uv.x*size.x),int(uv.y*size.y));
vec4 col = texelFetch(sampler,iCoords);
Run Code Online (Sandbox Code Playgroud)
或者可能
ivec2 iCoords = ivec2(int(uv.x*size.x+0.5f),int(uv.y*size.y+0.5f));
Run Code Online (Sandbox Code Playgroud)
正确?
甚至
ivec2 iCoords = ivec2(int(uv.x*(size.x+1)),int(uv.y*(size.y+1)));
Run Code Online (Sandbox Code Playgroud)
?
也许有人可以澄清映射究竟是如何工作的?