似乎就是纹理,但看那个纹理也实在太烦琐了。看得我头大啊,哪位做过类似东西的大侠给讲讲?多谢
解决方案 »
- dataset获取列名
- 关于InstallShield的两个问题,如何删除只读目录和如何制作卸载 ...
- 如何实现把clientdataset1里部分字段内容追加到clientdataset2里
- 请教:在showmodule出来的窗体中使用RAVE预览,当关闭RAVE时,为什么此窗体也会被关闭?
- 急!!怎么用程序代码实现将dbgird1.options下的dgrowlines:=false.
- 如何连Access数据库
- 怎样使最大化,最小化按钮显灰色
- http://expert.csdn.net/expert/topic/722/722399.xml,人气为什么这么旺?!
- 关于记录查找locate的用法
- 高分求解******在我的程序中如何截获其它应用程序启动的消息?如何实现?
- 外键ID的值要显示为外键对应的Name,如何做?
- 如何自己编程得到本机的公网IP(在线等...)
ExtFloodFill(Canvas.Handle, x, y, FLOODFILLSURFACE);
//最后一个参数可以有FLOODFILLSURFACE 和 FLOODFILLBORDER 两个。
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)
看这个图
(0,1) _______________________________ (1,1)
| |
| |
| |
| |
(0,0.5) | |(1,0.5)
| |
| |
| A. |
| |
|_______________________________|
(0,0) (1,0)这就是纹理坐标的范围,所以图中的A点的纹理坐标就大概是(0.7,0.2)左右
画多边形的每个点的时候,绑定在贴图中对应的纹理坐标就行了写了点简单的代码,画了一个四角星,贴图还算工整吧
具体的细节不说了,耐住性子一个点一个点的慢慢看就行了,拿笔画一下马上就明白了初始化的时候
glBindTexture(GL_TEXTURE_2D, Texture);
glEnable(GL_TEXTURE_2D);画图的时候
glTranslatef(0.0, 0.0, -10); glBegin(GL_TRIANGLE_STRIP);
glTexCoord2f(0, 0.5);glVertex3f(-2, 0, 1);
glTexCoord2f(0.375, 0.625);glVertex3f(-0.5, 0.5, 1);
glTexCoord2f(0.5, 0.5);glVertex3f(0, 0, 1);
glTexCoord2f(0.5, 1);glVertex3f(0, 2, 1);
glTexCoord2f(0.625, 0.625);glVertex3f(0.5, 0.5, 1);
glTexCoord2f(0.5, 0.5);glVertex3f(0, 0, 1);
glTexCoord2f(1, 0.5);glVertex3f(2, 0, 1);
glTexCoord2f(0.625, 0.375);glVertex3f(0.5, -0.5, 1);
glTexCoord2f(0.5, 0.5);glVertex3f(0, 0, 1);
glTexCoord2f(0.5, 0);glVertex3f(0, -2, 1);
glTexCoord2f(0.375, 0.375);glVertex3f(-0.5, -0.5, 1);
glTexCoord2f(0.5, 0.5);glVertex3f(0, 0, 1);
glTexCoord2f(0, 0.5);glVertex3f(-2, 0, 1);
glEnd();
四角星的顶点坐标如下(给出三个,其他的都是对称的)
根据上面说的,很容易就算出
a点对应得纹理坐标就是(0.5,1)
b点对应得纹理坐标就是(0.625,625)//根据比例算一下就算出来了
c点对应得纹理坐标就是(1,0.5)
其他的依次类推
|
|
0 a(0,2)
|
|
0 | 0 b(0.5,0,5)
--------------0---------|---------0---------------------
| c(2,0)
0 | 0
|
|
0
|
这下子应该很清楚了吧?
如果你把纹理坐标稍微改变一下,看看纹理坐标对纹理的影响
有时候会出现意想不到的好效果:)