[英]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.