OpenGL:背面剔除

当3D模型完全"闭合"时,意味着内部永远不可见,那么外表面的那些与观察者背离且呈一定角度的部分将始终被始终被统一模型的其他部分遮挡。也就是说,那些背离观察者的三角形不可能被看到(无论如何它们都会在HSR的过程中被覆盖),因此没有理由栅格化或渲染它们。

可以使用如下命令来启用和禁止背面剔除。默认情况下,背面剔除是关闭的,如果希望OpenGL剔除背面三角形,必须手动启用它。

/*让OpenGL"剔除"(不渲染)背向的三角形*/
glEnable(GL_CULL_FACE)
/*禁用背面剔除*/
glDisable(GL_CULL_FACE)

当启用背面剔除时,默认情况下三角形只有朝前时才会被渲染。此外,默认情况下,从OpenGL相机的角度看,如果三角形的3个顶点式以逆时针顺序排列(基于它们在缓冲区中定义的顺序),则三角形被视为朝前;顶点沿顺时针方向排列的三角形是朝后的,不会被渲染。

这种定义"前向"的顶点顺序有时被称为缠绕顺序。可以使用glFrontFace来设置顶点的缠绕顺位为逆时针或者顺时针方向。在使用背面剔除时,正确设置缠绕顺序非常重要。

/*显式设置缠绕顺序为逆时针方向(默认就是这个方向)*/
glFrontFace(GL_CCW)
/"显式设置缠绕顺序为顺时针方向"/
glFrontFace(GL_CW)

类似地,也可显式地设置是否渲染前向和背向的三角形

/*指定背向的三角形被剔除*/
glCullFace(GL_BACK)
/*指定前向的三角形被剔除*/
glCullFace(GL_FRONT)
/*指定所有的三角形都被剔除*/
glCullFace(GL_FRONT_AND_BACK)

3D模型通常被设计成外表面由相同缠绕顺序的三角形构成。如果启用剔除,则默认情况下模型的外部面向相机的表面部分会被渲染,因为默认情况下OpenGL假定的缠绕顺序是逆时针方向;如果模型设计缠绕顺序为顺时针方向,那么如果启用了背面剔除,需要在程序中调用gl_FrontFace(GL_CW)来解决剔除部分不正确的问题。

这里需要注意,在使用GL_TRIANGLE_STRIP类型图元的情况下,每个三角形的缠绕顺序不停地互换。OpenGL通过在连续构建三角形时不断"颠倒"顶点顺序来补偿这一点。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部