根据我过去的经验,对gl_FrontFacing
的支持一直不稳定。有时它只会失败,有时它会导致软件渲染的后退。所以我尝试使用GL_VERTEX_PROGRAM_TWO_SIDE
,设置不同的前后二色,并测试二次色。但我发现在至少一张ATI卡上,这种方法导致编译着色器的间歇性失败。那么,任何人都可以想到任何其他技术来判断片段是否面向前方吗?
顺便说一下,有些人似乎并不相信gl_FrontFacing
可能会失败,所以我在opengl.org论坛和Apple的OpenGL邮件列表上进行了一些搜索。我发现有十几个gl_FrontFacing
以某种方式在各种卡片上失败,一些来自ATI,一些来自NVidia。这些提及大部分来自2009年或更早。因此,如果我可以假设我的所有用户都拥有过去5年制造的机器,那么我可能会好的。但我不认为我可以这么认为。
答案 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分量的符号。是的,我知道这与基于绕线的前/后脸测试不是一回事,但足够接近。