2014-10-03 29 views
0

我試圖爲OpenGL工作設置跨平臺的代碼庫,下面的代碼在我的硬盤的Windows 7分區上繪製得很好。然而,在小牛隊,我只能看到黑屏,無法弄清楚原因。我已經嘗試了指南中提到的所有內容以及相關問題,但目前爲止沒有任何工作!希望我只是錯過了一些明顯的東西,因爲我對OpenGL還很陌生。OpenGL沒有用GLFW和GLLoadGen繪製小牛

#include "stdafx.h" 

#include "gl_core_4_3.hpp" 
#include <GLFW/glfw3.h> 

int main(int argc, char* argv[]) 
{ 
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, 1); 
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); 
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); 
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); 

    if (!glfwInit()) 
    { 
     fprintf(stderr, "ERROR"); 
     glfwTerminate(); 
     return 1; 
    } 

    GLFWwindow* window = glfwCreateWindow(640, 480, "First GLSL Triangle", nullptr, nullptr); 
    if (!window) 
    { 
     fprintf(stderr, "ERROR"); 
     glfwTerminate(); 
     return 1; 
    } 

    glfwMakeContextCurrent(window); 

    gl::exts::LoadTest didLoad = gl::sys::LoadFunctions(); 
    if (!didLoad) 
    { 
     fprintf(stderr, "ERROR"); 
     glfwTerminate(); 
     return 1; 
    } 

    printf("Number of functions that failed to load: %i\n", didLoad.GetNumMissing()); // This is returning 16 on Windows and 82 on Mavericks, however i have no idea how to fix that. 

    gl::Enable(gl::DEPTH_TEST); 
    gl::DepthFunc(gl::LESS); 

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

    GLuint vbo = 0; 
    gl::GenBuffers(1, &vbo); 
    gl::BindBuffer(gl::ARRAY_BUFFER, vbo); 
    gl::BufferData(gl::ARRAY_BUFFER, sizeof(points) * sizeof(points[0]), points, gl::STATIC_DRAW); 

    GLuint vao = 0; 
    gl::GenVertexArrays(1, &vao); 
    gl::BindVertexArray(vao); 
    gl::EnableVertexAttribArray(0); 
    gl::BindBuffer(gl::ARRAY_BUFFER, vbo); 
    gl::VertexAttribPointer(0, 3, gl::FLOAT, 0, 0, NULL); 

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

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

    GLuint vs = gl::CreateShader(gl::VERTEX_SHADER); 
    gl::ShaderSource(vs, 1, &vertexShader, nullptr); 
    gl::CompileShader(vs); 

    GLuint fs = gl::CreateShader(gl::FRAGMENT_SHADER); 
    gl::ShaderSource(fs, 1, &fragmentShader, nullptr); 
    gl::CompileShader(fs); 

    GLuint shaderProgram = gl::CreateProgram(); 
    gl::AttachShader(shaderProgram, fs); 
    gl::AttachShader(shaderProgram, vs); 
    gl::LinkProgram(shaderProgram); 

    while (!glfwWindowShouldClose(window)) 
    { 
     gl::ClearColor(0, 0, 0, 0); 
     gl::Clear(gl::COLOR_BUFFER_BIT | gl::DEPTH_BUFFER_BIT); 
     gl::UseProgram(shaderProgram); 
     gl::BindVertexArray(vao); 

     gl::DrawArrays(gl::TRIANGLES, 0, 3); 

     glfwPollEvents(); 
     glfwSwapBuffers(window); 
    } 

    glfwTerminate(); 
    return 0; 
} 

編譯通過Xcode中,採用了2013的Macbook Mini的英特爾高清顯卡5000。這可能也是值得注意的是,GLLoadGen GetNumMissing()方法是在OSX返回82層失蹤的功能,我不知道這是爲什麼或如何解決它。 GLFW包含gl.h而不是gl3.h,但是強制它包含gl3.h,方法是聲明所需的宏輸出關於包含頭文件和仍然沒有文件的警告。任何幫助或建議都會很棒。

+1

在調用任何其他GLFW函數之前,您必須調用'glfwInit'。 – datenwolf 2014-10-03 12:23:36

+0

@datenwolf這樣做會導致它在GLFWwindow * window = glfwCreateWindow(...)上出錯,它似乎不會在下一個if語句中創建如此退出。 – 2014-10-03 12:27:13

+1

那麼,知道有一些錯誤只有一半的交易。你也應該報告發生了哪些錯誤。 http://www.glfw.org/docs/latest/group__error.html – datenwolf 2014-10-03 13:31:25

回答

2

你必須調用glfwInit調用任何其它GLFW函數之前,另外註冊一個錯誤回調,這樣明白爲什麼一定GLFW操作失敗診斷你需要一個MacOS X Mavericks不支持的OpenGL配置文件,但是在設置窗口提示後重新設置glfwInit會重置該選項,所以爲什麼你得到一個窗口+上下文,但不是所需的配置文件。前面的解決了這個問題,但是現在由於缺乏OS支持,您的窗口+上下文創建失敗。

+0

非常感謝。幾小時的頭痛消失了! – 2014-10-03 16:20:20

0

在每次openGL調用後,檢查是否沒有錯誤(使用glGetError或gl :: GetError。使用着色器時,必須檢查它們是否已正確編譯,可能有錯誤。以及(glGetShader和glShaderInfoLog)執行相同的鏈接階段。