在着色器中对无符号整数纹理数据进行采样

时间:2014-04-21 21:24:22

标签: opengl textures shader unsigned-integer

我想使用以下代码使用片段着色器渲染无符号整数纹理:

glTexImage2D(GL_TEXTURE_2D, 0, GL_R8UI, width, height, 0, GL_RED_INTEGER, GL_UNSIGNED_BYTE, data);

和片段着色器代码的一部分:

#version 330
uniform usampler2D tex;
void main(void){
    vec3 vec_tex;
    vec_tex = (texture(tex), TexCoordOut).r
}

OpenGL编程指南 编写,如果我想在着色器中接收整数,那么我应该使用整数采样器类型,整数内部格式,以及整数外部格式和类型。以下为GL_R8UI内部格式,GL_RED_INTEGER为外部格式,GL_UNSIGNED_BYTE为数据类型。我还在着色器中使用usampler2D。但是当程序开始渲染文件时,总会得到错误 隐式转换来自" int"到" uint" 。似乎纹理数据存储为int,而无符号采样器无法转换它。但我确实使用GL_R8UI作为内部格式,因此纹理数据应该存储为无符号。为什么unsigned sampler只能获得signed int?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

纹理函数调用不正确,其次纹理函数返回需要在着色器中处理的浮点值,方法是将RGBA分量除以255.0(当使用GL_R8UI时)并返回并分割颜色输出。

uniform usampler2D tex;
out uvec3 OutColor;
void main(void){
    uvec3 vec_tex;
    vec_tex = texture(tex, TexCoordOut)
    OutColor = vec3(float(vec_tex.r)/255, float(vec_tex.g)/255, float(vec_tex.b)/255)
}