glDrawArrays (GL_POINTS, 0, vertexCount);рисует только одну точку - PullRequest
1 голос
/ 28 марта 2012

Я использую 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;
}

Создание и привязка кадрового буфера.

- (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 Ответ

1 голос
/ 28 марта 2012

Первая возможная проблема:

glVertexPointer(2, GL_FLOAT, 0, vertexBuffer);

Как я понимаю, vertexBuffer - это массив структур. Таким образом, ошибка может заключаться в том, что третий параметр равен 0, но это должен быть размер этой структуры. Например:

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

Обновлено

Вторая возможная проблема:

попытаться удалить glEnable (GL_DEPTH_TEST); это не будет работать должным образом, но я думаю, что видел подобную ситуацию в Интернете

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...