OpenGL Артефакты рисования линий - PullRequest
2 голосов
/ 02 февраля 2012

Я использую OpenGL / GLUT для реализации алгоритма рисования линий Брезенхэма, и у меня возникают некоторые проблемы с кажущимися произвольными артефактами. Вот пример:

This should be one line

Вот код, который, я думаю, может быть актуален. Я не включил код, который заполняет буфер вершин, потому что я на 99% уверен, что он прав и переписал его. Проблема возникла одна, я начал использовать обратные вызовы мыши GLUT.

 void Line::draw()
 {
     // Bind program and buffer
     glUseProgram(program);
     glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);

     // Get position attribute location
     GLuint vertexPosLoc = glGetAttribLocation(
                               program,
                               "position");

     // Enable attribute
     glEnableVertexAttribArray(vertexPosLoc);

     // Associate vertex position with attribute
     glVertexAttribPointer(vertexPosLoc, 2, GL_FLOAT, GL_FALSE, 0, 0);

     glDrawArrays(GL_POINTS, 0, vertexDataSize);

     // Reset the program
     glDisableVertexAttribArray(vertexPosLoc);
     glBindBuffer(GL_ARRAY_BUFFER, 0);
     glUseProgram(0);
 }



 void display()
 {
     // Clear the color buffer and the depth buffer
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

     vector<Line*>::iterator it;
     for(it = lines.begin(); it < lines.end(); it++)
     {
         (*it)->draw();
     }

     // Draw the temporary line
     if(line)
     {
         line->draw();
     }

     // Swap buffers
     glutSwapBuffers();
 }

void mouseClick(int button, int state, int x, int y)
{
    int viewVals[4];
    glGetIntegerv(GL_VIEWPORT, viewVals);
    y = viewVals[3] - y;
    if(button != GLUT_LEFT_BUTTON)
    {   
        return;
    }   
    if(state == GLUT_DOWN)
    {   
        x1 = x;
        y1 = y;
    }   
    else
    {   
        lines.push_back(line);
        line = NULL;
    }   

    glutPostRedisplay();
}

void mouseMotion(int x, int y)
{
    int viewVals[4];
    glGetIntegerv(GL_VIEWPORT, viewVals);
    y = viewVals[3] - y;

    // Delete the previous line
    delete line;

    // Create a new line
    line = new Line(x1,y1,x,y);
    line->setProgram(program);

    glutPostRedisplay();
}

Идея состоит в том, что вы щелкаете точку, и линия проходит от этой точки к точке, которую вы отпускаете. До того, как я добавил эту функциональность вместе с вызовами glutPostRedisplay(), рисование линий, казалось, работало нормально.

На изображении выше линия, которая должна была быть нарисована, была линией слева. Это сработало, но появились другие артефакты. Их нет в буфере вершин, я проверял.

Есть идеи, откуда они берутся?

1 Ответ

4 голосов
/ 02 февраля 2012

Третий параметр glDrawArrays() должен быть числом точек .Возможно, вы пропускаете число с плавающей точкой?

(Это заставит вас нарисовать вдвое больше точек, чем вы намереваетесь, так как каждая вершина в буфере имеет два значения с плавающей точкой. Дополнительные точки будут иметь ненужные значения)

...