Opengl 计算着色器仅写入一个像素
我正在尝试构建一个计算着色器来创建一个用作高度贴图的噪波纹理<代码>gl_globalinjournalid在我的调试中总是Opengl 计算着色器仅写入一个像素,opengl,glsl,compute-shader,Opengl,Glsl,Compute Shader,我正在尝试构建一个计算着色器来创建一个用作高度贴图的噪波纹理gl_globalinjournalid在我的调试中总是(0,0),我不知道为什么。好消息是compute着色器内部正在编写一些内容,因为我可以检索全红色纹理,但只能编写纯色。我试着绕过图像绑定以及计算着色器的调度命令,但到目前为止我还没有任何运气 图中没有我的着色器程序初始化,但是编译或链接没有产生错误,所以我认为问题不在这里。我相信图像和纹理格式是一致和正确的 感谢您对此问题提供的任何见解 计算着色器: OpenGL代码: 嗯,那么
(0,0)
,我不知道为什么。好消息是compute着色器内部正在编写一些内容,因为我可以检索全红色纹理,但只能编写纯色。我试着绕过图像绑定以及计算着色器的调度命令,但到目前为止我还没有任何运气
图中没有我的着色器程序初始化,但是编译或链接没有产生错误,所以我认为问题不在这里。我相信图像和纹理格式是一致和正确的
感谢您对此问题提供的任何见解
计算着色器:
OpenGL代码:
嗯,那么你是在事后渲染生成的图像?您是否也需要
GL\u纹理\u获取\u屏障\u位
屏障,以便计算着色器渲染的结果对纹理获取可见?Hmm,因此您随后要渲染生成的图像?您是否也需要GL\u纹理\u获取\u屏障\u位
屏障,以便计算着色器渲染的结果对纹理获取可见?我尝试使用GL\u所有\u屏障\u位
屏障,但没有任何结果。我尝试使用GL\u所有\u屏障\u位
屏障,但没有任何结果。
#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, 0.0, 1.0);
ivec2 pixel = ivec2(gl_GlobalInvocationID.xy);
// Debugging
if (pixel.x == 0 && pixel.y == 0) {
color = vec4(1.0, 0.0, 0.0, 1.0);
} else {
color = vec4(0.0, 1.0, 0.0, 1.0);
}
imageStore(noiseImage, pixel, color);
}
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_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, width, height, 0, GL_RGBA, GL_FLOAT, NULL);
glBindImageTexture(0, noiseTexture, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA32F);
// Snipped (runs every frame)
glUseProgram(computeShader);
glDispatchCompute(width, height, 1);
glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, noiseTexture);
glUseProgram(vertex/fragment);
render();