我成功上传并下载数据为R32UI作为内部格式的整数纹理。我写的纹理1000x600。我对每个像素影响一个唯一值(x + y *高度)。回读纹理时,值是正确的。
问题出在着色器/渲染方面。在'usampler2D'上使用'texture()'时,范围[0 - 255]扩展为[0 - 2 ^ 32-1]。看起来像模数256应用于纹素值然后除以256然后乘以2 ^ 32-1。
视觉:
片段着色器
#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);
我想获得每个纹素的影响值。可能吗 ?如果是这样,我错过了什么?如果没有,什么是阻止,有什么替代方案?
感谢。
答案 0 :(得分:1)
我认为问题是浮动精度。
基本上你在一个师中使用一个非常大的浮点数(40亿)并且期望得到一个非常小的浮点数(0-1)。但是,与范围(0-1)相比,大浮点数是如此不精确,你获得的结果只是噪音。
你需要做的是让这两个范围更接近。您可以使用16位int纹理,也可以将纹理样本除以整数除法,然后再将其转换为float(然后除以较小的float)。