Я использую freeglut, windows 8, vs2012 и новейший драйвер nvidia. Но у перенасыщенных бездействующих функций странное поведение. Это ничего не делает, пока я не изменю размер окна или не нажму на окно.
Или каким-то образом перенасыщение не хочет перерисовывать экран, даже если некоторые переменные изменились.
#include <iostream>
#include <stdlib.h>
#include <GL/glut.h>
using namespace std;GLfloat rotateQuad = 0;void initRendering() {glEnable(GL_DEPTH_TEST);
}
//Called when the window is resized
void handleResize(int w, int h) {
//Tell OpenGL how to convert from coordinates to pixel values
glViewport(0, 0, w, h);}
//Draws the 3D scene
void drawScene() {
//Clear information from last draw
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW); //Switch to the drawing perspective
glLoadIdentity(); //Reset the drawing perspective
glRotatef(rotateQuad,0,0,1);
glBegin(GL_QUADS); //Begin quadrilateral coordinatesglVertex3f(-0.5f, -0.5f, 0.0f);
glVertex3f(0.5f, -0.5f, 0.0f);
glVertex3f(0.5f, 0.5f, 0.0f);
glVertex3f(-0.5f, 0.5f, 0.0f);
glEnd(); //End quadrilateral coordinatesglutSwapBuffers(); //Send the 3D scene to the screen
}
void idle(){
rotateQuad+=1;
if(rotateQuad > 360) rotateQuad=0;
}
int main(int argc, char** argv) {
//Initialize GLUT
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(400, 400); //Set the window size
//Create the window
glutCreateWindow("Quad Rotate");
initRendering(); //Initialize rendering
glutIdleFunc(idle);
glutDisplayFunc(drawScene);
glutReshapeFunc(handleResize);
glutMainLoop(); //Start the main loop
return 0;
}
Есть идеи, что пошло не так?
Ваш idle
функция просто обновляет вращение; фактически он не запрашивает перерисовку GLUT, поэтому перерисовки не происходит, пока что-то еще не вызовет ее (например, взаимодействие с окном или изменение размера). Вызов glutPostRedisplay
в вашем режиме ожидания. Увидеть: http://www.lighthouse3d.com/tutorials/glut-tutorial/glutpostredisplay-vs-idle-func/
Других решений пока нет …