Question

I'm just starting out with freeglut and glew and getting it running was already quite hard for me. So now I started coding with tutorials from swiftless and I had a square displayed worked fine. Now I got to the point where I want to make the square move with the arrow keys.

From the point I inserted the glutIdleFunc it started lagging. I cant move the window or click on anything else for about a minute. If I try draging the window then it moves after about 2 min.

I tried doing this with the following code :

#include <GL/glew.h> 
#include <GL/glut.h>

bool* keyStates = new bool[256]; 
float positionX = 0;
void renderPrimitive (void) 
{
    glBegin(GL_QUADS);
    glVertex3f(-1.0f, -1.0f, 0.0f); // The bottom left corner
    glVertex3f(-1.0f, 1.0f, 0.0f); // The top left corner
    glVertex3f(1.0f, 1.0f, 0.0f); // The top right corner
    glVertex3f(1.0f, -1.0f, 0.0f); // The bottom right corner
    glEnd();
}
void keySpecial (int key, int x, int y) 
{
    if (keyStates[GLUT_KEY_RIGHT]) 
    {   
        positionX++;
    }
}

void display (void) 
{

    glClearColor(1.0f, 0.0f, 0.0f, 1.0f); // Clear the background of our window to red
    glClear(GL_COLOR_BUFFER_BIT); //Clear the colour buffer (more buffers later on)
    glLoadIdentity(); // Load the Identity Matrix to reset our drawing locations
    glTranslatef(0.0f, 0.0f, -5.0f);
    renderPrimitive();
    glFlush(); // Flush the OpenGL buffers to the window
}

void reshape (int width, int height)
{
    glViewport(0, 0, (GLsizei)width, (GLsizei)height); // Set our viewport to the size of our window
    glMatrixMode(GL_PROJECTION); // Switch to the projection matrix so that we can manipulate how our scene is viewed
    glLoadIdentity(); // Reset the projection matrix to the identity matrix so that we don't get any artifacts (cleaning up)
    gluPerspective(60, (GLfloat)width / (GLfloat)height, 1.0, 100.0); // Set the Field of view angle (in degrees), the aspect ratio of our window, and the new and far planes
    glMatrixMode(GL_MODELVIEW); // Switch back to the model view matrix, so that we can start drawing shapes correctly
}

void keyPressed (unsigned char key, int x, int y) 
{
    keyStates[key] = true; // Set the state of the current key to pressed
}

void keyUp (unsigned char key, int x, int y)
{
    keyStates[key] = false; // Set the state of the current key to not pressed
}

int main (int argc, char **argv) 
{
    glutInit(&argc, argv); // Initialize GLUT
    glutInitDisplayMode (GLUT_SINGLE); // Set up a basic display buffer (only single buffered for now)
    glutInitWindowSize (500, 500); // Set the width and height of the window
    glutInitWindowPosition (100, 100); // Set the position of the window
    glutCreateWindow ("Your first OpenGL Window"); // Set the title for the window

    glutDisplayFunc(display); // Tell GLUT to use the method "display" for rendering

    glutReshapeFunc(reshape); // Tell GLUT to use the method "reshape" for reshaping
    glutIdleFunc(display);
    glutKeyboardFunc(keyPressed); // Tell GLUT to use the method "keyPressed" for key presses
    glutKeyboardUpFunc(keyUp); // Tell GLUT to use the method "keyUp" for key up events
    glutSpecialFunc(keySpecial);
    glutMainLoop(); // Enter GLUT's main loop
}

I don't expect this to be a hardware problem since my computer can play big games.

Was it helpful?

Solution

You should avoid doing any GL drawing in the idle function. If you want to redraw your scene continuously, use an idle function like

void idle(void)
{
    glutPostRedisplay();
}

and see if that helps.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top