繁体   English   中英

是否可以在OpenGL中创建几个Texture2D objs的Texture2D_Array?

[英]Is it possible to create a Texture2D_Array off several Texture2D objs in OpenGL?

关于我的意图:

我有一个图像堆栈,由于几个原因,我需要它们都是单独的2D纹理。 然后对于一些合成的显示器,我需要将它们中的5-10个融合在一起(适用于Texture2d_Array)。 我的想法是获取已经上传的2D纹理并将它们组成一个Texture2d数组。 这可能与OpenGL给我的功能有关吗?

备注:我想避免重新加载图像数据,并且出于效率原因,已经创建的mip-maps非常有用并且应该保留。 因此,诸如“从Tex2d获取数据创建新的Tex2Darray层”之类的操作是愚蠢的。

如果失败了,我的后备将是在我的着色器中有大约10个采样器并在显示之前将它们加在一起/平均。

一切皆有可能! 好吧,差不多......

根据您提供的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()

您可以绕过限制,使用以下两种技术的组合将每个纹理放在单独的2D纹理中:

glTextureView()

创建单个纹理数组,然后使用glTextureView() (OpenGL 4.3+中的核心)创建单独的2D纹理,其行为与您当前存在的纹理完全相同。 Reto Koradi概述的功能相比,差异在于纹理视图不会复制GPU上的内存,这可能会更高效,具体取决于您的需求。

但是,您无法使用此功能将多个现有2D纹理一起映射到您请求的新2D阵列中。 原因很简单,因为对OpenGL中的GPU内存映射没有足够的控制,尽管至少在某些情况下这在理论上是可行的(假设每个切片的大小可以通过GPU的内存控制器的页面大小来分割) )。

纹理图集

您不一定需要为每个特殊用例创建一个具有精确2D纹理切片集的新纹理数组,而是将包含所有纹理的大纹理数组绑定到单个(或多个)采样器和将它与一组切片索引(仅选择您需要的纹理)一起传递给着色器。 如果您愿意/能够更改着色器源代码,则此选项显然是可行的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM