Android GLSL程序执行错误

Android GLSL程序执行错误,android,opengl-es,glsl,Android,Opengl Es,Glsl,在三星Galaxy Note 4设备上运行GLSL(300 es)着色器程序时,我遇到了一些非常奇怪的视觉错误。它有一个Quallcom Adreno(TM)420 gpu,支持GLES2.0和GLES3.0。我们有相当复杂的着色器程序,我们使用它来渲染效果,如BRDF、阴影贴图等 上面提到的设备根本不显示阴影(直到我们在代码中找到导致阴影的位置,请参阅进一步内容)。此外,灯光着色行为也是错误的。 同样的程序在以下硬件上工作正常: PC(PowerVR GLES模拟器)、iOS(6-7)、三星G

在三星Galaxy Note 4设备上运行GLSL(300 es)着色器程序时,我遇到了一些非常奇怪的视觉错误。它有一个Quallcom Adreno(TM)420 gpu,支持GLES2.0和GLES3.0。我们有相当复杂的着色器程序,我们使用它来渲染效果,如BRDF、阴影贴图等

上面提到的设备根本不显示阴影(直到我们在代码中找到导致阴影的位置,请参阅进一步内容)。此外,灯光着色行为也是错误的。 同样的程序在以下硬件上工作正常: 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
}
bool InRange(浮点值)
{
返回val>=0.0&&val 1.0 | | | | shadowMapCoords.y<0.0 | | | shadowMapCoords.y>1.0 | | shadowMapCoords.z<0.0 | | | shadowMapCoords.z>1.0))
{
返回1.0;
}
修好了

重要的是要注意,着色器编译期间或运行时期间没有错误

现在我想知道,这是GLSL编译器还是驱动程序规定的规则?着色器体中的函数执行量是否有任何限制?我完全知道我的着色器使用了相当多的函数调用。(尚未进入优化阶段).但所有这些着色器在我测试的所有其他手机上都运行良好。这就是为什么我不确定真正的问题在我的代码中

我是否必须将着色器中找到的所有方法内联到着色器的“main”函数中,才能使我们的所有内容在此设备上正常工作


或者可能只是驱动程序错误?

是的,这看起来像是一个直接的驱动程序错误;它应该可以正常工作

也就是说,请不要编写这样的代码…它会让着色器核心随着分支的数量而哭泣

理想情况下,只需将值钳制在0和1之间,然后运行着色器;如果正确设计算法边界条件,它可能看起来是正常的,而且通常只运行阴影代码比早期运行的代码更便宜

如果确实必须使用条件代码,请尝试使用向量内置函数,它们通常由硬件辅助支持:

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