问题描述
我正在尝试构建一个计算着色器来创建一个噪声纹理以用作高度图。 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
屏障,以便计算着色器渲染的结果对纹理获取可见?