简体   繁体   中英

C - GLFW window doesn't open on Debian

I'm trying to get started with GLFW on Debian, I've tried compiling and running an example program but it refuses to run. With the help of a couple of printf statements I've found that when the program tries to open a GLFW window it fails, then exits - but I don't know why. Any help would be amazing.

#include <stdlib.h>    // For malloc() etc.
#include <stdio.h>     // For printf(), fopen() etc.
#include <math.h>      // For sin(), cos() etc.
#include <GL/glfw.h>   // For GLFW, OpenGL and GLU


//----------------------------------------------------------------------
// Draw() - Main OpenGL drawing function that is called each frame
//----------------------------------------------------------------------

void Draw( void )
{
    int    width, height;  // Window dimensions
    double t;              // Time (in seconds)
    int    k;              // Loop counter

    // Get current time
    t = glfwGetTime();

    // Get window size
    glfwGetWindowSize( &width, &height );

    // Make sure that height is non-zero to avoid division by zero
    height = height < 1 ? 1 : height;

    // Set viewport
    glViewport( 0, 0, width, height );

    // Clear color and depht buffers
    glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

    // Set up projection matrix
    glMatrixMode( GL_PROJECTION );    // Select projection matrix
    glLoadIdentity();                 // Start with an identity matrix
    gluPerspective(                   // Set perspective view
        65.0,                         // Field of view = 65 degrees
        (double)width/(double)height, // Window aspect (assumes square pixels)
        1.0,                          // Near Z clipping plane
        100.0                         // Far Z clippling plane
    );

    // Set up modelview matrix
    glMatrixMode( GL_MODELVIEW );     // Select modelview matrix
    glLoadIdentity();                 // Start with an identity matrix
    gluLookAt(                        // Set camera position and orientation
        0.0, 0.0, 10.0,               // Camera position (x,y,z)
        0.0, 0.0, 0.0,                // View point (x,y,z)
        0.0, 1.0, 0.0                 // Up-vector (x,y,z)
    );


// **** Draw a circle of points ***

// Save the current modelview matrix on the stack
glPushMatrix();

// Translate (move) the points to the upper left of the display
glTranslatef( -4.0f, 3.0f, 0.0f );

// Rotate the points about the z-axis and the x-axis
glRotatef( 35.0f * (float)t, 0.0f, 0.0f, 1.0f );
glRotatef( 60.0f * (float)t, 1.0f, 0.0f, 0.0f );

// Now draw the points - we use a for-loop to build a circle
glColor3f( 1.0f, 1.0f, 1.0f );
glBegin( GL_POINTS );
for( k = 0; k < 20; k ++ )
{
    glVertex3f( 2.0f * (float)cos( 0.31416 * (double)k ),
                2.0f * (float)sin( 0.31416 * (double)k ),
                0.0f );
}
glEnd();

// Restore modelview matrix
glPopMatrix();


// **** Draw a circle of lines ***

// Save the current modelview matrix on the stack
glPushMatrix();

// Translate (move) the lines to the upper right of the display
glTranslatef( 4.0f, 3.0f, 0.0f );

// Rotate the points about the z-axis and the x-axis
glRotatef( 45.0f * (float)t, 0.0f, 0.0f, 1.0f );
glRotatef( 55.0f * (float)t, 1.0f, 0.0f, 0.0f );

// Now draw the lines - we use a for-loop to build a circle
glBegin( GL_LINE_LOOP );
for( k = 0; k < 20; k ++ )
{
    glColor3f( 1.0f, 0.05f * (float)k, 0.0f );
    glVertex3f( 2.0f * (float)cos( 0.31416 * (double)k ),
                2.0f * (float)sin( 0.31416 * (double)k ),
                0.0f );
}
glEnd();

// Restore modelview matrix
glPopMatrix();


// **** Draw a disc using trinagles ***

// Save the current modelview matrix on the stack
glPushMatrix();

// Translate (move) the triangles to the lower left of the display
glTranslatef( -4.0f, -3.0f, 0.0f );

// Rotate the triangles about the z-axis and the x-axis
glRotatef( 25.0f * (float)t, 0.0f, 0.0f, 1.0f );
glRotatef( 75.0f * (float)t, 1.0f, 0.0f, 0.0f );

// Now draw the triangles - we use a for-loop to build a disc
// Since we are building a triangle fan, we also specify a first
// vertex for the centre point of the disc.
glBegin( GL_TRIANGLE_FAN );
glColor3f( 0.0f, 0.5f, 1.0f );
glVertex3f( 0.0f, 0.0f, 0.0f );
for( k = 0; k < 21; k ++ )
{
    glColor3f( 0.0f, 0.05f * (float)k, 1.0f );
    glVertex3f( 2.0f * (float)cos( 0.31416 * (double)k ),
                2.0f * (float)sin( 0.31416 * (double)k ),
                0.0f );
}
glEnd();

// Restore modelview matrix
glPopMatrix();


// **** Draw a disc using a polygon ***

// Save the current modelview matrix on the stack
glPushMatrix();

// Translate (move) the polygon to the lower right of the display
glTranslatef( 4.0f, -3.0f, 0.0f );

// Rotate the polygon about the z-axis and the x-axis
glRotatef( 65.0f * (float)t, 0.0f, 0.0f, 1.0f );
glRotatef( -35.0f * (float)t, 1.0f, 0.0f, 0.0f );

// Now draw the polygon - we use a for-loop to build a disc
glBegin( GL_POLYGON );
for( k = 0; k < 20; k ++ )
{
    glColor3f( 1.0f, 0.0f, 0.05f * (float)k );
    glVertex3f( 2.0f * (float)cos( 0.31416 * (double)k ),
                2.0f * (float)sin( 0.31416 * (double)k ),
                0.0f );
}
glEnd();

// Restore modelview matrix
glPopMatrix();


// **** Draw a single quad ***

// Save the current modelview matrix on the stack
glPushMatrix();

// Rotate the quad about the y-axis
glRotatef( 60.0f * (float)t, 0.0f, 1.0f, 0.0f );

// Now draw the quad
glBegin( GL_QUADS );
glColor3f( 1.0f, 0.0f, 0.0f );
glVertex3f( -1.5f, -1.5f, 0.0f );
glColor3f( 1.0f, 1.0f, 0.0f );
glVertex3f(  1.5f, -1.5f, 0.0f );
glColor3f( 1.0f, 0.0f, 1.0f );
glVertex3f(  1.5f,  1.5f, 0.0f );
glColor3f( 0.0f, 0.0f, 1.0f );
glVertex3f( -1.5f,  1.5f, 0.0f );
glEnd();

// Restore modelview matrix
glPopMatrix();
}


