Compute Shader 只写入一个像素 计算着色器:OpenGL 代码:

问题描述

我正在尝试构建一个计算着色器来创建一个噪声纹理以用作高度图。 gl_GlobalInvocationID 在我的调试中总是 (0,0),我不知道为什么。好消息是计算着色器内部正在写入一些内容,因为我能够检索全红色纹理,但我只能写入纯色。我尝试移动图像绑定以及计算着色器的调度命令,但到目前为止我没有任何运气。

图中未显示我的着色器程序初始化,但编译或链接生成任何错误,因此我认为问题不存在。我相信图像和纹理格式也是一致且正确的。

感谢您对此问题提供的任何见解!

计算着色器:

#version 430
layout(local_size_x = 1,local_size_y = 1) in;
layout(rgba32f,binding = 0) uniform image2D noiseImage;
void main() {
    vec4 color = vec4(0.0,0.0,1.0);
    ivec2 pixel = ivec2(gl_GlobalInvocationID.xy);
    // Debugging
    if (pixel.x == 0 && pixel.y == 0) {
        color = vec4(1.0,1.0);
    } else {
        color = vec4(0.0,1.0,1.0);
    }

    imageStore(noiseImage,pixel,color);
}

OpenGL 代码

width = 512;
height = 512;
noiseTexture = 0;

// Snipped (runs once)
glGenTextures(1,&noiseTexture);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D,noiseTexture);

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
        
glTexImage2D(GL_TEXTURE_2D,GL_RGBA32F,width,height,GL_RGBA,GL_FLOAT,NULL);
glBindImageTexture(0,noiseTexture,GL_FALSE,GL_WRITE_ONLY,GL_RGBA32F);

// Snipped (runs every frame)
gluseProgram(computeShader);
gldispatchCompute(width,1);
glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT);

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D,noiseTexture);

gluseProgram(vertex/fragment);
render();

解决方法

嗯,所以你是在之后渲染结果图像?您是否也需要 GL_TEXTURE_FETCH_BARRIER_BIT 屏障,以便计算着色器渲染的结果对纹理获取可见?