GL_R16 和 GL_R16UI 的区别?

Dan*_*ter 3 opengl graphics shader glsl

根据wiki,不同之处在于 R16 是规范化的,而 R16UI 不是。这实际上意味着什么?它们都在内部以相同的方式存储,作为无符号整数,一个假设代表一个规范化整数而一个假设只是一个整数的事实,并没有真正告诉我任何事情。当您在着色器中对这两种类型进行采样时,您仍然会得到 0 到 1 范围内的标准化值,对吗?那么区别是什么呢?

Ret*_*adi 6

您以不同的方式对它们进行采样。对于 R16 纹理,您的着色器中将包含以下内容:

uniform sampler2D tex;
in vec2 texCoord;
...
float val = texture(tex, texCoord).r;
Run Code Online (Sandbox Code Playgroud)

对于 R16UI 纹理,它将如下所示:

uniform usampler2D tex;
in vec2 texCoord;
...
uint val = texture(tex, texCoord).r;
Run Code Online (Sandbox Code Playgroud)

所以对于 R16UI,你在采样时读出一个整数值。另一方面,R16 的行为与 R8 和类似格式(RGBA8 等)非常相似,只是它的内部精度是其两倍。

请注意,包括 R16UI 在内的所有整数纹理仅支持 NEAREST 过滤,或 NEAREST_MIPMAP_NEAREST 用于缩小过滤器。

当整数纹理用作渲染目标时,还有额外的限制。例如,不支持混合。在使用整数渲染目标之前请查阅规范以避免意外。