设为首页 加入收藏

TOP

OpenGL超级宝典学习笔记——画三角形
2015-02-25 22:43:38 来源: 作者: 【 】 浏览:20
Tags:OpenGL 超级 宝典 学习 笔记 三角形

学习了画线的知识,我们可以使用GL_LINE_LOOP来画闭合的多边形。但是使用这种方式画出来的只有线框,多边形没有填充颜色。OpenGL支持绘制实心的多边形,并使用当前的颜色进行填充。


?


简单的三角形,需要指定三个顶点。


这两个三角形会使用当前的颜色进行填充。


image


?


按照顶点指定的顺序和方向组合称为环绕。上图的两个多边形是顺时针环绕的。我们可以通过改变顶点的顺序,从而改变环绕方向。我们把v4和v5的顺序调换过来,则这个三角形的环绕方向为逆时针了。


image


OpenGL默认是逆时针环绕方向为正方向,即逆时针环绕的三角形为正面。上图左边的三角形,显示的是正面,而右边的显示的是反面。我们也可以通过函数glFrontFace(GL_CW);来告诉OpenGL顺时针环绕的多边形是正面。环绕方向是多边形一个非常有用的性质,可以用于消除不必要的面。


?


我们可以绘制多个三角形连起来形成多个面或者多边形。使用GL_TRIANGLE_STRIP图元,可以绘制一串相连的多边形,来节省大量的时间。


image


由上图可以看到,多边形的边的绘制顺序并不是完全按照我们指定的顶点顺序的。而是按照OpenGL指定的顺序逆时针方向绘制的。


使用三角形带而不是分别指定每个三角形的顶点的优势有两个:


?


除了三角形带之外,我们还可以通过GL_TRIANGLE_FAN图元,创建一组围绕一个中心点的三角形扇。通过制定5个顶点我们就可以绘制3个三角形来形成三角形扇。用3个顶点指定一个三角形后,后续的顶点Vn与原点V0以及前面的一个顶点Vn-1形成一个三角形。


image


?


?


?


image


使用红青相间的方式来绘制一个锥体。


?


多边形的填充模式有两种一种是单调着色GL_FLAT,一种平滑着色GL_SMOOTH。


通过glShadeMode(GL_FLAT);和glShadeMode(GL_SMOOTH);来设置。单调着色以三角形的最后一个顶点的颜色来填充三角形。平滑着色则是用三个顶点的颜色值进行内插值运算,来填充三角形的颜色。


平滑着色效果如下:


image


?


如果没有使用深度缓冲区,来进行深度测试。上面的椎体如何旋转(通过方向键可以旋转),都是把底面显示了出来。因为底面我们是在后面画的,最后一个绘制的物体出现在之前绘制的物体的前面。如果开启了深度测试来解决问题。


深度测试:当一个像素被绘制时,它将被设置一个值(z值),以表示它和观测者的距离。以后当这个位置要绘制新像素时,新像素的z值就会和旧像素的z值进行比较。如果新像素z值更高,则更靠近观察者,则应该被绘制,反之被忽略。


启用深度测试只须调用glEnable(GL_DEPTH_TEST);每次场景被渲染之前,应该清楚深度缓冲区,与清楚颜色缓冲区类似。


glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);


在程序用使用右键点击,弹出菜单,深度测试来切换深度测试。在绘制3D实体时,深度测试往往是必须的。


image


?


?


虽然启用深度测试,可以消除隐藏面。但很多时候,我们清楚那些面是不需要绘制,应该被剔除的。例如:多边形的背面不应该被显示。如果我们告知OpenGL这个图形面不需要被绘制,就不会把这个图形发送给OpenGL驱动程序和硬件,可以提高性能。


启用剔除面的功能。


//指定顺时针环绕的面为正面


glFrontFace(GL_CW);


//开启剔除面,剔除背面。


glEnable(GL_CULL_FACE);


image


image


锥体的底面面向锥体内部的是正面。要改变底面的正面,可以再绘制底面时设置glFrontFace(GL_CCW);


?


多边形我们可以指定它的模式,要填充还是只画线框或者只画顶点。


通过glPolygonMode(GL_BACK, GL_LINE) ;设置多边形的背面只画线。


通过glPolygonMode(GL_BACK, GL_FILL) ;设置多边形的背面为实体。


?


通过glPolygonMode(GL_BACK, GL_POINT) ;设置多边形的背面只画点。


image


源代码:https://github.com/sweetdark/openglex/tree/master/triangle


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇OpenGL超级宝典学习笔记——画直线 下一篇OpenGL超级宝典学习笔记——其他..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: