2009-04-14 7 views
1

J'essaye de démarrer avec GLFW sur Debian, j'ai essayé de compiler et d'exécuter un exemple de programme mais il refuse de fonctionner. Avec l'aide de quelques instructions printf, j'ai trouvé que lorsque le programme essaie d'ouvrir une fenêtre GLFW, il échoue, puis se termine - mais je ne sais pas pourquoi. Toute aide serait incroyable.C - Fenêtre GLFW ne s'ouvre pas sur Debian

#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; 
} 
+1

Vous n'avez pas besoin de commenter les lignes explicites. – mk12

Répondre

1

Vous êtes sûr que c'est glfwOpenWindow qui échoue? Je ne sais pas pourquoi cela pourrait être, peut-être que vous utilisez trop de bits pour votre z-buffer? C'est la seule chose à laquelle je peux penser.

Essayez cette

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

Et voir si elle échoue encore.

+0

GLFW met en correspondance le format de pixel requis avec ceux disponibles sur le système et ne nécessite aucune correspondance exacte pour toute profondeur de bits de canal, ce qui ne peut pas provoquer l'échec de 'glfwOpenWindow'. – elmindreda

Questions connexes