本节目的:绘制简单图形
(一)OpenGL中点是一切的基础,所以先来看一下如何画一个点。
如何画一个点呢?OpenGL提供了一系列函数,都是以glVertex开头的,后面跟1-2个字母,例如:
glVertex2d
glVertex2f
glVertex3f
glVertex3fv
数字表示参数的个数,2表示两个参数 , 3表示3各参数…… 字母表示参数的类型。熟悉其他语言的都应该能猜得到。
s表示16位整数,(OpenGL中讲个这类型定义为GLshort)
i表示32位整数(OpenGL中将这个类型定义为GLint 和 GLsizei)
f表示32位浮点数(OpenGL中将这个类型定义为GLfloat和GLclampf)
d表示64位浮点数(OpenGL中将这个类型定义为GLdouble 和 GLclampd)
v表示传递的几个参数将使用指针方式。
(二)开始绘图
图本质是有点构成的,OpenGL如何知道这些点是用来构成什么的?直线?曲线?面?所以 为了解决这一问题,OpenGL要求:指定定点的命令必须包含在glBegin之后,glEnd之前(否则指定的定点将被忽略)并由glBegin指定如何使用这些点。
例:
glBegin(GL_POINTS);
glVertex2f(0.0f,0.0f);
glVertex2f(0.5f,0.0f);
glEnd();
执行完以上代码以后,这两个点将会被画出来,如果将GL_POINTS改为GL_LINES,泽这两个点被认为是这条直线的端点,OpenGL将会画出一条直线。
glBegin支持的方式除了 GL_POINTS和GL_LINES ,还有GL_LINE_STRIP,GL_LINE_LOOP,GL_TRIANGLES,GL_TRIANGLE_STRIP,GL_TRIANGLE_FAN
大致效果如图所示:
模式:
void myDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(/*在这里填所希望的模式*/);
/*在这里使用glVertex函数*/;
/*指定你所希望的定点位置*/;
glEnd();
glFlush();
}
第一个例子:画一个圆
/*****************************************************************************************
正四边形、正五边形、正六边形、……知道正n边形,当n越大的时候,这个图形就越接近圆,当n大到一定程度的时候,人们肉眼就无法把它和真正的圆分清了,这是我们就成功画了一个圆形
(注:画圆的方法很多,这里使用的是较简单,但效率较低的一种)。
试着修改下面程序中 const int n 的数值, 观察当 n = 3 , 4 ,5 ,6 ……20 , 40 ,50 ……等不同数值时输出变化,将GL_POLYGON改为GL_LINE_LOOP、GL_POINTS等其它方式,观察输出结果的变化,
*****************************************************************************************/
#include<math.h>
const int n = 20 ;
const GLfloat R = 0.5f ;
const GLfloat Pi = 3.1415926536f;
void myDisplay(void)
{
int i ;
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POLYGON);
for( i = 0 ; i < n ; i++ )
glVertex2f( R*cos(2*Pi/n*i) ,R*sin(2*Pi/n*i) );
glEnd();
glFlush():
}
第二个例子:画一个五角星
(暂缺)
第三个例子:画一个正弦函数图像