OpenGL ES着色器語言規範 10 常見問題(1-3)

目錄

10 常見問題

10.1 頂點着色器精度

10.2片段着色器精度

10.3 精度限定符


10 常見問題

10.1 頂點着色器精度

Q:最小精度應該是(相當於)float 24還是float 32?

A:最小精度爲float 24.將鼓勵底層實現使用float 32。

10.2片段着色器精度

Q:最小精度應該是(相當於)float 16還是float  24?

需要float 24來完成大多數依賴紋理查找的情況。

float 24對於低端硬件來說太昂貴了。

在進行簡單的混色操作時,即使是float16也很昂貴。能用低精度儘量使用低精度。

很明顯,該標準必須滿足不同細分市場的需求。能夠指定何時可以使用降低的精度值也是有利的。

A:將有3個精度可用,大致對應於float32,float16和int10。 片段着色器中的最高精度是可選的。

10.3 精度限定符

Q:是否應將精度指定爲float16,float24等? 這將有助於移植性。 它意味着不同的類型而不是提示。 它將要求所有實現使用相同或類似的算法,並縮小更新範圍。

A:不,精度不應指定格式。 標準化算術不是(圖像)的要求。

 

Q:整數有精度限定符嗎? 許多實現中整數被假設將映射到浮點硬件。 這隻允許10位整數用於mediump浮點數。

A:是的,整數具有精度限定符。 將指定整數的精度,以便可以使用相應的浮點精度來實現它們。

 

Q:如何定義整數的包裝行爲? 如果應用程序依賴於一個實現的包裝,則可能會導致可移植性問題。

選項:標準應指定包裝或截斷。

A:這應該是未定義的。 實施成本太高。 規範應明確規定不能依賴任何包裝或截斷行爲。

 

Q:頂點着色器中是否提供精度限定符?

A:是的。 它可能對某些實現很有用,並使語言保持一致。

 

Q:應該有默認精度嗎? 將默認頂點着色器精度指定爲當前指定的highp是有意義的。 關於片段着色器的默認精度應該是什麼沒有達成一致。

A:頂點着色器爲highp,片段着色器沒有默認精度。

 

Q:是否應該有一個與float32相當的精度? 桌面實現已經支持這一點。

A:保留superp以便可能包含在GLSL ES的未來版本中。

 

Q:如果不同的精度會產生不同的類型,例如 需要在它們之間進行顯式轉

選項1:不,它們只是提示。 但如果實現可以忽略它,暗示高精度是沒有意義的。

選項2:是的,它們是不同的類型。 但這引入了複雜性。

A:highp必須意味着至少使用高精度,對於mediump和lowp也是如此,因此精度限定符不僅僅是提示。就着色語言而言,由於它不會影響行爲,所以他們可以被視爲提示或具有隱式類型轉換的不同類型。在任何情況下,實現都可以自由地以高精度或更高精度計算所有內容。

 

Q:解析函數調用時是否應考慮精度?

A:不,它們應該更多的被視爲提示。 函數聲明不能基於精度重載。

 

Q:如何在表達式中傳播精度?

選項1:僅考慮操作的輸入。 對於沒有定義精度的操作數,精度的確定從表達式樹的葉節點開始,然後進入根,直到找到精度。如有必要,還應當考慮賦值中的左值。常量表達式必須是不變的,並且期望它們將在編譯時進行評估。因此,必須以目標支持的最高精度(lowp或highp)或更高精度對它們進行評估。

選項2:始終考慮表達式的目標。 編譯器應該能夠解決如何避免丟失精度。

A:選項1.這使開發人員可以更輕鬆地指定複雜表達式中使用的精度。

 

Q:如果表達式中沒有精度怎麼辦?

選項1:將其保留爲未定義。

選項2:使用默認精度。

A:使用默認精度。 如果未定義(在片段着色器中),則會報錯。

 

Q:統一變量的精度限定符需要匹配嗎?

選項1:是的。

    統一變量被定義爲在頂點和片段處理器中使用相同的存儲,並且可以以這種方式實現。

    如果在頂點和片段着色器中都使用了統一變量,那麼如果精度不同,應該警告開發人員。 (一些高端的芯片有做處理,及時兩邊的着色器沒有使用同樣的精度限定符,也不會報錯,但是低端的芯片就會報錯,所以最好是申明成一樣的以便適配)

    精確度的轉換絕不應該是隱含的。

選項2:不。

    兩個着色器都可以使用統一變量,但兩者都可能沒有相同的精度,因此有理由允許它們不同。

    在頂點和片段着色器中使用相同的均勻將始終要求在頂點着色器中指定精度(因爲默認精度爲highp)。 這對開發人員來說是不必要的負擔。

A:是的,制服的精確限定符必須匹配。

 

Q:易變變量的精確限定符是否需要匹配?

選項1:是的。易變變量由頂點着色器寫入並由片段着色器讀取,因此不存在精度不同的情況。

選項2:不,頂點着色器寫入的變化不應被視爲與片段着色器讀取的變量相同(可能沒有共享存儲)。因此,可以指定它們具有不同的精度。

A:易變變量的精度限定符不需要匹配。

 

Q:片段着色器中的highp是擴展還是選項? 是否需要使用#extension啓用?

如果着色器可移植性存在問題,可以在着色器中使用宏來選擇高精度或中等精度。 要求使用#extension似乎是不必要的。

A:片段着色器highp是一個選項,不由#extension來啓用。

 

lowp int

規範聲明應使用等效浮點精度表示整數值。lowp float的範圍爲+/- 2.0,而lowp int的範圍爲+/- 256。如果需要將lowp float轉換爲lowp int,則會出現問題。直接轉換,即lowp int = int(lowp float)在轉換之前幾乎失去所有精度和乘法,例如 lowp int = int(lowp float * 256)導致溢出,因此導致未定義的結果。保持精度的唯一方法是首先轉換爲mediump浮點數

選項1:保持此行爲。 接受將lowp float轉換爲low int會失去精度,因此無用。

選項2:通過將其範圍設置爲+/-1使lowp int與mediump和highp int一致。

選項3:重新定義lowp float到lowp int的轉換以包括8位左移。 然後,lowp int到lowp float的轉換包含一個8位右移。

選項4:選項1,但添加內置函數以在兩種格式之間進行轉換。

選項5:將lowp float重新定義爲真正的浮點格式。 然後它將等效於具有10位尾數和3位無符號指數的浮點值。

解決:選項1轉換將失去大部分精度。

 

內置紋理功能的精確度。

Q:大多數內置函數都採用單個參數,返回值的精度與參數的精度相同是合理的。紋理函數採用採樣器和座標參數。返回值應完全獨立於座標的精度。 那麼如何指定返回值的精度?

A:允許採樣器類型採用精度限定符。 紋理函數的返回值與sampler參數的精度具有相同的精度。

 

Q:採樣器類型的默認精度應該是多少?

A:所有采樣器類型的默認精度應爲lowp

 

版權:https://blog.csdn.net/flycatdeng/article/details/88146590

Android,OpenGL ES,圖形學
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章