OPENGL基本图形的绘制
1、图形的颜色
注意底色的设置,颜色设置通常与像素描述变量有关,即与TPixelFormatDescriptor定义中的iPixelType成员有关。
iPixelType:=PFD_TYPE_COLORINDEX;
则只能使用
glIndexd,glIndexf,glIndexi,glIndexs,glIndexv,glIndexfv,glIndexiv,glIndexsv过程设置图形颜色。
iPixelType:=PFD_TYPE_RGBA;
则只能使用   glColor3b,glColor3f,glColor4b,glColor4f,glColor4fv设置图形颜色。
A   图形底色:屏幕与窗口的颜色,即颜色缓冲区的颜色。改变图形底色首先应使用glClearColor过程设定底色,然后使用glClear过程以这种底色刷新窗口和屏幕。
procedure   glClearColor(red:GLClampf,green:GLClampf,blue:GLClampf,alpha:GLClampf);
procedure   glClear(mask:GLBitField);
red,green,blue,alpha是准备设置的底色,它们的取值是0到1。mask是刷新底色的方式。
例:将绘声绘色图窗口设置为绿色
glClearColor(0,1,0,1);
glClear(GL_COLOR_BUFFER_BIT);
mask的取值和意义:
GL_COLOR_BUFFER_BIT   设置当前的颜色缓冲
GL_DEPTH_BUFFER_BIT   设置当前的深度缓冲
GL_ACCUM_BUFFER_BIT   设置当前的积累缓冲
GL_STENCIL_BUFFER_BIT   设置当前的STENCIL(模板)缓冲
绘图窗口设置为灰色
glClearColor(0.3,0.3,0.3,1);
glClear(GL_COLOR_BUFFER_BIT);
B   图形颜色
使用glClear3f与glClear4f可以设置图形的绘制颜色。若用三个参数,则分别指设置红、蓝、绿三色光。若用四个参数,则第四个表示RGBA值。
例设置当前的绘图颜色为蓝色:
glColor3f(0,0,1);
设置绘图颜色为白色:
glColor3f(1,1,1);
2、简单图形的绘制
在glBegin与glEnd过程之间绘制简单图形,如点、线、多边形等。
glBegin(mode:GLenum);{绘制过程}glEnd;
mode的取值:
GL_POINTS   画多个点
GL_LINES   画多条线,每两点绘制一条直线
GL_LINE_STRIP   绘制折线
GL_LINE_LOOP   绘制首尾相接的封闭多边形
GL_TRIANGLES   绘制三角形
GL_TRIANGLE_STRIP   绘制三边形,每三个点绘制绘制一个三边形
GL_TRIANGLE_FAN   绘制三角形
GL_QUADS   绘制四边形
GL_QUAD_STRIP   绘制四边条,每四点绘制一个四边条
GL_POLYGON   绘制多边形
例绘制三个点:
begin
glPushMatrix;
glBegin(GL_POINT);
glVertex2f(0.1,0.1);
glVertex2f(0.5,0.5);
glVertex2f(0.1,0.3);
glEnd;
SwapBuffers(Canvas.Handle);
end;
如果将GL_POINT改为GL_LINES,则将画一条线.第三个点无效.在glVertex2f之前执行glColor3f(0,0,1)则将线条的颜色改为绿色.   如果将GL_LINES改为GL_LINE_STRIP则可以绘制两条直线.
使用glPointSize过程可以设置点的大小;使用glLineWidth过程可以设置线的宽度.
使用glLineStipple过程设置点划线的样板,使用glEnable(GL_LINE_STIPPLE)过程和对应参数使绘图能够绘制点划线.glDisable(GL_LINE_STIPPLE)过程和对应参数关闭点划线.
procedure   glLineStipple(factor:GLint,pattern:GLushort);
参数factor表示点划线样板Pattern的重复次数,factor取值1255,Pattern是二进制序列.
glLineStipple(1,0,0x11C);{0x11C表示为10001110,0表示不画点,1表示画点}
例:       begin
glColor3f(1,0,0);
glLineWidth(2);
glLineStipple(1,$11C);
glEnable(GL_LINE_STIPPLE);
glBegin(GL_LINES);
glVertex2f(-0.9,0.3);
glVertex2f(0.9,0.3);
glEnd;
glDisable(GL_LINE_STIPPLE);
glColor3f(1,0,1);
glLineStipple(2,$11C);
glEnable(GL_LINE_STIPPLE);
glBegin(GL_LINES);
glVertex2f(-0.9,0.1);
glVertex2f(0.9,0.1);
glEnd;
glDisable(GL_LINE_STIPPLE);
SwapBuffers(Canvas.Handle);
end;
多边形绘制与点线相似,要改变参数为GL_POLYGON,GL_QUADS,GL_TRANGLES.在绘制时的注意事项:
A   多边形的边与边只在顶点相交
B   多边形必须是凸多边形,如果是凹多边形,用户只有折成凸多边形,加快绘制速度.
例:   glBegin(GL_POLYGON);
glVertex2f(-0.9,0.3);
glVertex2f(0.9,0.3);
glVertex2f(0.9,-0.6);
glVertex2f(0.5,-0.6);
glVertex2f(-0.9,-0.2);
glEnd;
多边形有正面与反面,与之相关的过程:
glPolygonMode   控制多边形正,反面绘图模式
glFrontface   指定多边形的正面
glCullFace   显示多边形是设置消除面
glPolygonStripple   形成多边形填充的样式
3、简单二次曲面
圆柱,圆环和球都属于二次曲面.
A   圆柱
gluCylinder(qobj:GLUquadricObj,baseRadius:GLdouble,topRadius:GLdouble,height:GLdouble,
slices:GLint,stacks:GLint);
qobj指定一个二次曲面,baseRadius为圆柱的底半径;topRadius为所绘制圆柱的上
顶面半径;height为圆柱的高;slices为绕Z轴的分割线数;stacks为沿Z轴的分割线数.
如果baseRadius和topRadius不相等,则可以绘制锥台与圆锥.
procedure   TfrmMain.MyDraw;
var
qObj:GLUQuadricObj;
begin
glPushMatrix;
glClear(GL_COLOR_BUFFER_BIT   or   GL_DEPTH_BUFFER_BIT);
glColor3f(1,0,0);
qObj:=gluNewQuadric;
gluQuadricDrawStyle(qObj,GLU_LINE);
gluCylinder(qObj,0.5,0.1,0.2,10,10);
end;
B   圆环
gluDisk(qobj:GLUquadricObj,innerRadius:GLdouble,outerRadius:GLdouble,slices:GLint,
loops:GLint);
procedure   TfrmMain.MyDraw;
var
qObj:GLUQuadricObj;
begin
glPushMatrix;
glClear(GL_COLOR_BUFFER_BIT   or   GL_DEPTH_BUFFER_BIT);
glColor3f(1,0,0);
qObj:=gluNewQuadric;
gluQuadricDrawStyle(qObj,GLU_LINE);
gluDisk(qObj,0.2,0.5,10,5);
SwapBuffers(Canvas.Handle);
end;
C   半圆环
gluPartialDisk(qobj:GLUquadricObj,innerRadius:GLdouble,outerRadius:GLdouble,slices:GLint,
loops:GLint,startAngle:GLdouble,sweepAngle:GLdouble);
startAngle,sweepAngle是半圆环的起始角与终止角.
procedure   TfrmMain.MyDraw;
var
qObj:GLUQuadricObj;
begin
glPushMatrix;
glClear(GL_COLOR_BUFFER_BIT   or   GL_DEPTH_BUFFER_BIT);
glColor3f(1,0,0);
qObj:=gluNewQuadric;
gluQuadricDrawStyle(qObj,GLU_LINE);
gluPartialDisk(qObj,0.2,0.5,10,5,90,190);
SwapBuffers(Canvas.Handle);
end;
D   球体
function   gluSphere(qObj:GLUquadricObj,radius:GLdouble,slices:GLint,stacks:GLint);
procedure   TfrmMain.MyDraw;
var
qObj:GLUQuadricObj;
begin
glPushMatrix;
glClear(GL_COLOR_BUFFER_BIT   or   GL_DEPTH_BUFFER_BIT);
glColor3f(1,0,0);
qObj:=gluNewQuadric;
gluQuadricDrawStyle(qObj,GLU_LINE);
{   silhouette[   silu(:)5et   ]n.侧面影象,   轮廓}
gluSphere(qObj,0.5,20,20);
SwapBuffers(Canvas.Handle);
end;
E   关于二次曲面的过程
gluNewQuadric   创建一个新的二次曲面对象
gluDeleteQuadric   删除一个二次曲面对象
gluQuadricDrawStyle   指定要绘制的二次曲面类型
gluQuadricNormal   设置二次曲面的法矢量
gluQuadricOrientation   设置二次曲面是内旋还是外旋转
gluQuadricTexture   设置二次曲面是否使用纹理
F   绘制二次曲面的一般步骤
首先定义一个GLUquadricObj对象;
其次创建一个曲面对象gluNewQuadric;
再次设置二次曲面的特性(gluQuadricDrawStyle,   gluQuadricTexture)
绘制二次曲面(gluCylinder,gluSphere,gluDisk,   gluPartialDisk)