三星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編譯器或由司機決定的?在着色器體中對函數執行的數量是否有任何限制?我完全知道我的着色器使用了很多函數調用。 (尚未進入優化階段)。但所有這些着色器在我測試過的所有其他手機上運行良好。這就是爲什麼我不確定真正的問題在我的代碼中。
我一定要聯所有着色器中進入着色器的「主」函數來獲取我們所有的東西在此設備上正常工作的方法是什麼?
或者它可能只是驅動程序錯誤?