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_coord和calculateLighting正常工作.
不过,这是奇怪的事情,用以下代码替换上面的内容:
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中是如何工作的,我有什么遗漏吗?
| 归档时间: |
|
| 查看次数: |
2252 次 |
| 最近记录: |