glDrawArrays(GL_POINTS,0,vertexCount);只画了一点

时间:2012-03-28 06:59:09

标签: objective-c macos opengl

我使用的是NSOpenGLView。

- (void)initGL 
{
    // Setup OpenGL states 
    [[self openGLContext] makeCurrentContext];
    // Setup OpenGL states
    glMatrixMode(GL_PROJECTION);
    CGRect frame = self.bounds;

    // Setup the view port in Pixels
    glOrtho(0, frame.size.width, 0, frame.size.height, -1, 1);
    glViewport(0, 0, frame.size.width, frame.size.height);
    glMatrixMode(GL_MODELVIEW);

    glDisable(GL_DITHER);
    glEnable(GL_TEXTURE_2D);
    glEnableClientState(GL_VERTEX_ARRAY);

    glEnable(GL_BLEND);

    //glEnable(GL_LINE_SMOOTH);
    glEnable(GL_POINT_SMOOTH);

    glEnable(GL_POINT_SPRITE);
    glTexEnvf(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE);

    self.pointSize = pointSizeForDrawing;
}

Framebuffer创建和绑定。

- (BOOL)createFramebuffer
{
    //Generating two buffers
    glGenRenderbuffers( NumRenderbuffers, renderbuffer ); 

    glBindRenderbuffer( GL_RENDERBUFFER, renderbuffer[Color]); 
    glRenderbufferStorage( GL_RENDERBUFFER, GL_RGBA, self.bounds.size.width, self.bounds.size.height);

    glBindRenderbuffer( GL_RENDERBUFFER, renderbuffer[Depth] ); 
    glRenderbufferStorage( GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, self.bounds.size.width, self.bounds.size.height);

    //Generating framebuffer
    glGenFramebuffers( 1, &framebuffer ); 
    glBindFramebuffer( GL_DRAW_FRAMEBUFFER, framebuffer );

    glFramebufferRenderbuffer( GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderbuffer[Color] );
    glFramebufferRenderbuffer( GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, renderbuffer[Depth] );
    glEnable( GL_DEPTH_TEST );

    if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
    {
        DLog(@"failed to make complete framebuffer object %x", glCheckFramebufferStatus(GL_FRAMEBUFFER));
        return NO;
}

    return YES;
}

线条渲染

- (void)renderLineFromPoint:(CGPoint)start ToPoint:(CGPoint)end
{
    GLsizei vertexCount = 0;
    DLog(@"start: %@ end %@", NSStringFromCGPoint(start), NSStringFromCGPoint(end));

    // Add points to the buffer so there are drawing points every X pixels
    int count = MAX(ceilf(sqrtf((end.x - start.x) * (end.x - start.x) + (end.y - start.y) * (end.y - start.y)) / brushPixelStep), 1);
    for(int i = 0; i < count; ++i) 
    {
        if(vertexCount == vertexMax) 
        {
            vertexMax = 2 * vertexMax;
            vertexBuffer = realloc(vertexBuffer, vertexMax * 2 * sizeof(GLfloat));
        }

        vertexBuffer[2 * vertexCount + 0] = start.x + (end.x - start.x) * ((GLfloat)i / (GLfloat)count);
        vertexBuffer[2 * vertexCount + 1] = start.y + (end.y - start.y) * ((GLfloat)i / (GLfloat)count);
        vertexCount += 1;
    }

    // Render the vertex array
    glBindFramebuffer( GL_DRAW_FRAMEBUFFER, framebuffer);

    glClear(GL_DEPTH_BUFFER_BIT);

    glVertexPointer(2, GL_FLOAT, 0, vertexBuffer);

    glDrawArrays(GL_POINTS, 0, vertexCount);

}

最后显示缓冲区

- (void)displayBuffer
{
    DLog(@"Display");
    glBindFramebuffer( GL_READ_FRAMEBUFFER, framebuffer ); 
    glBindFramebuffer( GL_DRAW_FRAMEBUFFER, 0 ); 
    glViewport(0, 0, self.bounds.size.width, self.bounds.size.height); 
    glBlitFramebuffer( 0, 0, self.bounds.size.width, self.bounds.size.height, 0, 0, self.bounds.size.width, self.bounds.size.height, GL_COLOR_BUFFER_BIT, GL_NEAREST );
    glSwapAPPLE();
}

如果我将行glDrawArrays(GL_POINTS, 0, vertexCount);更改为glDrawArrays(GL_POINTS, 0, 1);并不重要。尽管vertexCount的值不同于1,但效果仍然相同。任何想法?

1 个答案:

答案 0 :(得分:1)

第一个可能的问题:

glVertexPointer(2, GL_FLOAT, 0, vertexBuffer);

据我所知,vertexBuffer是一个结构数组。所以错误可能是第三个参数是0但它应该是这个结构的大小。例如:

CVertex3 v[3];
...
glVertexPointer(3,GL_FLOAT,sizeof(CVertex3),v);

<强>更新

第二个可能的问题:

尝试删除glEnable(GL_DEPTH_TEST);它不会正常工作,但我想我已经在互联网上看到了类似的情况