我的问题是关于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);
或者可能是
ivec2 iCoords = ivec2(int(uv.x*size.x+0.5f),int(uv.y*size.y+0.5f));
正确?
甚至
ivec2 iCoords = ivec2(int(uv.x*(size.x+1)),int(uv.y*(size.y+1)));
也许有人可以澄清映射的确切作用?
答案 0 :(得分:5)
如果您的问题仅仅是出于好奇:AFAIK对该问题没有标准答案,因为您的纹理坐标必须以1.0结尾。此外,grafic卡将以不同的方式处理值(例如,一些图形卡支持64位FP-Ops)。我认为你应该总是尝试在安全方面进行编码,如果适用,可以使用0.999而不是1.0。
否则,如果您正在寻找一种从渲染纹理中读回像素的方法,您可以按照the website of dominik göddeke on gpgpu中的说明定义视口。如果将视口设置为纹理的大小,则可以简单地抓取原始坐标处的像素。我真的推荐这个网站,它对我帮助很大。
UPDATE:使用GL_REPEAT时,纹理坐标在纹理中的第一个和最后一个像素之间进行插值。因此,4纹素纹理中第一个像素的中心位于0.125,因为每个像素的宽度为0.25或1/4。
这更直观地解释了它:
如您所见,[0,0]处的纹素是[0.125,0]和[0.875,0]的线性混合,在此示例中等于[1,1]。
所有这些都在DelphiGL Wiki(english translation)
上得到了很好的解释我很抱歉最初的混乱。