簡體   English   中英

與常規緩沖區和制服相比,OpenGL紋理單元背后的原因是什么?

[英]What is the reasoning behind OpenGL texture units as opposed to regular buffers and uniforms?

我是OpenGL API的新手,剛剛發現了紋理以及如何使用它們。 生成的紋理緩沖區的綁定方式與綁定常規制服的方式不同,而是使用glActiveTexture ,然后使用綁定,而不是僅通過glUniform將紋理提供給着色器,就像我們使用其他常量一樣。

這次大會背后的原因是什么?

我能想到的唯一原因是利用顯卡的全部潛力和紋理處理能力,而不僅僅是直接綁定緩沖區。 這是正確的推理,還是僅僅是API的實現方式?

在官方維基上沒有任何推理,只是說這很奇怪:“在OpenGL中使用綁定紋理有點奇怪” https://www.khronos.org/opengl/wiki/Texture

您的問題可以通過兩種方式解釋。

“為什么我們將紋理綁定到上下文而不是着色器?”

因為這會讓多個着色器使用相同的紋理變得不必要。 請注意,幾乎沒有圖形API直接將紋理附加到程序。 不是任何版本的D3D,不是Metal,甚至也不是Vulkan。

紋理是着色器使用的資源。 但它們不是着色器的一部分。

“為什么我們將紋理與一般值數組區別對待?”

在現代OpenGL中,着色器可以訪問幾種不同類型的資源:UBO,SSBO,紋理和圖像。 這些資源中的每一種最終都代表了圖形硬件的潛在不同部分。

存儲塊不僅僅是一個可以更大的統一塊。 存儲緩沖區表示着色器執行全局內存訪問,而統一塊通常直接復制到着色器執行單元中。 在后一種情況下,訪問它們的數據要快得多,但這也意味着您受這些執行單元可以擁有的存儲量的限制。

現在,並非所有硬件都是如此(AMD的GCN硬件幾乎完全相同,這就是為什么他們的UBO限制如此之大 )。 但是很多硬件也是如此。

紋理甚至更復雜,因為實現需要能夠出於性能原因以最佳方式存儲其數據。 因此,紋理存儲格式是不透明的。 它們甚至在表面上像Vulkan這樣的低級API中是不透明的。 哦,當然,存在線性格式,但是根本不需要實現來讓它們從中讀取。

因此紋理不僅僅是常量數組。

你正在比較兩個完全不同的東西

紋理對象可以(某種方式)與緩沖對象進行比較。 紋理由glActiveTextureglBindTexture的組合綁定到紋理單元,而緩沖區由glBindBuffer綁定,它類似於類似的。

紋理采樣器均勻在着色器中是均勻的,因此應與其他制服進行比較。 該取樣由一組glUniform1i電話。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM