我在网上找到了一些类似的问题,看起来我已经按照解决方案所建议的做了。
问题概述:尽管计算着色器正在运行且没有错误,但它应该写入的纹理并没有发生任何变化。
计算着色器代码。它原本是用于其他目的,但为了排除故障,它只是将输出纹理填充为1。
我正在这样将纹理绑定到计算着色器中。
派遣看起来像这样。
问题概述:尽管计算着色器正在运行且没有错误,但它应该写入的纹理并没有发生任何变化。
计算着色器代码。它原本是用于其他目的,但为了排除故障,它只是将输出纹理填充为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制作的测试填充。同样是为了故障排除。
我确保传递了正确的纹理格式。
另外,我正在使用glDebugMessageCallback,通常捕获所有错误,因此我认为创建代码没有问题。
如果提供的信息有些杂乱无章,请见谅。显示所有内容将使帖子变得非常冗长,而我不确定哪些部分最相关。