//----------------------------------------------------------------------
// main() - Program entry point
//----------------------------------------------------------------------

int main( int argc, char **argv )
{
int    ok;             // Flag telling if the window was opened
int    running;        // Flag telling if the program is running

// Initialize GLFW
glfwInit();
// Open window
ok = glfwOpenWindow(
    100, 100,          // Width and height of window
    8, 8, 8,           // Number of red, green, and blue bits for color buffer
    8,                 // Number of bits for alpha buffer
    24,                // Number of bits for depth buffer (Z-buffer)
    0,                 // Number of bits for stencil buffer
    GLFW_WINDOW        // We want a desktop window (could be GLFW_FULLSCREEN)
);

        printf("here");
// If we could not open a window, exit now
if( !ok )
{
    glfwTerminate();
    return 0;
}
printf("not here");


// Set window title
glfwSetWindowTitle( "My OpenGL program" );

// Enable sticky keys
glfwEnable( GLFW_STICKY_KEYS );

// Main rendering loop
do
{
    // Call our rendering function
    Draw();

    // Swap front and back buffers (we use a double buffered display)
    glfwSwapBuffers();

    // Check if the escape key was pressed, or if the window was closed
    running = !glfwGetKey( GLFW_KEY_ESC ) &&
              glfwGetWindowParam( GLFW_OPENED );
}
while( running );

// Terminate GLFW
glfwTerminate();

// Exit program
return 0;
}

You're sure it's glfwOpenWindow that's failing? I don't know why that might be, perhaps you're using too many bits for your z-buffer? That's the only thing I can think of.

Try this

GLFWvidmode dvm;
glfwGetDesktopMode(&dvm);
glfwOpenWindow(winWidth, winHeight, dvm.RedBits, dvm.GreenBits, dvm.BlueBits, 0, 0, 0, GLFW_WINDOW);

And see if it still fails.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM