在三角形上绘制一条线

时间:2011-03-10 09:07:00

标签: iphone objective-c opengl-es

我在Xcode中创建了一个新的iPhone OpenGL项目。我用三角形填充背景并给它们一个纹理,见下图:

CGImageRef spriteImage;
CGContextRef spriteContext;
GLubyte *spriteData;
size_t  width, height;

// Sets up matrices and transforms for OpenGL ES
glViewport(0, 0, backingWidth, backingHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
//glRotatef(-90,0,0,1);
glOrthof(-1.0f, 1.0f, -1.5f, 1.5f, -1.0f, 1.0f);
glMatrixMode(GL_MODELVIEW);

// Clears the view with black
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

// Sets up pointers and enables states needed for using vertex arrays and textures
glVertexPointer(2, GL_FLOAT, 0, vertices);
glEnableClientState(GL_VERTEX_ARRAY);
//glColorPointer(4, GL_FLOAT, 0, triangleColors);
//glColor4f(0.0f,1.0f,0.0f,1.0f);
//glEnableClientState(GL_COLOR_ARRAY); 
glTexCoordPointer(2, GL_FLOAT, 0, spriteTexcoords);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);

// Creates a Core Graphics image from an image file
spriteImage = [UIImage imageNamed:@"Bild.png"].CGImage;
// Get the width and height of the image
width = CGImageGetWidth(spriteImage);
height = CGImageGetHeight(spriteImage);
// Texture dimensions must be a power of 2. If you write an application that allows users to supply an image,
// you'll want to add code that checks the dimensions and takes appropriate action if they are not a power of 2.

if(spriteImage) {
    // Allocated memory needed for the bitmap context
    spriteData = (GLubyte *) calloc(width * height * 4, sizeof(GLubyte));
    // Uses the bitmap creation function provided by the Core Graphics framework. 
    spriteContext = CGBitmapContextCreate(spriteData, width, height, 8, width * 4, CGImageGetColorSpace(spriteImage), kCGImageAlphaPremultipliedLast);
    // After you create the context, you can draw the sprite image to the context.
    CGContextDrawImage(spriteContext, CGRectMake(0.0, 0.0, (CGFloat)width, (CGFloat)height), spriteImage);
    // You don't need the context at this point, so you need to release it to avoid memory leaks.
    CGContextRelease(spriteContext);

    // Use OpenGL ES to generate a name for the texture.
    glGenTextures(1, &spriteTexture);
    // Bind the texture name. 
    glBindTexture(GL_TEXTURE_2D, spriteTexture);
    // Set the texture parameters to use a minifying filter and a linear filer (weighted average)
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    // Specify a 2D texture image, providing the a pointer to the image data in memory
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, spriteData);
    // Release the image data
    free(spriteData);

    // Enable use of the texture
    glEnable(GL_TEXTURE_2D);
    // Set a blending function to use
    glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
    // Enable blending
    glEnable(GL_BLEND);

我有两个问题,bc。我对OpenGL不太熟悉。

我想写一个方法,我给出两个点作为参数,我希望这两个点之间的一条线在我的三角形(背景)之上绘制。

        - (void) drawLineFromPoint1:(CGPoint)point1 toPoint2:(CGPoint)point2 {
GLfloat triangle[] = {         //Just example points
        0.0f, 0.0f,       
        0.1f, 0.0f,
        0.1f, 0.0f,
        0.1f, 0.1f
    };
    GLfloat triangleColors[] = {
        0.5f, 0.5f, 0.5f, 1.0f
    };
    //now draw the triangle
}

这样的事情。现在我想要一个第二种方法,它会删除这一行(而不是背景)

我的绘图方法如下所示:

    - (void)drawView
{
    // Make sure that you are drawing to the current context
    [EAGLContext setCurrentContext:context];

    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
    glClear(GL_COLOR_BUFFER_BIT);
    glDrawElements(GL_TRIANGLES, number_vertices, GL_UNSIGNED_SHORT, indices);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
    [context presentRenderbuffer:GL_RENDERBUFFER_OES];

}

如果你能提供一些提示/帮助,那就太好了,

欢呼声

2 个答案:

答案 0 :(得分:1)

传统方法是在移动或擦除线条时重绘所有内容

答案 1 :(得分:0)

嗯,我得到了它的工作。我只是错过了将我的drawView中的顶点指针设置为我的三角形。现在这在这里有效:

   - (void)drawView
    {

    [EAGLContext setCurrentContext:context];

    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
    glClear(GL_COLOR_BUFFER_BIT);
    glVertexPointer(2, GL_FLOAT, 0, vertices);
    glDrawElements(GL_TRIANGLES, number_vertices, GL_UNSIGNED_SHORT, indices);
    [self drawLines];
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
    [context presentRenderbuffer:GL_RENDERBUFFER_OES];

}

    - (void) drawLines{
    glDisable(GL_TEXTURE_2D);

    GLfloat points[4];
    for (Dataset *data in buttons) {
        CGPoint s = [data screenPosition];
        CGPoint p = [data slot];
        points[0] = (GLfloat)(768-s.y);
        points[1] = (GLfloat)(1024-s.x);
        points[2] = (GLfloat)(768-p.y);
        points[3] = (GLfloat)(1024-p.x);
        glVertexPointer(2, GL_FLOAT, 0, points);
        glDrawArrays(GL_LINE_STRIP, 0, 2);

    }
    glEnable(GL_TEXTURE_2D);


}