我一直在编写GLSL着色器,并使用整数纹理(GL_RED(在着色器中存储值。当我尝试分割从usample2D纹理中获取的值时,它保持不变。以下是最小可复制着色器。
#version 440
in vec2 uv;
out vec3 color;
layout (binding = 1) uniform usampler2D tm_data;
void main(){
float index = texture(tm_data, uv).r;
float divisor = 16.0f
color = vec3(index / divisor, 0, 0);
}
渲染的红色值始终为1.0,无论我尝试如何划分或更改索引值。
当采样器变为标准化采样器(sampler2D(时,颜色操作按预期工作
#version 440
in vec2 uv;
out vec3 color;
layout (binding = 1) uniform sampler2D tm_data; //Loads as normalized from [0,255] to [0,1]
void main(){
float index = texture(tm_data, uv).r * 255.0f; //Convert back to integer approximation
float divisor = 4.0f
color = vec3(index / divisor, 0, 0); //Shade of red now appears considerably darker
}
有人知道为什么会发生这种意想不到的行为吗?
tm_data纹理加载为GL_RED->GL_RED使用的OpenGL版本为4.4没有使用任何框架(没有偷偷添加(,所有内容都是使用gl函数调用加载的。
对于usampler2D
的使用,内部格式必须是无符号整数格式(例如GL_R8UI
(。请参见采样器类型
如果内部格式是基本格式GL_RED
,则采样器类型必须是sampler2D
注意,sampler*
用于浮点格式,isampler*
用于有符号积分格式,usampler*
用于无符号积分格式
请参见OpenGL着色语言4.60规范-4.1.7。不透明类型和OpenGL着色语言4.60规范-8.9。纹理函数