关于我的意图:
我有一个图像堆栈,出于几个原因,我需要它们都是独立的2D纹理。然后,对于一些组合显示,我需要将它们中的5-10个融合在一个显示中(非常适合Texture2d_Array)。我的想法是把已经上传的2D纹理组成一个Texture2d数组。有没有可能使用OpenGL给我的函数呢?
备注:我希望避免重新加载图像数据,并且出于效率的原因,已经创建的mip-mip非常有用,应该保留。因此,像“从Tex2d获取数据,创建新的Tex2Darray-layer”这样的操作是愚蠢的。
如果失败,我的退路是在我的着色器中有大约10个采样器,并在显示之前将它们相加/平均在一起。
发布于 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()
。
发布于 2015-08-04 07:17:19
使用以下两种技术的组合,可以绕过将每个纹理放在单独的2D纹理中的限制:
glTextureView()
创建单个纹理数组,然后使用glTextureView() ( OpenGL 4.3+中的核心)创建行为与当前现有纹理完全相同的单独2D纹理。与Reto Koradi概述的功能相比,不同之处在于纹理视图不会复制图形处理器上的内存,这可能会更有效,具体取决于您的需求。
但是,您不能根据请求使用此函数将多个现有2D纹理一起映射到新的2D数组中。原因很简单,因为在OpenGL中对GPU内存映射没有足够的控制,尽管这在理论上是可能的,至少在某些情况下是可能的(假设每个片的大小可以除以GPU内存控制器的页面大小)。
纹理地图集
您不一定需要为每个特殊用例创建具有精确2D纹理切片集的新纹理数组,而是将包含所有纹理的大型纹理数组绑定到单个(或多个)采样器,并将其与切片索引数组(仅选择所需的纹理)一起传递到着色器。显然,只有当您愿意/能够更改着色器源代码时,该选项才是可行的。
https://stackoverflow.com/questions/31743631
复制相似问题