关于我的意图:
我有一个图像堆栈,由于几个原因,我需要它们都是单独的2D纹理。然后对于一些合成的显示器,我需要将它们中的5-10个融合在一起(适用于Texture2d_Array)。我的想法是获取已经上传的2D纹理并将它们组成一个Texture2d数组。这可能与OpenGL给我的功能有关吗?
备注:我想避免重新加载图像数据,并且出于效率原因,已经创建的mip-maps非常有用并且应该保留。因此,诸如“从Tex2d获取数据创建新的Tex2Darray层”之类的操作是愚蠢的。
如果失败了,我的后备将是在我的着色器中有大约10个采样器,并在显示之前将它们加/平均。
答案 0 :(得分:3)
一切皆有可能!好吧,差不多......
根据您提供的OpenGL版本,您可以考虑一些选项。这是你真的需要复制数据。当然,到目前为止,最好的选择是首先将纹理数据加载到数组纹理中,并避免额外的副本。
glCopyImageSubData()
glCopyImageSubData()
与您想要的功能非常直接匹配。唯一的缺点是它只能在OpenGL 4.3及更高版本中使用。
glCopyTexImage2D()
我只是为了完整起见而提到这一点,以防有人看一下这个答案略有不同的用例。 glCopyTexImage2D()
通常可用于通过将源纹理设置为FBO附件来复制纹理数据。
但事实证明它不支持GL_TEXTURE_2D_ARRAY
,所以它不能用于从常规纹理复制到数组纹理。另一个方向可行。
glBlitFramebuffer()
glBlitFramebuffer()
在OpenGL 3.0及更高版本中可用,可用于复制几乎任何类型的帧缓冲/纹理数据。
要从纹理复制到纹理,请创建两个FBO。您将其中一个绑定为GL_READ_FRAMEBUFFER
,并将源纹理附加到它。将第二个绑定为GL_DRAW_FRAMEBUFFER
,并将目标纹理附加到它。然后你拨打glBlitFramebuffer()
。
答案 1 :(得分:1)
您可以绕过限制,使用以下两种技术的组合将每个纹理放在单独的2D纹理中:
glTextureView()
创建单个纹理数组,然后使用glTextureView()(OpenGL 4.3+中的核心)创建单独的2D纹理,其行为与您当前存在的纹理完全相同。与Reto Koradi概述的功能相比,差异在于纹理视图不会复制GPU上的内存,这可能会更高效,具体取决于您的需求。
但是,您无法使用此功能将多个现有2D纹理一起映射到您请求的新2D阵列中。原因很简单,因为对OpenGL中的GPU内存映射没有足够的控制,尽管至少在某些情况下这在理论上是可行的(假设每个切片的大小可以通过GPU的页面大小来分类&#39 ; s内存控制器)。
您不一定需要为每个特殊用例创建一个具有精确2D纹理切片集的纹理数组,而是将包含所有纹理的大纹理数组绑定到单个(或多个)采样器并将其与一组切片索引(仅选择您需要的纹理)一起传递给着色器。 如果您愿意/能够更改着色器源代码,此选项显然是可行的。