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

n8ghc7c1  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(187)

我已经发现了一些类似的问题张贴在网络上,它会出现,我已经在做什么解决方案建议。
对问题进行总结;尽管计算着色器正在运行并且不存在任何错误,但不会对应该写入的纹理进行任何更改。
计算着色器代码。它本来是要做其他事情的,但为了排除故障,它只是用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的输出,稍后都会在片段着色器中采样。
Order of operation
Listed images
红色正方形是使用glTexSubImage 3D进行的测试填充。再次用于故障排除。
我已经确保传递的是正确的纹理格式。
Example in RenderDoc
此外,我使用了glDebugMessageCallback,它通常会捕获所有错误,所以我假设创建代码没有问题。
如果提供的信息有点不连贯,我很抱歉。显示所有内容会使一个很长的帖子,我不确定哪些部分是最相关的显示。

8tntrjer

8tntrjer1#

我找到了一个解决方案!显然,在3D纹理的情况下,您需要为 glBindImageTexture 中的 layered 传递GL_TRUE。
https://www.khronos.org/opengl/wiki/Image_Load_Store
图像绑定可以是分层的或非分层的,这由分层决定。如果分层为GL_TRUE,则纹理必须是数组纹理(某些类型)、立方体贴图纹理或3D纹理。如果绑定的是分层图像,则将绑定由级别指定的整个mipmap级别。

相关问题