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

目錄

10.30 運算符精度

10.31 編譯器轉換

10.32 在預處理器中擴展類函數宏

10.33 擴展宏是否應在全局範圍內定義?


10.30 運算符精度

是否應該定義add和multiply等操作的精度?

這些不是由C ++標準定義的,但通常假設C ++實現將使用IEEE 754算法。對於通常僅支持IEEE 754的子集的GPU而言,情況並非如此。此外,諸如超越函數的許多操作被認爲太昂貴而不能以超過10個有效精度位實現。除法通常通過倒數和乘法來實現。在整數除法的情況下,這可能導致非明顯的錯誤。例如:

9/3 = 9.0 *(1.0 / 3.0)= 9.0 * 0.333 = 2.997 = 2(整數)

A:鑑於當前實施的範圍很廣,標準化這些精度是不可行的。 因此,操作的精確性取決於實現。

 

10.31 編譯器轉換

應該允許哪些編譯器轉換?

C ++禁止編譯器轉換表達式來改變最終結果。 (請注意,C ++允許使用比指定更高的精度,但這是一個不同的問題。)GPU通常使用此類.例如,在將順序代碼映射到基於矢量的體系結構時進行轉換。

A:允許一組指定的轉換(除了C ++允許的轉換)

 

10.32 在預處理器中擴展類函數宏

擴展宏時,每個宏只能應用於原始token或從該token生成的任何token。 爲了實現這一點,類功能宏的擴展需要爲每個token保留一個應用宏列表。這是一個很大的開銷。

A:遵循C ++規範。

 

如果在擴展類函數宏期間遇到指令,那麼行爲應該是什麼?

雖然有幾個編譯器實現了預期的行爲,但目前在C ++中將其指定爲未定義。

A:當做是未定義的行爲。

 

10.33 擴展宏是否應在全局範圍內定義?

對於每個擴展,都有一個關聯的宏,着色器可以使用它來確定擴展是否可用於給定的實現。 該宏是全局定義還是應該在(成功)啓用擴展時定義?

這兩種選擇都是可用的,因爲嘗試啓用未實現的擴展只會導致警告。

選項1:全局定義

#ifdef GL_OES_standard_derivatives
 #extension GL_OES_standard_derivatives : enable
 ...
#endif

選項2:定義爲#extension的一部分

#extension GL_OES_standard_derivatives : enable // warning if not available
#ifdef GL_OES_standard_derivatives
 ...
#endif

A:宏是全局定義的。

 

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

 

 

 

 

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