美文网首页
正背面剔除浅识

正背面剔除浅识

作者: 简单的孤寂 | 来源:发表于2020-07-09 17:48 被阅读0次

    前言:在我们使用OpenGL进行绘制一些图形的时候如果我们需要对特殊按键对图形做一些 旋转 切换等操作的时候 必须要在main函数值先进行注册。

    图像绘制的流程: 首先我们要创建一个可视窗口 ChangeSize(int w, int h) 在这个方法中我们去创建视口的大小,投影矩阵,代码如下:

    2、其次我们要进行初始化即我们需要在SetUpRC()对颜色 着色器,顶点坐标等进行设置,如图所示

    3、在我们初始化之后会进入到RednferScene()方法中。在RenderScene()方法中我们首先要对缓冲区进行清空操作(清空理念是 我们使用哪个就清空哪个。当然如果不知道的话 就全部清空):glClear(GL_COLOR_BUFFER_BIT(清空颜色) | GL_DEPTH_BUFFER_BIT(深度缓冲区) | GL_STENCIL_BUFFER_BIT(模板缓冲区));。清空缓冲区之后 我们就要进行压栈(压栈,那么什么是栈、栈是用来记录状态的我们可以通过栈记录的状态来进行撤回的操作,如果我们想要继续保存状态的时候可以继续进行压栈。如果回退了就不需要保存它的状态,那么就进行出栈):modelViewMatrix.PushMatrix(); 然后我们将观察者矩阵和物体矩阵存放到模型视图矩阵中。 transformPipeline.GetModelViewProjectionMatrix() 通过调用这个方法我们可以直接获取到矩阵相乘的结果具体代码如下:

    正背面剔除。当我们再使用光源着色器绘制一些3D模型的时候。当我们移动观察者视角的时候回出现BUG。如图所示

    没有旋转 旋转之后

    通过这个俩个图的比较我们可以看出 我们绘制的这个“甜甜圈”有BUG 我们再绘制的时候只使用了红色,那么这些黑色是怎么来的呢? 首先我们要了解 在我们观察物体的时候 物体会有正面 和背面。如果存在光源的情况下,光照的地方的颜色是红色。光照不到的地方也就是背面是黑色。 这样就解释了 当我们对“甜甜圈”进行旋转的时候 系统不知道我们那一块是我们能够看到的。那一块是我们不能看到的。所以就形成了图2的这样的问题。那么怎么解决这样的问题。

    我们可以对"甜甜圈"进行正背面剔除。什么是正背面剔除呢。可以理解为,在我们观察物体的时候 我们最多只能看到物体的三个面。其他的面我们是看不到的。这个时候我们就可以把其他看不到的面进行剔除。这样的做法 不仅仅能提高绘制的效率 ,因为我们不需要把一个物体的全部面都绘制 只需要绘制我们能够看到的面。而且还能避免出现上图的这种情况。

    最后疑问 对“甜甜圈”进行了正背面剔除之后 我们就能获得完整的“甜甜圈”了吗?

    相关文章

      网友评论

          本文标题:正背面剔除浅识

          本文链接:https://www.haomeiwen.com/subject/ixjscktx.html