OpenGL Compute Shader:写入纹理似乎什么都不做

OpenGL Compute Shader: Writing to texture seemingly does nothing

我在网上发现了一些类似的问题 post,看来我已经按照解决方案的建议去做了。

总结问题;尽管有计算着色器 运行 并且没有出现错误,但它应该写入的纹理没有发生任何变化。

计算着色器代码。它本来是用来做其他事情的,但为了排除故障,它只是用 ones 填充输出纹理。

#version 430 core

layout(local_size_x = 4 local_size_y = 4, local_size_z = 4) in;

layout(r32f) uniform readonly  image3D inputDensityField;
layout(r32f) uniform writeonly image3D outputDensityField;

uniform vec4  paintColor;
uniform vec3  paintPoint;
uniform float paintRadius;
uniform float paintDensity;

void main()
{
    ivec3 cellIndex = ivec3(gl_GlobalInvocationID);
    imageStore(outputDensityField, cellIndex, vec4(1.0, 1.0, 1.0, 1.0));
}

我像这样将纹理绑定到计算着色器。

s32 uniformID = glGetUniformLocation(programID, name);
u32 bindIndex = 0; // 1 for the other texture.
glUseProgram(programID);
glUniform1i(uniformID, bindIndex);
glUseProgram(0);

调度看起来像这样。

glUseProgram(programID);

glBindImageTexture(0, inputTexID,  0, GL_FALSE, 0, GL_READ_ONLY,  GL_R32F);
glBindImageTexture(1, outputTexID, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_R32F);

glDispatchCompute(groupDim.x, groupDim.y, groupDim.z);
glMemoryBarrier(GL_ALL_BARRIER_BITS);

glUseProgram(0);

通过 RenderDoc 检查没有发现任何错误。纹理似乎已正确绑定,尽管它们都作为输出显示在 RenderDoc 中,我认为这是 RenderDoc 方面的错误? 最后一个 glDispatchCompute 输出的纹理稍后将在片段着色器中采样。

Order of operation

Listed images

红色方块是使用 glTexSubImage3D 制作的测试填充。再次用于故障排除目的。

我已确保传递正确的纹理格式。

Example in RenderDoc

此外,我正在使用 glDebugMessageCallback,它通常会捕获所有错误,因此我假设创建代码没有问题。

如果提供的信息有点不连贯,我们深表歉意。显示所有内容会很长 post,我不确定哪些部分与显示最相关。

我找到了解决办法!显然,在 3D 纹理的情况下,您需要在 glBindImageTexture.

中为 layered 传递 GL_TRUE

https://www.khronos.org/opengl/wiki/Image_Load_Store

Image bindings can be layered or non-layered, which is determined by layered​. If layered​ is GL_TRUE, then texture​ must be an Array Texture (of some type), a Cubemap Texture, or a 3D Texture. If a layered image is being bound, then the entire mipmap level specified by level​ is bound.