簡體   English   中英

在 OpenGL 紋理中使用超過四個組件

[英]Use more than four components in OpenGL texture

我知道不可能擁有超過四個內置紋理組件。 至少直接。 通常,建議的解決方案很簡單——使用多個紋理。 但是,我認為這不是最優的。 讓我們看一個例子。

假設有一個具有以下屬性的基本材質格式:

  1. 反照率 - 3 個組件
  2. 正常 - 3 個組件
  3. 粗糙度 - 1 個分量
  4. 金屬度 - 1 個組件

存儲此數據的最簡單方法是使用 4 個不同的紋理,分別具有 3、3、1 和 1 個分量。 這是低效的,至少有兩個原因:

  1. 很可能 GPU 實際上並沒有存儲只有 3 個分量的前兩個紋理,而是存儲了 4 個分量,因為大多數 GPU 將 3 個分量向量、矩陣、紋理與四個分量對齊。
  2. 獲取着色器中的所有數據需要 4 個紋理樣本

處理這個問題的常用方法是盡可能少地打包數據,如果紋理也可以很好地對齊。 在這種情況下,它可以放入兩個紋理中,每個紋理有 4 個組件。 這解決了第一個浪費 memory 的問題,但第二個問題仍然存在,因為仍然需要執行 2 個紋理樣本來讀取數據。 2 個樣本並不是很多,但如果可以減少到只有一個呢?

我的想法是將所有 6 個組件打包在一個紋理中。 如何? GL_RGB16_SNORM 這是一種紋理內部格式,雖然只有 3 個組件,但實際上可以容納 6 個,因為每個像素是 6 個字節。

所以我的問題是:

  1. 是否可以將數據作為 6 個組件上傳到這樣的紋理並以某種方式在着色器中讀取它。
  2. 使用這種包裝會更快還是堅持使用兩個單獨的紋理。
  3. 有沒有不同的,更好的方法呢?

在其他層的相同 (u,v) 位置使用陣列紋理和樣本來檢索額外的紋理通道數據。

暫無
暫無

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

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