[英]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中是不透明的。 哦,當然,存在線性格式,但是根本不需要實現來讓它們從中讀取。
因此紋理不僅僅是常量數組。
你正在比較兩個完全不同的東西
紋理對象可以(某種方式)與緩沖對象進行比較。 紋理由glActiveTexture
和glBindTexture
的組合綁定到紋理單元,而緩沖區由glBindBuffer
綁定,它類似於類似的。
紋理采樣器均勻在着色器中是均勻的,因此應與其他制服進行比較。 該取樣器由一組glUniform1i
電話。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.