Я использую OpenGL/GLUT для реализации алгоритма рисования линии Bresenham и появления некоторых проблем с кажущимися произвольными артефактами. Вот пример:Аргументы для рисования линий OpenGL
Вот код, который я думаю, может быть уместным. Я не включал код, который заполняет буфер вершин, потому что я на 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()
, рисование линий показалось, что оно работает нормально.
На приведенном выше рисунке линия, предназначенная для рисования, была слева. Это сработало, но появились другие артефакты. Они также не находятся в буфере вершин, я проверил.
Любые идеи, из которых они происходят?
Замечательно. Работал как шарм. – Kyle