在片段着色器中是否有可靠的gl_FrontFacing替代方法?

时间:2014-06-23 21:51:30

标签: opengl glsl fragment-shader

根据我过去的经验,对gl_FrontFacing的支持一直不稳定。有时它只会失败,有时它会导致软件渲染的后退。所以我尝试使用GL_VERTEX_PROGRAM_TWO_SIDE,设置不同的前后二色,并测试二次色。但我发现在至少一张ATI卡上,这种方法导致编译着色器的间歇性失败。那么,任何人都可以想到任何其他技术来判断片段是否面向前方吗?

顺便说一下,有些人似乎并不相信gl_FrontFacing可能会失败,所以我在opengl.org论坛和Apple的OpenGL邮件列表上进行了一些搜索。我发现有十几个gl_FrontFacing以某种方式在各种卡片上失败,一些来自ATI,一些来自NVidia。这些提及大部分来自2009年或更早。因此,如果我可以假设我的所有用户都拥有过去5年制造的机器,那么我可能会好的。但我不认为我可以这么认为。

2 个答案:

答案 0 :(得分:3)

由于视图空间中的位置也是远离相机的方向,因此下面的表达式似乎是gl_FrontFacing的非常好的近似值:

dot (normal, position) < 0.0

这仍然可以让你在边缘附近产生轻微的瑕疵,但不如@datenwolf解决方案那么严重。有关详细讨论,请参阅my blog post:)

更新:如果您愿意使用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
}

答案 1 :(得分:1)

将变换后的面法线(插值顶点法线)传递给片段着色器并测试z分量的符号。是的,我知道这与基于绕线的前/后脸测试不是一回事,但足够接近。