GLSL纹理坐标到绝对像素?

use*_*931 2 opengl glsl texture-mapping uv-mapping

我的问题是关于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)

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

dev*_*snd 5

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

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

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

这更直观地解释了它: 纹理插值4纹素

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

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

我很抱歉最初的困惑.