JWW*_*ker 1 opengl glsl fragment-shader
根据我过去的经验,对 的支持gl_FrontFacing参差不齐。有时它只是失败,有时它会导致回退到软件渲染。所以我尝试使用GL_VERTEX_PROGRAM_TWO_SIDE,设置不同的正面和背面二次色,并测试二次色。但我发现至少在一张 ATI 卡上,这种方法会导致编译着色器的间歇性失败。那么,谁能想到任何其他技术来判断片段是否面向前方?
顺便说一句,有些人似乎不相信这gl_FrontFacing会失败,所以我在 opengl.org 论坛和 Apple 的 OpenGL 邮件列表上进行了一些搜索。我gl_FrontFacing在各种显卡上发现了十多处关于以某种方式失败的提及,有些来自 ATI,有些来自 NVidia。这些提及大多来自 2009 年或更早。所以如果我可以假设我所有的用户都拥有过去 5 年制造的机器,我可能会没事。但我不认为我可以假设。
由于视图空间中的位置也是远离相机的方向,以下表达式似乎是 gl_FrontFacing 的很好近似:
dot (normal, position) < 0.0
Run Code Online (Sandbox Code Playgroud)
这仍然会给您带来边缘周围的小瑕疵,但不如@datenwolf 解决方案严重。有关详细讨论,请参阅我的博客文章:)
更新:如果您愿意使用 WebGL 扩展,甚至可以进行更好的测试。在那里你可以计算面部法线估计,它适用于正面和背面,因此,在这个可能是像素完美的着色器中用我们的顶点法线结果测试它的点积:
#extension GL_OES_standard_derivatives : enable
vec3 fdx = dFdx(position);
vec3 fdy = dFdy(position);
vec3 faceNormal = normalize(cross(fdx,fdy));
if (dot (normal, faceNormal) > 0.0) {
// gl_FrontFacing is almost certainly true
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3510 次 |
| 最近记录: |