2017-03-03 142 views
0

三星Galaxy Note 4設備上運行我們的GLSL(300多個)着色器程序,當我遇到一些很奇怪的視覺錯誤。它有一個Quallcom Adreno(TM)420 gpu,支持GLES2.0和GLES3.0。我們有非常複雜的着色器程序,我們使用它來渲染效果,如BRDF,陰影貼圖等。GLSL程序錯誤執行

上述設備根本不呈現陰影(直到我們在代碼中找到引起它的位置, )。還有燈光陰影行爲是錯誤的。 同樣的程序在以下硬件做工精細: PC(PowerVR的GLES仿真器),iOS設備(6-7),三星Galaxy A7,三星Galaxy S6,魅族M5,小蜜4A,摩托羅拉的Nexus 6

在的情況下,陰影,我們有這個塊的代碼:

bool InRange(float val) 
{ 
    return val >= 0.0 && val <= 1.0; 
} 

float shadowFunc (sampler2D shadowMap, vec4 lightClipPosition, float bias) 

{ 
    vec3 shadowMapCoords = lightClipPosition.xyz/lightClipPosition.w; 
    shadowMapCoords = (shadowMapCoords + 1.0)/2.0; 
    //...some more code 
    if (!InRange (shadowMapCoords.z) 
    || !InRange (shadowMapCoords.x) 
    || !InRange (shadowMapCoords.y)) 
    return 1.0; 
    //...some more code 
} 

在以利用3調用if()語句來

INRANGE()

方法導致陰影根本不顯示。改變爲

if ((shadowMapCoords.x < 0.0 || shadowMapCoords.x > 1.0 || shadowMapCoords.y < 0.0 || shadowMapCoords.y > 1.0 || shadowMapCoords.z < 0.0 || shadowMapCoords.z > 1.0)) 
{ 
    return 1.0;  
} 

修正了它。

需要注意的,也有在着色器編譯或在運行時沒有錯誤。

現在我不知道,這是一種規則由GLSL編譯器或由司機決定的?在着色器體中對函數執行的數量是否有任何限制?我完全知道我的着色器使用了很多函數調用。 (尚未進入優化階段)。但所有這些着色器在我測試過的所有其他手機上運行良好。這就是爲什麼我不確定真正的問題在我的代碼中。

我一定要聯所有着色器中進入着色器的「主」函數來獲取我們所有的東西在此設備上正常工作的方法是什麼?

或者它可能只是驅動程序錯誤?

回答

0

是的,這看起來像一個直接的驅動程序錯誤;它應該可以正常工作。

儘管如此,請不要寫這樣的代碼......這讓着色器核心與分支的體積哭泣。

理想只是夾緊你的價值觀是0和1之間,運行着色器;如果你正確設計算法邊界條件,它可能會看起來不錯,並且通常只運行陰影代碼將比早期的更便宜。

如果你真的必須使用條件代碼,嘗試使用矢量內置的功能,它們通常由硬件支持幫助:

if (any(greaterThan(shadowMapCoords, 1.0)) || any(lessThan(shadowMapCoords, 0.0))) { ... }