2014-04-21 19 views
1

我想用渲染无符号整数纹理片段着色器下面的代码:采样无符号整数的纹理数据

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编程指南,如果我想在着色器中接收整数,那么我应该使用整数采样器类型,整数内部格式和整数外部格式a nd类型。这里是我们的GL_R8UI作为内部格式,GL_RED_INTEGER作为外部格式,GL_UNSIGNED_BYTE作为数据类型。我也在着色器中使用usampler2D。但是当程序开始渲染文件时,总是会将错误从“int”隐式转换为“uint”。看起来纹理数据存储为int,而无符号采样器无法转换。但我确实使用GL_R8UI作为内部格式,所以纹理数据应该作为无符号存储。为什么无符号采样器只能得到int的签名?我怎么解决这个问题?

+3

你知道'vec3'是浮点数,对不对?如果你想存储从'usampler2D'获取的结果,你应该使用'uvec3'。即使这样,如果这是字面上的着色器,它应该会产生比这更严重的错误。 '纹理(...)'需要纹理坐标,'TexCoordOut'甚至没有定义。 –

回答

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) 
}