三星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编译器或由司机决定的?在着色器体中对函数执行的数量是否有任何限制?我完全知道我的着色器使用了很多函数调用。 (尚未进入优化阶段)。但所有这些着色器在我测试过的所有其他手机上运行良好。这就是为什么我不确定真正的问题在我的代码中。
我一定要联所有着色器中进入着色器的“主”函数来获取我们所有的东西在此设备上正常工作的方法是什么?
或者它可能只是驱动程序错误?