2016-11-18 85 views
0

這裏是我的整個片段着色器的代碼,這是相當簡單:OpenGL ES 2.0的着色器浮點數據精度

precision highp float; 

void main(void) 
{ 
    float a = 66061311.0; 
    if(a == 66061312.0) 
    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); 
    else 
    gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0); 
} 

爲什麼畫面清晰紅色。 當我將a設置爲66061315.0時,屏幕顯示爲綠色。 讓我困惑。根據我的理解,66061311.0在float類型的範圍內。

我該如何解決或解決這個問題?

+0

首先,不要將代碼作爲圖像發佈。只需將其正確插入到您的問題中。其次,我們不知道「顏色」組件的價值。其次,我們不知道你的浮動是以什麼精度宣佈的。如果你選擇'precision mediump float',那麼你可表示的整數範圍是最小的[[-2^15,2^15 -1]],這當然小於你的左手操作數。 – thokra

+0

對不起,我修改了這個問題。我使用highp精度。但結果仍然和以前一樣。我在帶有ARM Mali GPU的PC和Android手機上試過,結果是一樣的。 –

回答

1

即使該值在該類型的範圍內,也並不意味着它的精度足夠精確,在這樣大的值處看到兩者之間的差異。

在你的情況爲標準的32位float結果是:

66061311.0 = 6.60613e+07 
66061312.0 = 6.60613e+07 

而且比較時的價值是相同的。這與openGL和着色器沒有關係或綁定,它是如何定義的。 64位float將檢測到一個區別。

要添加更多信息,如果您檢查definition of a floating value,您將會看到該分數只有23位,這意味着該分辨率高達8.4M,但您已超過66M。