2011-03-20 109 views
42

是否將填充值的變量指示您在等號右側使用的精度?在OpenGL ES 2.0/GLSL中,您需要哪些精度說明符?

例如,有沒有什麼區別,意義,對精度說明這裏:

gl_FragColor = lowp vec4(1); 

再舉一例:

lowp float floaty = 1. * 2.; 
floaty = lowp 1. * lowp 2.; 

如果你需要一些彩車,並創建一個矢量或矩陣,那麼該向量或矩陣是否會呈現出與其相關的值的精度,還是這些值會轉換爲另一個精度級別?

我覺得這個優化將最好的回答這個問題:

dot(gl_LightSource[0].position.xyz, gl_NormalMatrix * gl_Normal) 

我的意思是,它需要走這麼遠,如果你想讓它儘可能快,或者是它的一些沒用?

lowp dot(lowp gl_LightSource[0].position.xyz, lowp gl_NormalMatrix * lowp gl_Normal) 

我知道你可以定義float的默認精度,並且這個假設是用於向量和矩陣之後。承擔教育的目的,我們有這個以前定義:

precision highp float; 

回答

60
  1. 你不需要在常量/文字精度說明,因爲這些獲得編譯評估,不管他們被分配到的時間。而且,由於gl_FragColor的精度已經根據渲染目標的深度定義,所以分配給它的精度應該沒有關係。

  2. 在頂點着色器,下面的精度默認情況下宣佈:(4.5.3 Default Precision Qualifiers

    precision highp float; 
    precision highp int; 
    precision lowp sampler2D; 
    precision lowp samplerCube; 
    

    而在片段着色你:

    precision mediump int; 
    precision lowp sampler2D; 
    precision lowp samplerCube; 
    

    這意味着,如果你聲明的浮動一個片段着色器,你必須說明它是否是lowpmediump。精度的默認值也擴展到矩陣/向量。

  3. highp僅在具有GL_FRAGMENT_PRECISION_HIGH宏定義爲1的系統上受支持;其餘的你會得到一個編譯器錯誤。 (4.5.4 Available Precision Qualifiers

  4. 表達式中的精度規則是它們會自動轉換爲它們綁定到的賦值/參數的類型。所以對於你的點,默認情況下它會使用輸入類型的精度,並且額外的lowp是不必要的(在語法上不正確)。如果要將類型向下舍入爲較低的精度,則唯一的方法是將其明確指定爲較低的精度。

這些答案都來自Khronos GLSL規範,你可以在這裏找到(相關部分是4.5.2和4.5。3):http://www.khronos.org/registry/gles/specs/2.0/GLSL_ES_Specification_1.0.17.pdf

+5

「此外,由於gl_FragColor的精度已經根據渲染目標的深度定義」這個語句的來源是什麼?我在規範中沒有看到關於此的任何信息。 – eodabash 2013-02-01 10:10:38