ARB_texture_storage被引入OpenGL 4.2核心。不可變的紋理是什麼意思?
你能解釋紋理對象的不變性嗎?
爲什麼從以前的紋理使用情況來看更好,以及這個功能有什麼缺點?
我知道我可以閱讀這個擴展的規範(我做了:)),但我希望看到一些例子或其他解釋。
ARB_texture_storage被引入OpenGL 4.2核心。不可變的紋理是什麼意思?
你能解釋紋理對象的不變性嗎?
爲什麼從以前的紋理使用情況來看更好,以及這個功能有什麼缺點?
我知道我可以閱讀這個擴展的規範(我做了:)),但我希望看到一些例子或其他解釋。
只需讀取擴展本身的介紹:
The texture image specification commands in OpenGL allow each level
to be separately specified with different sizes, formats, types and
so on, and only imposes consistency checks at draw time. This adds
overhead for implementations.
This extension provides a mechanism for specifying the entire
structure of a texture in a single call, allowing certain
consistency checks and memory allocations to be done up front. Once
specified, the format and dimensions of the image array become
immutable, to simplify completeness checks in the implementation.
When using this extension, it is no longer possible to supply texture
data using TexImage*. Instead, data can be uploaded using TexSubImage*,
or produced by other means (such as render-to-texture, mipmap generation,
or rendering to a sibling EGLImage).
This extension has complicated interactions with other extensions.
The goal of most of these interactions is to ensure that a texture
is always mipmap complete (and cube complete for cubemap textures).
最明顯的優點是可以實現在運行時刪除完整性/一致性檢查,你的代碼更健壯,因爲你可以不小心創建錯誤的紋理。
要闡述:「不可改變的」,這裏指紋理存儲(紋理的三個組成部分之一:存儲,取樣,參數)被分配一次和它已經完整。請注意,存儲並不意味着存儲內容 - 它們可以隨時更改;它指的是爲這些內容獲取資源的邏輯過程(如malloc)。
使用非不可變紋理,您可以隨時通過調用glTexImage<N>D
來更改存儲。有這樣搬起石頭砸自己的腳的很多很多:
既然你可以調用glTexImage<N>D
在任何時候,實現必須經常檢查,在繪製時,你的質地是合法的。不變的存儲通過正確的格式一次性分配所有內容(所有mipmap級別,所有cubemap面等),爲您提供正確的。所以你不能再搞一個紋理(容易)了,實現可以刪除一些檢查,這會加快速度。每個人都很高興:)
謝謝aswer。我發現通常這種擴展降低了複雜性並且應該能夠提高速度。當你從磁盤加載一個簡單的紋理時,你應該使用TexStorage2D來預先完成所有的工作。 – fen
@fen *「當你從磁盤加載簡單的紋理時」* - 不,應該讀*「當你有任何紋理」*。 –
「*這個功能的缺點是什麼?*」事實上它不在OpenGL 1.1中。 –
[glTexStorage是做什麼的?]的可能重複(http://stackoverflow.com/questions/9224300/what-does-gltexstorage-do) –
它基本上解決了OpenGL中的設計缺陷。除了非常有趣的功能之外,大多數現代OpenGL都是關於API更改,而不是提供新功能。事實是,現在我們有了一個精確的GPU功能的想法(仍然有空間用於XD的新東西),我們需要更好和更一致的API來爲用戶提供可用性。 – GameDeveloper