我有一个(默认的顶点和)片段着色器,它应该调整纹理大小并按照亮度校正的特定因子缩放它们的颜色。
结果呈现为GL_UNSIGNED_INT_8_8_8_8帧缓冲区。
#version 330
uniform sampler2D tex;
uniform vec2 screenSize;
uniform float scale;
layout(location = 0) out vec4 color;
void main()
{
vec2 coord = gl_FragCoord.xy / screenSize;
color = texture(tex, coord);
color *= scale;
color.a = 1;
}
当我将R32I纹理绑定到tex时,红色通道中texture
调用的输出始终为0,尽管纹理中没有0数据。
我通过apitrace检查了正确的纹理绑定到tex
并且它包含的值高达约200。
规范化此值应该从9.3e-8
得出texture()
的输出,
而scale = 9.67e7
。
glGetError
和调试回调都没有错误消息(除了性能警告之外)。
我做错了什么?是否禁止将整数纹理绑定到(非整数)采样器?
答案 0 :(得分:5)
由于您使用的是整数格式,因此您必须使用isampler2D
代替您的采样器。
因此对于采样器,浮点采样器以"采样器"开头。有符号整数采样器以" isampler"开头,无符号整数采样器以" usampler"开头。如果您尝试从采样器中读取纹理的图像格式与采样器的基本格式(例如,带有GL_R8I的usampler2D或带有GL_R8UI的sampler1D)匹配,则所有读取都将生成未定义的值。
(资料来源:www.opengl.org)