3

我的问题是关于纹理坐标如何准确映射到纹理中的纹素(不考虑过滤)。

例如,(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)));

?

也许有人可以澄清映射究竟是如何工作的?

4

1 回答 1

6

如果您的问题只是出于好奇而提出:AFAIK 该问题没有标准答案,因为您的纹理坐标不必以 1.0 结尾。此外,显卡将以不同的方式处理这些值(例如,今天的一些显卡支持 64 位 FP-Ops)。我认为您应该始终尝试在安全方面进行编码,如果适用,可能使用 0.999 而不是 1.0。

否则,如果您正在寻找一种从渲染纹理读回像素的方法,您可以按照gpgpu 上的 dominik göddeke 网站上的描述定义您的视口。如果将视口设置为纹理的大小,则可以简单地在原始坐标处抓取像素。我真的推荐这个网站,它对我帮助很大。

更新:使用 GL_REPEAT 时,纹理坐标在纹理中的第一个像素和最后一个像素之间进行插值。所以 4 texel 纹理中第一个像素的中心位于 0.125,因为每个像素的宽度为 0.25 或 1/4。

这更直观地解释了它: 4 texel 上的纹理插值

如您所见,[0,0] 处的纹素是 [0.125,0] 和 [0.875,0] 的线性混合,在此示例中等于 [1,1]。

所有这些都在DelphiGL Wiki上得到了很好的解释(英文翻译

我很抱歉一开始的混乱。

于 2012-03-22T11:25:34.057 回答