2017-03-03 53 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))) { ... }