Opengl 片段着色器中是否有可靠的gl_前向替代方案?

Opengl 片段着色器中是否有可靠的gl_前向替代方案?,opengl,glsl,fragment-shader,Opengl,Glsl,Fragment Shader,根据我过去的经验,对gl_FrontFacing的支持一直不稳定。有时它只是失败,有时它会导致软件渲染的回退。因此,我尝试使用GL\u VERTEX\u PROGRAM\u TWO\u SIDE,设置不同的正面和背面次颜色,并测试次颜色。但我发现,在至少一个ATI卡上,这种方法导致编译着色器时出现间歇性故障。那么,有没有人能想出其他方法来判断碎片是否朝前 顺便说一下,有些人似乎不相信gl_frontface会失败,所以我在opengl.org论坛和苹果的opengl邮件列表上做了一些搜索。我在各

根据我过去的经验,对
gl_FrontFacing
的支持一直不稳定。有时它只是失败,有时它会导致软件渲染的回退。因此,我尝试使用
GL\u VERTEX\u PROGRAM\u TWO\u SIDE
,设置不同的正面和背面次颜色,并测试次颜色。但我发现,在至少一个ATI卡上,这种方法导致编译着色器时出现间歇性故障。那么,有没有人能想出其他方法来判断碎片是否朝前


顺便说一下,有些人似乎不相信
gl_frontface
会失败,所以我在opengl.org论坛和苹果的opengl邮件列表上做了一些搜索。我在各种各样的卡上发现了十几条关于
gl_FrontFacing
失败的信息,有些是ATI的,有些是NVidia的。这些提及大多来自2009年或更早。所以,如果我能假设我所有的用户都有过去5年制造的机器,我可能就没事了。但我不认为我可以这样假设。

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

将变换后的面法线(插值顶点法线)传递给片段着色器,并测试z组件的符号。是的,我知道这与基于缠绕的正面/背面测试并不完全相同,但距离足够近。

由于视图空间中的位置也是远离摄影机的方向,以下表达式似乎非常接近gl_正面:

dot (normal, position) < 0.0

由于视图空间中的位置也是远离摄影机的方向,以下表达式似乎非常接近gl_正面:

dot (normal, position) < 0.0

这离我的目的还不够近。我试过了,在边缘处发现了令人不快的伪影,从接近边缘的三角形到相机,距离不够近。我试过了,在边缘周围发现了令人不快的伪影,从接近边缘的三角形到相机。你是说
gl_FrontFacing
,对吗?我从来没有见过
gl_FrontFace
。你在什么平台上遇到问题?@RetoKoradi:谢谢你的拼写更正。双面着色的问题出现在Windows上,我认为,
gl_FrontFacing
问题可能出现在Mac上。如何支持这一点?光栅化器绝对必须知道它是填充前向多边形还是后向多边形,它所要做的就是将此状态传递到片段着色器。也许您只是没有在着色器中正确处理
bool
数据类型?但是,不推荐使用原色和副色-对它们的支持肯定会参差不齐。考虑插入自己的输出变量。@安东尼科尔曼,“插入你自己的输出变量”是什么意思?什么样的插值会告诉我碎片是否是正面的?没有,
gl_FrontFacing
告诉你这一点。但不要使用
gl_FrontColor
gl_BackColor
使用自定义输出。事实上,我在另一封信中解释了这一切。在答案的最后,甚至还有一个片段着色器,它能完全满足你的需要。你是说
gl_frontface
,对吗?我从来没有见过
gl_FrontFace
。你在什么平台上遇到问题?@RetoKoradi:谢谢你的拼写更正。双面着色的问题出现在Windows上,我认为,
gl_FrontFacing
问题可能出现在Mac上。如何支持这一点?光栅化器绝对必须知道它是填充前向多边形还是后向多边形,它所要做的就是将此状态传递到片段着色器。也许您只是没有在着色器中正确处理
bool
数据类型?但是,不推荐使用原色和副色-对它们的支持肯定会参差不齐。考虑插入自己的输出变量。@安东尼科尔曼,“插入你自己的输出变量”是什么意思?什么样的插值会告诉我碎片是否是正面的?没有,
gl_FrontFacing
告诉你这一点。但不要使用
gl_FrontColor
gl_BackColor
使用自定义输出。事实上,我在另一封信中解释了这一切。在答案的最后,甚至还有一个片段着色器可以完全满足您的需求;从1.10版开始,派生函数一直是OpenGL着色语言的一部分。但不管怎样,这就是我最终要做的。来自这里的webgl背景。完全没有回答关于opengl的问题。我不知道你为什么说它是一个WebGL扩展;从1.10版开始,派生函数一直是OpenGL着色语言的一部分。但不管怎样,这就是我最终要做的。来自这里的webgl背景。完全忽略了关于opengl的问题。