【问题标题】:How to create a cube map array texture from individual cube map textures in OpenGL 4.5?如何从 OpenGL 4.5 中的单个立方体贴图纹理创建立方体贴图阵列纹理?
【发布时间】:2018-07-29 04:07:55
【问题描述】:

假设我有许多立方体贴图纹理,我希望将它们全部作为立方体贴图数组纹理传递给 GPU。

首先我需要创建数组纹理,它看起来应该是这样的:

glTextureStorage3D(textureId, 0, internalFormat, width, height, howManyCubeMaps);

假设只有一个 mipmap 级别。

然后如何将每个单独的纹理附加到这个纹理数组?

如果每个立方体贴图 id 都在一个数组中,我想知道你是否可以这样做:

for(uint level=0; level<num_levels; level++)
    glAttach(textureID, cubeID[level], level);

然后我不确定我应该如何在着色器端接收数据,并且 OpenGL wiki 上没有明确的文档说明

https://www.khronos.org/opengl/wiki/Cubemap_Texture#Cubemap_array_textures

【问题讨论】:

  • "OpenGL wiki 没有明确的文档说明" 它有明确的文档。它告诉您采样器类型是什么。它告诉你立方体贴图数组如何改变纹理访问函数的接口。它没有的是可复制粘贴的代码。 Cubemap 数组就像 2D 和 1D 数组纹理一样工作:它们的纹理坐标需要一个额外的组件,即数组层。如果您有关于如何使用立方体贴图数组的具体问题,可以提出。

标签: c++ opengl textures


【解决方案1】:

然后如何将每个单独的纹理附加到这个纹理数组?

这不是 OpenGL 中数组纹理的工作方式。这甚至不是数组在 C++ 中的工作方式。想一想:如果你有 5 个int 变量,就无法将这些int 变量“附加”到int array[5] 数组。唯一的解决方案是将这些变量的 value 复制到数组中的适当位置。在这个过程之后,你仍然有 5 个int 变量,它们与数组之间没有任何联系。

OpenGL 也是如此:您只能将这些立方体贴图纹理中的数据复制到立方体贴图阵列纹理中的适当位置。 glCopyImageSubData 是您完成此过程的最佳选择。

【讨论】:

  • 如果您使用指针,C++ 中的数组绝对可以像这样工作。不必复制数据,您只需知道数据在 RAM 中的存储位置。这在查找方面效率较低,因为现在您在内存中跳跃,但它仍然比复制数据快。
  • @Makogan:指向整数的数组与整数数组不同。我知道你会这么说,这就是为什么我在写完这个答案后立即发布了this OpenGL question
  • 我知道它们是不同的,但重点不在于它们是否相同。关键是它们可以用于相同的目的,一个在查找方面效率较低,但在数据复制方面比另一个效率更高。对我来说,在指针数组中复制一个指针可以被视为将关联的内存部分“附加”到数组。然而这并不重要。我确实想评论说,我感谢您的所有回答和帮助,顺便说一句,只是把它放在那里,因为我认为我在某些回复中听起来像个混蛋。
猜你喜欢
  • 2014-12-15
  • 2014-05-06
  • 1970-01-01
  • 2015-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-24
相关资源
最近更新 更多