Это скопировано прямо из книги?Если это так, я предлагаю вам прекратить читать это!Практически во всех случаях любые вызовы рисования должны выполняться между началом и концом DisplayFunc.Поэтому вы должны изменить свою программу на:
float xf, yf, xs, ys;
int flag=0;
void setupmywindow()
{
glClearColor(0,0,0,0);
gluOrtho2D(0,100,0,100);
}
void myDisplay()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3(1.0f, 1.0f, 1.0f);
if( flag == 1)
{
glBegin(GL_LINES);
glVertex2f(xf, yf);
glVertex2f(xs, ys);
glEnd() ;
}
glLogicOp(GL_XOR);
glBegin(GL_LINES);
glVertex2f(xf, yf);
glVertex2f(xs, ys);
glEnd();
glLogicOp(GL_COPY);
glutSwapBuffers();
}
void move(int x, int y)
{
xf = x/500.0f;
yf = (500.0f-y)/500.0f;
xs = x/500.0f;
ys = (500.0f-y)/500.0f;
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
glutInitWindowSize(500,500);
glutCreateWindow("My window");
setupmywindow();
glutDisplayFunc(myDisplay);
glutPassiveMotionFunc(move);
glutMainLoop();
}
РЕДАКТИРОВАТЬ: Вилле Крумлинде, конечно, прав, вы не можете сделать glLogicOp в предложениях Begin и End, я обновил приведенный выше код, чтобы включить исправление.