1.
如何绘制图形
上一节我们编写了一个
专门
绘图的函数RenderScene
,不过并没有详细来解释它,本节我们就开始讨论如何绘制图形,至于图形的移动、动画,就在下一节中介绍。
在开始前,谈到我曾经遇到的一个问题,当我运行一个完整的OpenGL
程序后,再执行上面的代码,发现出现的总是前一个程序的内容,即内存中的图像并没有被清除掉。要解决这个问题,还需要改写OnSize
方法:
void CCOpenGLDemoView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
glViewport(0,0,cx,cy);
}
这样就搞定了。
―――――――――――――――――――――――――――――――――――――――
u
刷新窗口
一般情况下,绘制一副图形前需要将计算机内存中的原始内容清理,这些清理包括颜色、深度、累积和模板缓冲区,我们使用glClear
函数来对其进行缓冲。使用这个函数以前,需要使用具体的清理函数进行清理:
glClearColor(0.0f,0.0f,0.0f,0.0f);
glClearDepth(1.0f);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
u
指定绘图颜色
使用glColor3f(r,g,b)
。
u
消隐
在三维中,一个物体隐藏住另一个物体,称为消隐,消隐是由深度缓存来实现的。要启动消隐必须设置下面的代码:
glEnable(GL_DEPTH_TEST);
//
启用深度测试
在不同的环境中为了实现不同的消隐效果,还有一个函数:
glDepthFunc(GL_LEQUAL);
//
所作深度测试的类型
这些内容将在后面讲到。
―――――――――――――――――构造图形――――――――――――――――――
u
绘制点的方法:
//
绘制点
glPointSize(20.0); //
点的大小
glBegin(GL_POINTS);
glVertex3f(0.5f,0.0f,0.0f);
glEnd();
看看
结果
,这个点是不是一个矩形?为了让它圆滑,我们需要使用“反走样技术”,在最前面加上这句:
glEnable(GL_POINT_SMOOTH);
取消反走样技术也很简单:
glDisable(GL_POINT_SMOOTH);
u
构造线
glEnable(GL_LINE_SMOOTH); //
对线进行反走样
glLineStipple(1,0xAAAA); //
设置线类型
glEnable(GL_LINE_STIPPLE); //
使用线型
glLineWidth(3.0f); //
线宽
glBegin(GL_LINES); //
绘制
glVertex3f(-1.0f,-1.0f,0.0f);
glVertex3f(1.0f,1.0f,0.0f);
glEnd();
u
多边形的问题
构造多边形的方式很多,大家可以看帮助,如GL-TRIANGLES GL_QUADS GL_POLYGON GL_TRIANGLE_STRIP GL_TRIAGLE_FAN GL_QUAD_STRIP
等。
多边形的绘制有一个正反面的问题,在OpenGL
中,它的正反面是由绘制多边形的定点的方向来确定的,正面是逆时针方向。以一个四面体为例,它的正面应该是右上,左上,左下,右下这样的方向来进行绘制的,这个面相对的面的绘制顺序,也应该是观察者站在相对面那边的逆时针方向。
其实绘制一个立方体,采用什么方向绘制都可以实现,但问题在于如果在方向上混着来,不顾正反面问题,在将来贴图的时候,就可能出现问题。试想如果立方体中两个相对的面在同一视点上都采用一样的绘制顺序,比如说逆时针方向,那么就有一个面的正面在立方体内部,这样贴图就会出现问题。
考虑到正反面问题时,还有个多边形绘图模式问题,即填充方式,方式有三种,GL_POINT GL_LINE GL_FILL
。
glPolygonMode(GL_FRONT,GL_LINE);
glBegin(GL_QUADS);
glVertex3f(0.5f,0.5f,0.0f);
glVertex3f(-0.5f,0.5f,0.0f);
glVertex3f(-0.5f,-0.5f,0.0f);
glVertex3f(0.5f,-0.5f,0.0f);
glEnd();
这样绘制的四边形就是线框的形式而非填充形式。
图形的绘制就写这么多,别的什么复杂曲线、曲面、文字和位图的东西,由于我用不上,也就没有细看了。在下面一节中,我将介绍坐标矩阵的问题,构建三维立体感觉,就全靠它了。

相关评论
