2013-11-20 74 views
0

我已經用glfw3編寫了一個簡單的程序。它編譯完美,但是當我運行它時,沒有任何渲染。只是一個空白的屏幕彈出。OpenGL 4.1對小牛隊不起作用

#include </usr/include/GL/glew.h> 
#include </usr/local/include/GLFW/glfw3.h> 
#include <stdlib.h> 
#include <stdio.h> 
static void error_callback(int error, const char* description) 
{ 
    fputs(description, stderr); 
} 
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) 
{ 
    if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) 
     glfwSetWindowShouldClose(window, GL_TRUE); 
} 
int main(void) 
{ 
    GLFWwindow* window; 
    glfwSetErrorCallback(error_callback); 
    if (!glfwInit()) 
     exit(EXIT_FAILURE); 

    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); 
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); 
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); 
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); 

    window = glfwCreateWindow(640, 480, "Simple example", NULL, NULL); 
    if (!window) 
    { 
     glfwTerminate(); 
     exit(EXIT_FAILURE); 
    } 
    glfwMakeContextCurrent(window); 
    glfwSetKeyCallback(window, key_callback); 

    //printf("OpenGL Context: %d.%d\n", glfwGetWindowParam(GLFW_CONTEXT_VERSION_MAJOR), glfwGetWindowParam(GLFW_CONTEXT_VERSION_MINOR)); 
    while (!glfwWindowShouldClose(window)) 
    { 
     float ratio; 
     int width, height; 
     glfwGetFramebufferSize(window, &width, &height); 
     ratio = width/(float) height; 
     glViewport(0, 0, width, height); 
     glClear(GL_COLOR_BUFFER_BIT); 
     glMatrixMode(GL_PROJECTION); 
     glLoadIdentity(); 
     glOrtho(-ratio, ratio, -1.f, 1.f, 1.f, -1.f); 
     glMatrixMode(GL_MODELVIEW); 
     glLoadIdentity(); 
     glRotatef((float) glfwGetTime() * 50.f, 0.f, 0.f, 1.f); 
     glBegin(GL_TRIANGLES); 
     glColor3f(1.f, 0.f, 0.f); 
     glVertex3f(-0.6f, -0.4f, 0.f); 
     glColor3f(0.f, 1.f, 0.f); 
     glVertex3f(0.6f, -0.4f, 0.f); 
     glColor3f(0.f, 0.f, 1.f); 
     glVertex3f(0.f, 0.6f, 0.f); 
     glEnd(); 
     glfwSwapBuffers(window); 
     //glfwPollEvents(); 
     glfwWaitEvents(); 
    } 
    glfwDestroyWindow(window); 
    glfwTerminate(); 
    exit(EXIT_SUCCESS); 
} 

我使用AMD Radeon HD 6490M OpenGL引擎在2011年初的Macbook Pro上運行它,並在其上安裝小牛。

移除棄用函數後,我運行的新代碼。我運行此代碼時遇到了段錯誤11。

#ifdef __APPLE__ 
#include </usr/include/GL/glew.h> 
#else 
#include <GL/glew.h> 
#endif 
#ifdef __APPLE__ 
#include </usr/local/include/GLFW/glfw3.h> 
#else 
#include <GL/glfw.h> 
#endif 
#include <stdio.h> 


float points[] = { 
    0.0f, 0.5f, 0.0f, 
    0.5f, -0.5f, 0.0f, 
    -0.5f, -0.5f, 0.0f 
}; 

const char* vertex_shader = 
"#version 400\n" 
"in vec3 vp;" 
"void main() {" 
" gl_Position = vec4 (vp, 1.0);" 
"}"; 

const char* fragment_shader = 
"#version 400\n" 
"out vec4 frag_colour;" 
"void main() {" 
" frag_colour = vec4 (0.5, 0.0, 0.5, 1.0);" 
"}"; 

