OpenGL立方体贴图只能写入一个面。

huangapple go评论100阅读模式
英文:

OpenGL Cubemap Can only write to one face

问题

我有一个类似这样的立方体贴图纹理:

  1. uint32_t skyboxTextureUnfiltered = -1;
  2. glGenTextures(1, &skyboxTextureUnfiltered);
  3. glBindTexture(GL_TEXTURE_CUBE_MAP, skyboxTextureUnfiltered);
  4. glTexStorage2D(GL_TEXTURE_CUBE_MAP, 6, GL_RGBA32F, m_SkyboxSize, m_SkyboxSize);
  5. glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  6. glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

然后我在它上面运行一个计算着色器:

  1. glBindImageTexture(0, skyboxTextureUnfiltered, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA32F);
  2. glUseProgram(m_EquirectToCubeID);
  3. glDispatchCompute(m_SkyboxSize, m_SkyboxSize, 6);

我的计算着色器如下:

  1. layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
  2. layout(binding = 0, rgba32f) uniform imageCube outputTexture;
  3. void main(void)
  4. {
  5. imageStore(outputTexture, ivec3(gl_GlobalInvocationID), vec4(1.0f));
  6. }

但在所有这些操作之后,当我尝试在RenderDoc中查看其内容时,我只看到+X面是白色的,其余都是黑色的。

为什么会发生这种情况?

英文:

I have a cubemap texture like this:

  1. uint32_t skyboxTextureUnfiltered = -1;
  2. glGenTextures(1, &skyboxTextureUnfiltered);
  3. glBindTexture(GL_TEXTURE_CUBE_MAP, skyboxTextureUnfiltered);
  4. glTexStorage2D(GL_TEXTURE_CUBE_MAP, 6, GL_RGBA32F, m_SkyboxSize, m_SkyboxSize);
  5. glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  6. glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

I run a compute shader on it like:

  1. glBindImageTexture(0, skyboxTextureUnfiltered, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA32F);
  2. glUseProgram(m_EquirectToCubeID);
  3. glDispatchCompute(m_SkyboxSize, m_SkyboxSize, 6);

And my compute shader looks like :

  1. layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
  2. layout(binding = 0, rgba32f) uniform imageCube outputTexture;
  3. void main(void)
  4. {
  5. imageStore(outputTexture, ivec3(gl_GlobalInvocationID), vec4(1.0f));
  6. }

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 而不是:

  1. glBindImageTexture(0, skyboxTextureUnfiltered, 0, GL_TRUE, 0, GL_READ_WRITE, GL_RGBA32F);
英文:
  1. 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:

  1. glBindImageTexture(0, skyboxTextureUnfiltered, 0, GL_TRUE, 0, GL_READ_WRITE, GL_RGBA32F);

huangapple
  • 本文由 发表于 2023年2月27日 02:41:01
  • 转载请务必保留本文链接:https://go.coder-hub.com/75574232.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定