OpenGL计算着色器:向纹理写入似乎没有任何作用

3
我在网上找到了一些类似的问题,看起来我已经按照解决方案所建议的做了。
问题概述:尽管计算着色器正在运行且没有错误,但它应该写入的纹理并没有发生任何变化。
计算着色器代码。它原本是用于其他目的,但为了排除故障,它只是将输出纹理填充为1。
#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的输出,稍后都将在片段着色器中进行采样。

操作顺序

列出的图像

红色正方形是使用glTexSubImage3D制作的测试填充。同样是为了故障排除。

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

RenderDoc示例

另外,我正在使用glDebugMessageCallback,通常捕获所有错误,因此我认为创建代码没有问题。

如果提供的信息有些杂乱无章,请见谅。显示所有内容将使帖子变得非常冗长,而我不确定哪些部分最相关。

1个回答

3
我找到了解决方案!显然,在 3D 纹理的情况下,您需要在 glBindImageTexture 中传递 GL_TRUE 给 layered 参数。

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

图像绑定可以分层或不分层,这由"layered"属性决定。如果"layered"属性为GL_TRUE,则纹理必须是某种类型的数组纹理、立方体贴图纹理或3D纹理。如果绑定的是分层图像,则将绑定整个指定级别的mipmap层级。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接