gpt4 book ai didi

opengl-es - WebGL 片段着色器在 if 语句上没有正确分支

转载 作者:行者123 更新时间:2023-12-04 08:55:34 25 4
gpt4 key购买 nike

我正在开发一个实现阴影映射的 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
);
}

Shadows not being correctly computed, branch never taken

哪里 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);
}

Shadowed fragments correctly computed and drawn as red and green

使阴影区域以红色正确绘制,而未阴影区域以绿色绘制。也就是说,分支被正确评估。用这个替换它:
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
);

Lighting computed without shadows

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

此外,我尝试以多种方式应用照明,包括使用 clamp功能;总是做加法并使用三元运算符乘以第二个 calcLighting按 1 或 0 调用,并以不同的方式排列我的 if 语句。似乎没有任何效果。

关于分支在 webgl 中的工作方式,我有什么遗漏吗?

最佳答案

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

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

关于opengl-es - WebGL 片段着色器在 if 语句上没有正确分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20220361/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com