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

目錄

10.25 動態索引

10.26 紋理單元的最大數量

10.27 目標錯誤報告

10.28 整數出發的舍入

10.29 未定義的返回值


10.25 動態索引

某些實現不直接支持數組,向量和矩陣的動態索引。

程序轉換時是可以的,但性能會降低。

是否應該從規範中刪除數組的動態索引?

A:保持統一變量的動態索引(用於蒙皮)。 刪除臨時(在限制部分)。

 

是否應從規範中刪除向量和矩陣的動態索引?

A:保留在主要規範中。 支持不是強制性的。

 

10.26 紋理單元的最大數量

片段着色器中必須支持的最小紋理單元數目爲2,由gl_MaxTextureImageUnits = 2定義。這對於ES 2.0來說太低了嗎?

選項1:是的,紋理單元的數量是片段着色器的限制因素。 從ES 1.0到ES 1.1,紋理單元的數量從1增加到2,因此ES 2.0應該加倍(即4)。

選項2:增加到8。

A:增加到8。

 

10.27 目標錯誤報告

是否應該要求編譯器在編譯時報告任何錯誤,或者可以將錯誤推遲到鏈接時間?

A:如果無法編譯程序,則只需要向目標編譯器報告發生了錯誤。可能在編譯時或鏈接時或兩者都報告此錯誤。開發系統必須在編譯時生成語法錯誤。

 

10.28 整數出發的舍入

是否應爲整數除法指定舍入模式?

除法的舍入模式與餘數運算符的定義有關。大多數語言中的重要關係(但在此版本的GLSL ES中無關)是:

(a / b)* b + a%b = a(a和b是整數)

通常,餘數運算符被定義爲具有與被除數相同的符號,這意味着除數必須向零舍入。(注意,mod函數與餘數函數不同。mod被定義爲與除數具有相同的符號)。

由於餘數運算符不是GLSL ES 1.00的一部分,因此不必指定舍入模式。

A:對於此版本的規範,未定義舍入模式。

 

10.29 未定義的返回值

如果使用非void返回類型聲明函數,則定義中的任何return語句都必須指定返回表達式,其類型與返回類型匹配。但是,如果函數返回而未執行return語句,則行爲爲未定義的。編譯器是否應該嘗試檢查這些情況並將其報告爲錯誤?

例如:

int f()
{
 // no return statement
}
...
int a = f();

選項1:將未定義的值返回給調用者。 沒有生成錯誤。 這是大多數c ++編譯器在實踐中所做的事情(儘管c ++標準實際上指定了“未定義的行爲”)。

選項2:在返回值的所有函數定義的末尾必須有一個return語句。

不,這需要添加可能無法執行的語句。

選項3:只有在執行到達函數末尾時才需要函數定義末尾的return語句:

例如:

int f(bool b)
{
 if (b)
 return 1;
 else
 return 0;
 // 沒錯。 執行永遠不會到達函數的末尾,因此永遠不會執行隱式return語句。
}

在存在循環的情況下,這變得不可能確定。

選項4:通過函數定義的所有有限靜態路徑必須以return語句結束。如果可以獨立控制代碼中的每個分支,則靜態路徑是可能採用的路徑。

A:選項1:該函數返回一個未定義的值(不會報錯)

 

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

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