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

文章推薦指數: 80 %
投票人數:10人

根据我过去的经验,对的支持 gl_FrontFacing 参差不齐。

有时它只是失败,有时它会导致回退到软件渲染。

所以我尝试使用 GL_VERTEX_PROGRAM_TWO_SIDE ... 在片段着色器中是否有可靠的gl_FrontFacing替代方案? JWWalker 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年制造的机器,我可能会没事。

但我不认为我可以假设。

makc.. 5 由于视图空间中的位置也是远离相机的方向,以下表达式似乎是gl_FrontFacing的很好近似: dot(normal,position)<0.0 这仍然会给您带来边缘周围的小瑕疵,但不如@datenwolf解决方案严重。

有关详细讨论,请参阅我的博客文章:) 更新:如果您愿意使用WebGL扩展,甚至可以进行更好的测试。

在那里你可以计算面部法线估计,它适用于正面和背面,因此,在这个可能是像素完美的着色器中用我们的顶点法线结果测试它的点积: #extensionGL_OES_standard_derivatives:enable vec3fdx=dFdx(position); vec3fdy=dFdy(position); vec3faceNormal=normalize(cross(fdx,fdy)); if(dot(normal,faceNormal)>0.0){ //gl_FrontFacingisalmostcertainlytrue } 归档时间: 7 年,11 月前 查看次数: 3510次 最近记录: 3 年,4 月前 相关链接 写入gl_FragColor会导致Android上出现INVALID_OPERATION2 更多相关链接 相关归档 GL_QUADS有什么不好的?63 如何在片段着色器中获取像素信息?26 如何在OpenGL中为3d模型(网格)设置动画?13 使用像素缓冲对象(PBO)从帧缓冲对象(FBO)读取像素值12 OpenGL纹理ID的范围是多少?12 在opengl中围绕固定点旋转对象11 C++/openGL:使用四元数将QUAD旋转到一个点10 如何确定GLSLES中纹理的偶数/奇数线4 GLSL:启用/禁用纹理+着色器3 混合如何与WebGL中的GLSLES片段着色器一起使用?3 难疑归档 @staticmethod和@classmethod有什么区别?3360 迭代字典的最佳方法是什么?2455 比较Git中的两个分支?2149 获取屏幕大小,当前网页和浏览器窗口1927 如何为"选择"框创建占位符?1426 从JSON文件中解析值?1400 如何使用jQuery按名称选择元素?1160 如何在同一分支上的两个不同提交之间区分相同的文件?1077 "静态"在C中意味着什么?1062 JavaScript中的(内置)方式,用于检查字符串是否为有效数字1051



請為這篇文章評分?