簡體   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