首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否可以在OpenGL中使用多个Texture2D对象创建一个Texture2D_Array?

是否可以在OpenGL中使用多个Texture2D对象创建一个Texture2D_Array?
EN

Stack Overflow用户
提问于 2015-07-31 18:09:55
回答 2查看 696关注 0票数 3

关于我的意图:

我有一个图像堆栈,出于几个原因,我需要它们都是独立的2D纹理。然后,对于一些组合显示,我需要将它们中的5-10个融合在一个显示中(非常适合Texture2d_Array)。我的想法是把已经上传的2D纹理组成一个Texture2d数组。有没有可能使用OpenGL给我的函数呢?

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

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

EN

回答 2

Stack Overflow用户

发布于 2015-07-31 23:14:11

一切皆有可能!嗯,几乎所有的事……

根据可用的OpenGL版本,您可以考虑以下几个选项。这是在您确实需要复制数据的情况下。当然,到目前为止,最好的选择是首先将纹理数据加载到数组纹理中,并避免额外的副本。

glCopyImageSubData()

glCopyImageSubData()与您想要的功能非常匹配。唯一的缺点是它只在OpenGL 4.3和更高版本中可用。

glCopyTexImage2D()

我提到这个只是为了完整性,以防有人为了一个稍微不同的用例而看这个答案。glCopyTexImage2D()通常可用于通过将源纹理设置为FBO附件来复制纹理数据。

但事实证明,它不支持GL_TEXTURE_2D_ARRAY,因此它不能用于从常规纹理复制到数组纹理。另一个方向是可行的。

glBlitFramebuffer()

OpenGL 3.0及更高版本中提供了glBlitFramebuffer(),它几乎可用于复制任何类型的帧缓冲区/纹理数据。

若要在纹理之间复制,请创建两个FBO。将其中一个绑定为GL_READ_FRAMEBUFFER,并将源纹理附加到它。将第二个绑定为GL_DRAW_FRAMEBUFFER,并将目标纹理附加到它。然后调用glBlitFramebuffer()

票数 3
EN

Stack Overflow用户

发布于 2015-08-04 07:17:19

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

glTextureView()

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

但是,您不能根据请求使用此函数将多个现有2D纹理一起映射到新的2D数组中。原因很简单,因为在OpenGL中对GPU内存映射没有足够的控制,尽管这在理论上是可能的,至少在某些情况下是可能的(假设每个片的大小可以除以GPU内存控制器的页面大小)。

纹理地图集

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31743631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档