您好,欢迎来到九壹网。
搜索
您的当前位置:首页OPENGL基本图形的绘制

OPENGL基本图形的绘制

来源:九壹网


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)

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 91gzw.com 版权所有 湘ICP备2023023988号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务