2012-02-01 1 views
2

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

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(), рисование линий показалось, что оно работает нормально.

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

Любые идеи, из которых они происходят?

ответ

4

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

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

+0

Замечательно. Работал как шарм. – Kyle