根据wiki,区别在于R16已标准化,而R16UI未标准化。这实际上是什么意思?它们和内部一样以无符号整数的方式正确地存储,实际上一个应该表示一个规范化的整数,另一个应该只是一个整数,这一事实并没有告诉我。在着色器中对这两种类型进行采样时,您仍然在0到1的范围内获得归一化的值,对吗?那么区别是什么呢?

最佳答案

您对它们的采样方式有所不同。对于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)仅支持NEAREST过滤,而NEAREST_MIPMAP_NEAREST用于缩小过滤器。

将整数纹理用作渲染目标时,还有其他限制。例如,不支持混合。在使用整数渲染目标之前,请查阅规格,以免出现意外。

08-16 09:27