GL_R16和GL_R16UI之间有什么区别?

3
根据维基百科上的介绍,R16与R16UI之间的区别在于R16是规格化的,而R16UI则不是。这实际上意味着什么?它们在内部存储方式上是相同的,都被当作无符号整数处理。一个表示规格化整数,一个表示普通整数,这并不能真正告诉我任何东西。当你在着色器中对这两种类型进行采样时,你仍然会得到0到1范围内的规格化值,那么它们之间有什么区别呢?
1个回答

6
你需要以不同的方式对它们进行取样。对于 R16 纹理,在你的着色器中会有类似这样的代码:

你需要在着色器中使用特定的代码来处理 R16 纹理。

uniform sampler2D tex;
in vec2 texCoord;
...
float val = texture(tex, texCoord).r;

对于R16UI纹理,它将会长成这样:
uniform usampler2D tex;
in vec2 texCoord;
...
uint val = texture(tex, texCoord).r;

对于R16UI,采样时会读取整数值。另一方面,R16的行为非常类似于R8和类似格式(RGBA8等),只是它具有两倍的内部精度。
请注意,所有整数纹理(包括R16UI)仅支持最近过滤或最近的mipmap最小化过滤。
当整数纹理用作渲染目标时,存在其他限制。例如,不支持混合。在使用整数渲染目标之前,请查阅规格以避免意外情况。

1
值得注意的是,对于未归一化的整数格式,纹理过滤也不可用。 - derhass
@derhass:同意。我打这个的时候差不多要睡觉了。等我有时间了,我可以尝试添加更多细节。 - Reto Koradi
请注意,所有整数纹理(包括R16UI)仅支持最近过滤。哦,天啊,我在这上面浪费了那么多时间。一个错误消息会很有用。因此,对于加载R16UI纹理的人,请记得使用gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); - Luke Skywalker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接