gpt4 book ai didi

opengl - imageStore() 的问题(OpenGL 4.3)

转载 作者:行者123 更新时间:2023-12-01 22:25:54 33 4
gpt4 key购买 nike

我正在尝试将一些数据从计算着色器输出到纹理,但 imageStore() 似乎什么也没做。这是着色器:

#version 430

layout(RGBA32F) uniform image2D image;

layout (local_size_x = 1, local_size_y = 1) in;
void main() {
imageStore(image, ivec2(gl_GlobalInvocationID.xy), vec4(0.0f, 1.0f, 1.0f, 1.0f));
}

应用程序代码在这里:
GLuint tex;

glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D, tex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, WIDTH, HEIGHT, 0, GL_RGBA, GL_FLOAT, 0);

glBindImageTexture(0, tex, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA32F);
glUseProgram(program->GetName());
glUniform1i(program->GetUniformLocation("image"), 0);

glDispatchCompute(WIDTH, HEIGHT, 1);

然后使用该纹理渲染全屏四边形,但目前它仅显示来自视频内存的一些随机旧数据。知道有什么问题吗?

编辑:

这就是我显示纹理的方式:
// This comes right after the previous block of code
glUseProgram(drawProgram->GetName());

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, tex);
glUniform1i(drawProgram->GetUniformLocation("sampler"), 0);

glBindVertexArray(vao);
glDrawArrays(GL_TRIANGLES, 0, 6);

glfwSwapBuffers();

drawProgram 包括:
#version 430
#extension GL_ARB_explicit_attrib_location : require

layout(location = 0) in vec2 position;
out vec2 uvCoord;

void main() {
gl_Position = vec4(position.x, position.y, 0.0f, 1.0f);
uvCoord = position;
}

和:
#version 430

in vec2 uvCoord;
out vec4 color;

uniform sampler2D sampler;

void main() {
vec2 uv = (uvCoord + vec2(1.0f)) / 2.0f;
uv.y = 1.0f - uv.y;

color = texture(sampler, uv);
//color = vec4(uv.x, uv.y, 0.0f, 1.0f);
}

片段着色器中最后注释的行产生以下输出: Render output

顶点数组对象 (vao) 有一个带有 6 个 2D 顶点的缓冲区:

-1.0,-1.0

1.0,-1.0

1.0, 1.0

1.0, 1.0

-1.0, 1.0

-1.0,-1.0

最佳答案

This is how I display the texture:



这还不够好。我没有看到 call to glMemoryBarrier ,因此不能保证您的代码确实有效。

请记住:通过 Image Load/Store 写入图像内存不连贯。他们 require explicit user synchronization before they become visible .如果您想稍后将存储到的图像用作纹理,则必须有明确的 glMemoryBarrier在写入它的渲染命令之后调用,但在从它作为纹理采样的渲染命令之前调用。

Why that is a problem, I don't know



因为桌面 OpenGL 不是 OpenGL ES。

最后三个参数仅描述 arrangement of the pixel data你给了OpenGL。它们没有改变 OpenGL 存储数据的方式。在 ES 中,它们会这样做,但这只是因为 ES 不进行格式转换。

在桌面 OpenGL 中,将浮点数据上传到归一化整数纹理是完全合法的; OpenGL 应该尽可能地转换数据。 ES 不做转换,所以它必须改变内部格式(第三个参数)来匹配数据。

桌面 GL 没有。如果你想要一个特定的 image format ,你要求它。 Desktop GL 为您提供您所要求的,并且只提供您所要求的。

始终使用大小合适的内部格式。

关于opengl - imageStore() 的问题(OpenGL 4.3),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14285849/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com