2009-04-14 25 views
1

我想在Debian上开始使用GLFW,我试过编译和运行一个示例程序,但它拒绝运行。在几个printf语句的帮助下,我发现当程序试图打开一个GLFW窗口时失败,然后退出 - 但我不知道为什么。任何帮助将是惊人的。C - GLFW窗口不能在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

您不需要对自解释行进行评论。 – mk12 2010-08-02 16:23:14

回答

1

你确定这是glfwOpenWindow失败了吗?我不知道为什么会这样,也许你的Z缓冲区使用了太多的位?这是我能想到的唯一的事情。

试试这个

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

,看看它是否仍然失败。

+0

GLFW将请求的像素格式与系统上可用的像素格式匹配,并且不需要任何通道位深度的精确匹配,因此这不会导致`glfwOpenWindow`失败。 – elmindreda 2012-08-20 13:38:35