如何在GLSL中读取全范围的32位整数纹理

时间:2015-04-16 02:08:00

标签: java opengl textures glsl opengl-4

我成功上传并下载数据为R32UI作为内部格式的整数纹理。我写的纹理1000x600。我对每个像素影响一个唯一值(x + y *高度)。回读纹理时,值是正确的。

问题出在着色器/渲染方面。在'usampler2D'上使用'texture()'时,范围[0 - 255]扩展为[0 - 2 ^ 32-1]。看起来像模数256应用于纹素值然后除以256然后乘以2 ^ 32-1。

视觉:

enter image description here

片段着色器

#version 430

in vec2 gTextCoord;

layout(binding = 0) uniform usampler2D uInputImg;

out vec4 FragColor;

void main() 
{ 
    FragColor = vec4(vec3(texture(uInputImg, gTextCoord).rgb) / 4294967295.0, 1);
}

上传:

int id = GL11.glGenTextures();
GL11.glBindTexture(GL11.GL_TEXTURE_2D, id);
GL11.glTexImage2D(
    GL11.GL_TEXTURE_2D, 
    0, 
    GL30.GL_R32UI, 
    width, 
    height, 
    0, 
    GL30.GL_RED_INTEGER, 
    GL11.GL_UNSIGNED_INT, 
    data);
GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0);

绑定:

GL13.glActiveTexture(GL13.GL_TEXTURE0 + binding);
GL11.glBindTexture(GL11.GL_TEXTURE_2D, id);

我想获得每个纹素的影响值。可能吗 ?如果是这样,我错过了什么?如果没有,什么是阻止,有什么替代方案?

感谢。

1 个答案:

答案 0 :(得分:1)

我认为问题是浮动精度。

基本上你在一个师中使用一个非常大的浮点数(40亿)并且期望得到一个非常小的浮点数(0-1)。但是,与范围(0-1)相比,大浮点数是如此不精确,你获得的结果只是噪音。

你需要做的是让这两个范围更接近。您可以使用16位int纹理,也可以将纹理样本除以整数除法,然后再将其转换为float(然后除以较小的float)。