代码之家  ›  专栏  ›  技术社区  ›  Allisone

使用纹理渲染抗锯齿线=>搜索非常简单的示例

  •  2
  • Allisone  · 技术社区  · 15 年前

    this site ...

    ... 他们解释了如何画一条抗锯齿线。

    正是我想要的!
    但是

    我不明白怎么用一句简单的话就能做到。我已经找到了这本书的在线版本(这篇文章是从这本书中衍生出来的),我已经下载了示例代码(显示了一个木棍人物在做花哨的动作),但是有太多的mambojambo正在进行中。。。一些奇怪的python脚本。。。圆圈作为png图像和头文件,几乎所有的东西都是用cpp编写的,我复制到我的项目中的文件会产生很多错误,我无法正确解决等等。我想我不需要那些花哨的东西,因为我只想在一个简单的基于cocos2d的应用程序中画线。。。。我不想使用AA,但我的线比5px厚,这使得它们在连接时有难看的洞(例如,在一个由几条线组成的圆中),所以我必须使用AA,因为它看起来]。

    那么,是否有人已经或发现了一小段使用链接文章中解释的原理的可运行示例代码?


    1. 在图片中,你可以看到这些洞:
      http://pimml.de/circles.png

    2. 您可以在这里找到上述stickman的代码(AA行): http://examples.oreilly.com/9780596804831/readme.html#AaLines

    3. 我就是这样画圆圈的:

      int segments = 80;
      CGFloat width = 100;
      CGFloat height = 100;
      CGPoint center = ccp(800,200);  
      
      glDisable(GL_TEXTURE_2D);
      glDisableClientState(GL_TEXTURE_COORD_ARRAY);
      glDisableClientState(GL_COLOR_ARRAY);
      //glEnable(GL_LINE_SMOOTH); // doesn't work on device
      glTranslatef(center.x, center.y, 0.0);
      glLineWidth(3.0f);
      GLfloat vertices[segments*2];
      int count=0;
      for (GLfloat i = 0; i < 360.0f; i+=(360.0f/segments))
      {
          vertices[count++] = (cos(degreesToRadian(i))*width);
          vertices[count++] = (sin(degreesToRadian(i))*height);
      }
      glVertexPointer (2, GL_FLOAT , 0, vertices); 
      glDrawArrays (GL_LINE_LOOP, 0, segments);
      
      glEnableClientState(GL_COLOR_ARRAY);
      glEnableClientState(GL_TEXTURE_COORD_ARRAY);
      glEnable(GL_TEXTURE_2D);    
      
    3 回复  |  直到 15 年前
        1
  •  1
  •   Beaker    15 年前

    https://devforums.apple.com/message/264670

    这是工作,它很容易,它看起来不错,但它仍然不是最好的(为我所做的)。最后,我写了自己的解决方案,将GL绘制粒子图和他的点到点绘制线的解决方案结合起来。

    我做了一个数组,在TouchsBegin,TouchsMoved,我给它加了一个点:

    [currentStroke addObject:[NSValue valueWithCGPoint:point]]

    然后我遍历笔划,就像你在GL Paint中看到的那样,使用GL\u点。

        2
  •  2
  •   snibbe ios_av    15 年前

    多亏了Paul Haeberli,以下是他与我共享的一些代码,用于绘制抗锯齿框、点和线:

    /*
     *   Antialised 2D points, lines and rectangles for iOS devices
     *
     *   The feathered edge of these primitives is width/2.0.
     *
     *   If you are working in screen space, the width should be 1.0.
     *
     *       Paul Haeberli 2010
     *
     */
    void fillSmoothRectangle(CGRect *r, float width)
    {
        GLfloat rectVertices[10][2];
        GLfloat curc[4]; 
        GLint   ir, ig, ib, ia;
    
        // fill the inside of the rectangle
        rectVertices[0][0] = r->origin.x;
        rectVertices[0][1] = r->origin.y;
        rectVertices[1][0] = r->origin.x+r->size.width;
        rectVertices[1][1] = r->origin.y;
        rectVertices[2][0] = r->origin.x;
        rectVertices[2][1] = r->origin.y+r->size.height;
        rectVertices[3][0] = r->origin.x+r->size.width;
        rectVertices[3][1] = r->origin.y+r->size.height;
    
        glEnableClientState(GL_VERTEX_ARRAY);
        glVertexPointer(2, GL_FLOAT, 0, rectVertices);
        glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
    
        rectVertices[0][0] = r->origin.x;
        rectVertices[0][1] = r->origin.y;
        rectVertices[1][0] = r->origin.x-width;
        rectVertices[1][1] = r->origin.y-width;
        rectVertices[2][0] = r->origin.x+r->size.width;
        rectVertices[2][1] = r->origin.y;
        rectVertices[3][0] = r->origin.x+r->size.width+width;
        rectVertices[3][1] = r->origin.y-width;
        rectVertices[4][0] = r->origin.x+r->size.width;
        rectVertices[4][1] = r->origin.y+r->size.height;
        rectVertices[5][0] = r->origin.x+r->size.width+width;
        rectVertices[5][1] = r->origin.y+r->size.height+width;
        rectVertices[6][0] = r->origin.x;
        rectVertices[6][1] = r->origin.y+r->size.height;
        rectVertices[7][0] = r->origin.x-width;
        rectVertices[7][1] = r->origin.y+r->size.height+width;
        rectVertices[8][0] = r->origin.x;
        rectVertices[8][1] = r->origin.y;
        rectVertices[9][0] = r->origin.x-width;
        rectVertices[9][1] = r->origin.y-width;
    
        glGetFloatv(GL_CURRENT_COLOR, curc);
        ir = 255.0*curc[0];
        ig = 255.0*curc[1];
        ib = 255.0*curc[2];
        ia = 255.0*curc[3];
    
        const GLubyte rectColors[] = {
            ir, ig, ib, ia,
            ir, ig, ib, 0,
            ir, ig, ib, ia,
            ir, ig, ib, 0,
            ir, ig, ib, ia,
            ir, ig, ib, 0,
            ir, ig, ib, ia,
            ir, ig, ib, 0,
            ir, ig, ib, ia,
            ir, ig, ib, 0,
            ir, ig, ib, ia,
            ir, ig, ib, 0,
        };
    
        glEnableClientState(GL_VERTEX_ARRAY);
        glEnableClientState(GL_COLOR_ARRAY);
        glVertexPointer(2, GL_FLOAT, 0, rectVertices);
        glColorPointer(4, GL_UNSIGNED_BYTE, 0, rectColors);
        glDrawArrays(GL_TRIANGLE_STRIP, 0, 10);
        glDisableClientState(GL_COLOR_ARRAY);
    }
    
    void drawSmoothLine(CGPoint *pos1, CGPoint *pos2, float width)
    {
        GLfloat lineVertices[12], curc[4]; 
        GLint   ir, ig, ib, ia;
        CGPoint dir, tan;
    
        width = width*8;
        dir.x = pos2->x - pos1->x;
        dir.y = pos2->y - pos1->y;
        float len = sqrtf(dir.x*dir.x+dir.y*dir.y);
        if(len<0.00001)
            return;
        dir.x = dir.x/len;
        dir.y = dir.y/len;
        tan.x = -width*dir.y;
        tan.y = width*dir.x;
    
        lineVertices[0] = pos1->x + tan.x;
        lineVertices[1] = pos1->y + tan.y;
        lineVertices[2] = pos2->x + tan.x;
        lineVertices[3] = pos2->y + tan.y;
        lineVertices[4] = pos1->x;
        lineVertices[5] = pos1->y;
        lineVertices[6] = pos2->x;
        lineVertices[7] = pos2->y;
        lineVertices[8] = pos1->x - tan.x;
        lineVertices[9] = pos1->y - tan.y;
        lineVertices[10] = pos2->x - tan.x;
        lineVertices[11] = pos2->y - tan.y;
    
        glGetFloatv(GL_CURRENT_COLOR,curc);
        ir = 255.0*curc[0];
        ig = 255.0*curc[1];
        ib = 255.0*curc[2];
        ia = 255.0*curc[3];
    
        const GLubyte lineColors[] = {
            ir, ig, ib, 0,
            ir, ig, ib, 0,
            ir, ig, ib, ia,
            ir, ig, ib, ia,
            ir, ig, ib, 0,
            ir, ig, ib, 0,
        };
    
        glEnableClientState(GL_VERTEX_ARRAY);
        glEnableClientState(GL_COLOR_ARRAY);
        glVertexPointer(2, GL_FLOAT, 0, lineVertices);
        glColorPointer(4, GL_UNSIGNED_BYTE, 0, lineColors);
        glDrawArrays(GL_TRIANGLE_STRIP, 0, 6);
        glDisableClientState(GL_COLOR_ARRAY);
    }
    
    
    void drawSmoothPoint(CGPoint *pos, float width)
    {
        GLfloat pntVertices[12], curc[4]; 
        GLint   ir, ig, ib, ia;
    
        pntVertices[0] = pos->x;
        pntVertices[1] = pos->y;
        pntVertices[2] = pos->x - width;
        pntVertices[3] = pos->y - width;
        pntVertices[4] = pos->x - width;
        pntVertices[5] = pos->y + width;
        pntVertices[6] = pos->x + width;
        pntVertices[7] = pos->y + width;
        pntVertices[8] = pos->x + width;
        pntVertices[9] = pos->y - width;
        pntVertices[10] = pos->x - width;
        pntVertices[11] = pos->y - width;
    
        glGetFloatv(GL_CURRENT_COLOR,curc);
        ir = 255.0*curc[0];
        ig = 255.0*curc[1];
        ib = 255.0*curc[2];
        ia = 255.0*curc[3];
    
        const GLubyte pntColors[] = {
            ir, ig, ib, ia,
            ir, ig, ib, 0,
            ir, ig, ib, 0,
            ir, ig, ib, 0,
            ir, ig, ib, 0,
            ir, ig, ib, 0,
        };
    
        glEnableClientState(GL_VERTEX_ARRAY);
        glEnableClientState(GL_COLOR_ARRAY);
        glVertexPointer(2, GL_FLOAT, 0, pntVertices);
        glColorPointer(4, GL_UNSIGNED_BYTE, 0, pntColors);
        glDrawArrays(GL_TRIANGLE_FAN, 0, 6);
        glDisableClientState(GL_COLOR_ARRAY);
    }
    
        3
  •  0
  •   Community Mohan Dere    8 年前