我成功地将数据上传和下载到以 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);
绑定(bind):
GL13.glActiveTexture(GL13.GL_TEXTURE0 + binding);
GL11.glBindTexture(GL11.GL_TEXTURE_2D, id);
我想获取我对每个纹素的影响值。是否可以 ?如果是这样,我错过了什么?如果没有,什么是阻塞以及替代方案是什么?
谢谢。
最佳答案
我认为问题在于浮点精度。
基本上,您在除法中使用了一个非常大的 float (40 亿),并期望结果是一个非常小的 float (0-1)。但与范围 (0-1) 相比,大 float 是如此不精确,以至于您得到的结果只是噪声。
您需要做的是使这两个范围更接近。您可以改用 16 位 int 纹理,也可以先用整数除法除以纹理样本,然后再将其转换为 float (然后除以较小的 float )。
关于java - 如何在 GLSL 中读取全范围的 32 位整数纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29664158/