int main() { 
    // start GL context and O/S window using the GLFW helper library 
    if (!glfwInit()) { 
    fprintf (stderr, "ERROR: could not start GLFW3\n"); 
    return 1; 
    } 
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); 
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); 
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); 
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); 


    GLFWwindow* window = glfwCreateWindow (640, 480, "Hello Triangle", NULL, NULL); 
    if (!window) { 
    fprintf (stderr, "ERROR: could not open window with GLFW3\n"); 
    glfwTerminate(); 
    return 1; 
    } 
    glfwMakeContextCurrent (window); 

    // start GLEW extension handler 
    glewInit(); 

    // get version info 
    const GLubyte* renderer = glGetString (GL_RENDERER); // get renderer string 
    const GLubyte* version = glGetString (GL_VERSION); // version as a string 
    printf ("Renderer: %s\n", renderer); 
    printf ("OpenGL version supported %s\n", version); 


    // tell GL to only draw onto a pixel if the shape is closer to the viewer 
    glEnable (GL_DEPTH_TEST); // enable depth-testing 
    glDepthFunc (GL_LESS); // depth-testing interprets a smaller value as "closer" 

unsigned int vbo = 0; 
glGenBuffers (1, &vbo); 
glBindBuffer (GL_ARRAY_BUFFER, vbo); 
glBufferData (GL_ARRAY_BUFFER, 9 * sizeof (float), points, GL_STATIC_DRAW); 

unsigned int vao = 0; 
glGenVertexArrays (1, &vao); 
glBindVertexArray (vao); 
glEnableVertexAttribArray (0); 
glBindBuffer (GL_ARRAY_BUFFER, vbo); 
glVertexAttribPointer (0, 3, GL_FLOAT, GL_FALSE, 0, (GLubyte*)NULL); 

unsigned int vs = glCreateShader (GL_VERTEX_SHADER); 
glShaderSource (vs, 1, &vertex_shader, NULL); 
glCompileShader (vs); 
unsigned int fs = glCreateShader (GL_FRAGMENT_SHADER); 
glShaderSource (fs, 1, &fragment_shader, NULL); 
glCompileShader (fs); 
unsigned int shader_programme = glCreateProgram(); 
glAttachShader (shader_programme, fs); 
glAttachShader (shader_programme, vs); 
glLinkProgram (shader_programme); 

while (!glfwWindowShouldClose (window)) { 
    // wipe the drawing surface clear 
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glUseProgram (shader_programme); 
    glBindVertexArray (vao); 
    // draw points 0-3 from the currently bound VAO with current in-use shader 
    glDrawArrays (GL_TRIANGLES, 0, 3); 
    // update other events like input handling 
    glfwPollEvents(); 
    // put the stuff we've been drawing onto the display 
    glfwSwapBuffers (window); 
} 
    /* OTHER STUFF GOES HERE NEXT */ 

    // close GL context and any other GLFW resources 
    glfwTerminate(); 
    return 0; 
} 
+0

MacOS X支持舊式即時模式OpenGL嗎? 你在這裏要求的核心配置文件OpenGL 3.2,不知道它是否已棄用功能... –

+0

我剛剛寫了一個答案,這個問題可能有助於http://stackoverflow.com/questions/19865463/opengl-4 -1-under-mavericks/20981827#20981827 – Martin

回答

4

您正在申請GL 3.2核心配置文件(儘管您的標題談論了4.1)。幾乎所有您使用的GL命令在覈心環境中都不可用。矩陣堆棧消失,固定功能管道消失,即時模式消失。 除glViewport()glClear()之外,您所有的GL呼叫均無效,應該只生成GL錯誤。

你必須徹底改寫它才能使其與現代GL一起工作。請注意,在OSX上,沒有兼容性配置文件。所以你要麼使用2.x上下文來獲取舊的東西,要麼刪除舊的東西就得到GL> = 3.x。

+0

我已更改代碼。我有一個新的代碼,我已經在上面添加了。我得到了分段錯誤11 – noddy

+0

我能夠通過添加一行glewExperimental = GL_TRUE使其工作;就在glfwMakeContextCurrent(window)之前; – noddy

+0

@noddy:作爲一個附註:你應該檢查'glewInit()'的返回值。 – derhass