glFrontFace惹得祸

先介绍下glFrontFace,

glFrontFace()是opengl的初级命令,有两个基本作用,一是可以用来用在某些特殊场合(比如剔除面片),二是可以提高渲染效率。

void glFrontFace(GLenum mode);

作用是控制多边形的正面是如何决定的。在默认情况下,mode是GL_CCW。

mode的值为:

GL_CCW 表示窗口坐标上投影多边形的顶点顺序为逆时针方向的表面为正面。

GL_CW    表示窗口坐标上投影多边形的顶点顺序为顺时针方向的表面为正面。

顶点的方向又称为环绕。

这个看起来也是很简单,平时也不会在意,基本网上copy最简单的代码直接使用。最近在应用中碰到添加了一个控件,绘制完成导致另外一个控件不显示了,百思不得其解。后来发现了下面这段代码:

    glFrontFace(GL_CW);
    glCullFace(GL_BACK);
    glEnable(GL_CULL_FACE);

原来是这段代码导致了后面设置背面剪裁的都不显示了。

glFrontFace默认是“逆时针为正”,即传入参数GL_CCW,通常情况下,想要剔除背面直接调用glEnable(GL_CULL_FACE)就可以了,OPENGL状态机会自动按照默认值进行CULL_FACE,默认是glFrontFace(GL_CCW),glCullFace(GL_BACK)。这段代码反其道而行之,设置“顺时针为正”,在设置之后也没有重新设置回来,所以导致了后面一些诡异的问题。因为opengl是一个巨大的状态机,如果你设置了一个标志位后面没有修改,那就会一直保持。正确的做法是在修改状态的时候,先读取当前状态,然后按照需求修改,绘制,最后还要再恢复原来的状态。这个就要用到glGet一系列的函数了。可以参考https://www.xuebuyuan.com/1456376.html

发布了46 篇原创文章 · 获赞 74 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/u010977122/article/details/102500680
今日推荐