2012-11-13 65 views
0

我正在使用發現的教程here。我正在使用GLFW。我的窗口加載罰款,但調用無法在GLEW應用程序中打印OpenGL緩衝區以控制檯

GLuint vertexBuffer; 
glGenBuffers(1, &vertexBuffer); 
printf("%u\n", vertexBuffer); 

當它不寫入控制檯,它打破了,如果我關閉OpenGL窗口(而不是如果我關閉控制檯)。我猜這是指針有問題嗎?但對我來說這似乎是正確的,而且他的教程也是如此。

這裏是我的全部,非常小的.cpp(VS2012):

#define GLEW_STATIC 

#include <GL/glew.h> 
#include <GL/glfw.h> 
#include <stdio.h> 
#include <stdlib.h> 

#pragma comment(lib, "glfw.lib") 
#pragma comment(lib, "opengl32.lib") 
#pragma comment(lib, "glew32s.lib") 

int main() { 

    glfwInit(); 
    glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 3); 
    glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 2); 
    glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); 

    glfwOpenWindowHint(GLFW_WINDOW_NO_RESIZE, GL_TRUE); 
    glfwOpenWindow(800, 600, 0, 0, 0, 0, 0, 0, GLFW_WINDOW); 
    glfwSetWindowTitle("OpenGL"); 

    printf("This works"); 
    while(glfwGetWindowParam(GLFW_OPENED)) { 
     glfwSwapBuffers(); 
    } 

    glewExperimental = GL_TRUE; 
    glewInit(); 

    GLuint vertexBuffer; 
    glGenBuffers(1, &vertexBuffer); 
    printf("%u\n", vertexBuffer); 

    glfwTerminate(); 

    exit(EXIT_SUCCESS); 
} 
+0

嘗試在printf之後添加'fflush(stdout);'。 – datenwolf

回答

7

它不能寫到控制檯,因爲從來沒有達到相關的代碼。

只要打開窗口,代碼中就會出現幾乎無限的while循環。

while(glfwGetWindowParam(GLFW_OPENED)) 
{ 
    glfwSwapBuffers(); 
} 

您應該在此循環之前放置所有初始化代碼。

glewExperimental = GL_TRUE; 
glewInit(); 

並在循環之前或循環中創建緩衝區對象。實際上,當您想要將新內容加載到現有場景時,您可以在循環內部創建緩衝區對象。

GLuint vertexBuffer; 
glGenBuffers(1, &vertexBuffer); 
printf("%u\n", vertexBuffer); 

您的最終main函數可能如下所示。

int main() 
{ 
    // GLFW initialization 
    glfwInit(); 
    // ... 
    glfwOpenWindow(800, 600, 0, 0, 0, 0, 0, 0, GLFW_WINDOW); 
    glfwSetWindowTitle("My first OpenGL Application"); 

    // GLEW initialization 
    glewExperimental = GL_TRUE; 
    glewInit(); 

    // vertex buffer 
    GLuint vertexBuffer; 
    glGenBuffers(1, &vertexBuffer); 
    printf("%u\n", vertexBuffer); 

    // main loop 
    bool running = true; 
    while(running) { 
     // exit 
     if (!glfwGetWindowParam(GLFW_OPENED)) 
      running = false; 

     // display 
     glfwSwapBuffers(); 
    } 

    // clean up 
    glfwTerminate(); 
    exit(EXIT_SUCCESS); 
} 
+0

這就是定義的事件循環..我怎樣才能打印一次控制檯?將這三行放在交換緩衝區之前的while語句中並不是一個好主意.. –

+0

您應該將它放在while循環之前。我更新了代碼示例。 – danijar

+1

非常豐富。謝謝一堆。 –