英文:
OpenGL Cubemap Can only write to one face
问题
我有一个类似这样的立方体贴图纹理:
uint32_t skyboxTextureUnfiltered = -1;
glGenTextures(1, &skyboxTextureUnfiltered);
glBindTexture(GL_TEXTURE_CUBE_MAP, skyboxTextureUnfiltered);
glTexStorage2D(GL_TEXTURE_CUBE_MAP, 6, GL_RGBA32F, m_SkyboxSize, m_SkyboxSize);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
然后我在它上面运行一个计算着色器:
glBindImageTexture(0, skyboxTextureUnfiltered, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA32F);
glUseProgram(m_EquirectToCubeID);
glDispatchCompute(m_SkyboxSize, m_SkyboxSize, 6);
我的计算着色器如下:
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
layout(binding = 0, rgba32f) uniform imageCube outputTexture;
void main(void)
{
imageStore(outputTexture, ivec3(gl_GlobalInvocationID), vec4(1.0f));
}
但在所有这些操作之后,当我尝试在RenderDoc中查看其内容时,我只看到+X面是白色的,其余都是黑色的。
为什么会发生这种情况?
英文:
I have a cubemap texture like this:
uint32_t skyboxTextureUnfiltered = -1;
glGenTextures(1, &skyboxTextureUnfiltered);
glBindTexture(GL_TEXTURE_CUBE_MAP, skyboxTextureUnfiltered);
glTexStorage2D(GL_TEXTURE_CUBE_MAP, 6, GL_RGBA32F, m_SkyboxSize, m_SkyboxSize);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
I run a compute shader on it like:
glBindImageTexture(0, skyboxTextureUnfiltered, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA32F);
glUseProgram(m_EquirectToCubeID);
glDispatchCompute(m_SkyboxSize, m_SkyboxSize, 6);
And my compute shader looks like :
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
layout(binding = 0, rgba32f) uniform imageCube outputTexture;
void main(void)
{
imageStore(outputTexture, ivec3(gl_GlobalInvocationID), vec4(1.0f));
}
And after all this when I try to see its contents in RenderDoc, I only see the +X Face is white rest all are black.
Why is this happenning?
答案1
得分: 3
在这里,你将 GL_FALSE
传递给 layered
参数。这意味着只会绑定单个层级(这里是层级 0)。对于立方体贴图纹理,每个面都是一个单独的层级。
你应该传递 GL_TRUE
而不是:
glBindImageTexture(0, skyboxTextureUnfiltered, 0, GL_TRUE, 0, GL_READ_WRITE, GL_RGBA32F);
英文:
glBindImageTexture(0, skyboxTextureUnfiltered, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA32F);
Here you pass GL_FALSE
to the layered
parameter. It means that only a single layer (here layer 0) will be bound. For cube-map textures, every face is a single layer.
You should pass GL_TRUE
instead:
glBindImageTexture(0, skyboxTextureUnfiltered, 0, GL_TRUE, 0, GL_READ_WRITE, GL_RGBA32F);
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论