似乎就是纹理,但看那个纹理也实在太烦琐了。看得我头大啊,哪位做过类似东西的大侠给讲讲?多谢

解决方案 »

  1.   

    用ExtFloodFill API函数解决不了问题吗?Canvas.Brush.color := yourColor;
    ExtFloodFill(Canvas.Handle, x, y, FLOODFILLSURFACE);
    //最后一个参数可以有FLOODFILLSURFACE 和 FLOODFILLBORDER 两个。
      

  2.   

    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)
      

  3.   

    呵呵,晚上跟同学小聚了一下,回来晚了其实就是一个设置纹理坐标的问题
    看这个图
         
     (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();
      

  4.   

    稍微解释一下
    四角星的顶点坐标如下(给出三个,其他的都是对称的)
    根据上面说的,很容易就算出
    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
                            |
    这下子应该很清楚了吧?
    如果你把纹理坐标稍微改变一下,看看纹理坐标对纹理的影响
    有时候会出现意想不到的好效果:)