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

标签 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);

绑定(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/

相关文章:

java - 找不到符号 Action 监听器引用变量

c++ - 如何在 Windows 8 64 位操作系统中注册 .DLL 文件?

java - Spring 3.2 验证请求参数,ControllerAdvice 未格式化响应

c - 在 OpenGL 中沿对象后面的方向旋转相机

c++ - 4x4 矩阵重置缩放?

C++ OpenGL Multithreading 与缓冲区资源

ios - 离屏渲染纹理在屏幕上渲染空矩形

c++ - OpenGL 纹理未按定义出现

java - 这是 Akka 的有效使用吗?

java - 在 Eclipse 中排除库类