WebGL片段着色器未在if语句上正确分支

Coo*_*kyt 9 shader opengl-es glsl webgl

我正在开发一个实现阴影贴图的WebGL程序.在计算每个片段的深度值之后,我在末尾有一个if语句,它根据片段是否在阴影中来计算光照.

gl_FragColor = vec4(calcLighting(light0, eye_dir, eye_dir_norm, normal), 1);
if (light_tex_coord.z - depth <= 0.0) {
  gl_FragColor += vec4
      ( calcLighting(light1, eye_dir, eye_dir_norm, normal)
      , 0.0
      );
}
Run Code Online (Sandbox Code Playgroud)

阴影未正确计算,分支从未被采用

depth阴影贴图的深度在哪里,light_tex_coord是片段在场景空间中的位置light1.light1是一个围绕模型旋转的点光源,light0是一个静态定位在相机上的点光源.

这里的问题是从不采用if分支,因此场景只light0应用于它.我检查了depth,light_tex_coordcalculateLighting正常工作.

不过,这是奇怪的事情,用以下代码替换上面的内容:

if (light_tex_coord.z - depth <= 0.0) {
  gl_FragColor = vec4(0,1,0,1);
} else {
  gl_FragColor = vec4(1,0,0,1);
}
Run Code Online (Sandbox Code Playgroud)

阴影碎片正确计算并绘制为红色和绿色

使阴影区域正确绘制为红色,并且无阴影区域以绿色绘制.也就是说,正确评估分支.用这个替换它:

gl_FragColor = vec4(calcLighting(light0, eye_dir, eye_dir_norm, normal), 1);
gl_FragColor += vec4
    ( calcLighting(light1, eye_dir, eye_dir_norm, normal)
    , 0.0
    );
Run Code Online (Sandbox Code Playgroud)

照明计算没有阴影

导致正确计算光照(尽管没有阴影).似乎当我在if语句中调用更昂贵的calcLighting函数时,它甚至不打扰它.

此外,我尝试过以多种方式应用照明,包括使用该clamp功能; 总是做加法并使用一个三元运算符将第二个calcLighting调用乘以1或0,并以不同的方式排列我的if语句.似乎没什么用.

关于分支在webgl中是如何工作的,我有什么遗漏吗?

Mar*_*nck 0

也许 WebGl 上下文不支持深度。那么使用它的表达式将被忽略。

您可以使用 getContextAttributes() 检查这一点