2017-04-06 57 views
1

有人爲了善良告訴我這個代碼有什麼問題,它沒有顯示簡單的頂點和片段着色器的簡單多維數據集, 似乎我已經正確地初始化了gl和GLFW,創建的着色器將它們聯繫起來並鏈接它們,創建模型視圖投影矩陣,並將它們傳遞給着色器,我看不出它爲什麼不呈現。OpenGL GLFW簡單的多維數據集沒有渲染

#include <iostream> 
#include <fstream> 

#include <GL\glew.h> 
#include <GLFW\glfw3.h> 

#include <glm\glm.hpp> 
#include <glm\gtc\matrix_transform.hpp> 
#include <glm\gtc\type_ptr.hpp> 

using namespace std; 
using namespace glm; 

int g_gl_width = 800; 
int g_gl_height = 600; 
GLFWwindow* g_window = NULL; 

void glfw_error_callback(int error, const char* description) { 
    cerr << description << endl; 
} 

void glfw_window_size_callback(GLFWwindow* window, int width, int height) { 
    g_gl_width = width; 
    g_gl_height = height; 
} 

void scroll_callback(GLFWwindow* window, double xoffset, double yoffset) 
{ 

} 

void mouse_button_callback(GLFWwindow* window, int button, int action, int mods) 
{ 

} 

int main(int argc, char * argv []){ 

    glfwSetErrorCallback(glfw_error_callback); 
    if (!glfwInit()) { 
     cerr << "ERROR: could not start GLFW3\n" << endl; 
     return false; 
    } 
    g_window = glfwCreateWindow(
     g_gl_width, g_gl_height, "Extended Init.", NULL, NULL 
     ); 
    if (!g_window) { 
     cerr << "ERROR: could not open window with GLFW3\n" << endl; 
     glfwTerminate(); 
     return false; 
    } 
    glfwSetWindowSizeCallback(g_window, glfw_window_size_callback); 
    glfwMakeContextCurrent(g_window); 
    glfwSetMouseButtonCallback(g_window, mouse_button_callback); 
    glfwSetScrollCallback(g_window, scroll_callback); 

    glfwWindowHint(GLFW_SAMPLES, 4); 

    glewExperimental = GL_TRUE; 
    glewInit(); 

    const GLubyte* renderer = glGetString(GL_RENDERER); 
    const GLubyte* version = glGetString(GL_VERSION); 
    cout << "Renderer: " << renderer; 
    cout << "OpenGL version supported: " << version; 

    glEnable(GL_DEPTH_TEST); // enable depth-testing 
    glDepthFunc(GL_LESS); // depth-testing interprets a smaller value as "closer" 
    glEnable(GL_CULL_FACE); // cull face 
    glCullFace(GL_BACK); // cull back face 

    glClearColor(0.2f, 0.2f, 0.2f, 1.0f); 
    glViewport(0, 0, g_gl_width, g_gl_height); 

    GLfloat points[] = { 
     -1.0f, -1.0f, -1.0f, // triangle 1 : begin 
     -1.0f, -1.0f, 1.0f, 
     -1.0f, 1.0f, 1.0f, // triangle 1 : end 
     1.0f, 1.0f, -1.0f, // triangle 2 : begin 
     -1.0f, -1.0f, -1.0f, 
     -1.0f, 1.0f, -1.0f, // triangle 2 : end 

     1.0f, -1.0f, 1.0f, 
     -1.0f, -1.0f, -1.0f, 
     1.0f, -1.0f, -1.0f, 
     1.0f, 1.0f, -1.0f, 
     1.0f, -1.0f, -1.0f, 
     -1.0f, -1.0f, -1.0f, 

     -1.0f, -1.0f, -1.0f, 
     -1.0f, 1.0f, 1.0f, 
     -1.0f, 1.0f, -1.0f, 
     1.0f, -1.0f, 1.0f, 
     -1.0f, -1.0f, 1.0f, 
     -1.0f, -1.0f, -1.0f, 

     -1.0f, 1.0f, 1.0f, 
     -1.0f, -1.0f, 1.0f, 
     1.0f, -1.0f, 1.0f, 
     1.0f, 1.0f, 1.0f, 
     1.0f, -1.0f, -1.0f, 
     1.0f, 1.0f, -1.0f, 

     1.0f, -1.0f, -1.0f, 
     1.0f, 1.0f, 1.0f, 
     1.0f, -1.0f, 1.0f, 
     1.0f, 1.0f, 1.0f, 
     1.0f, 1.0f, -1.0f, 
     -1.0f, 1.0f, -1.0f, 

     1.0f, 1.0f, 1.0f, 
     -1.0f, 1.0f, -1.0f, 
     -1.0f, 1.0f, 1.0f, 
     1.0f, 1.0f, 1.0f, 
     -1.0f, 1.0f, 1.0f, 
     1.0f, -1.0f, 1.0f 
    }; 

    GLuint vao; 
    glGenVertexArrays(1, &vao); 
    glBindVertexArray(vao); 

    GLuint vbo; 
    glGenBuffers(1, &vbo); 
    glBindBuffer(GL_ARRAY_BUFFER, vbo); 
    glBufferData(
     GL_ARRAY_BUFFER, 
     3 * 36 * sizeof(GLfloat), 
     points, 
     GL_STATIC_DRAW 
     ); 
    glBindBuffer(GL_ARRAY_BUFFER, vbo); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); 
    glEnableVertexAttribArray(0); 

    const char* vertex_shader = 
     "#version 410\n" 
     "layout(location = 0) in vec3 vertex_position;\n" 
     "uniform mat4 model, view, projection;\n" 
     "void main() {\n" 
     " gl_Position = projection * view * model * vec4(vertex_position, 1.0);\n" 
     "}\n"; 

    const char* fragment_shader = 
     "#version 410\n" 
     "void main() {\n" 
     " gl_FragColor = vec4(1.0f, 0.0f, 0.0f, 1.0);\n" 
     "}\n"; 

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

    mat4 projection = glm::perspective(90.0f, (float)(g_gl_width/g_gl_height), 0.1f, 100.0f); 

mat4 view = glm::mat4(1.0f); 
view = glm::translate(view, vec3(0.0f, 0.0f, 0.0f)); 
view = glm::rotate(view, 0.0f, vec3(0.0f, 0.0f, 1.0f)); 
view = glm::rotate(view, 0.0f, vec3(0.0f, 1.0f, 0.0f)); 
view = glm::rotate(view, 0.0f, vec3(1.0f, 0.0f, 0.0f)); 

    mat4 model = glm::mat4(1.0f); 
    model = glm::translate(model, vec3(0.0f, 0.0f, 0.0f)); 
    model = glm::rotate(model, 0.0f, vec3(0.0f, 0.0f, 1.0f)); 
    model = glm::rotate(model, 0.0f, vec3(0.0f, 1.0f, 0.0f)); 
    model = glm::rotate(model, 0.0f, vec3(1.0f, 0.0f, 0.0f)); 

    int model_mat_location = glGetUniformLocation(shader_programme, "model"); 
    glUniformMatrix4fv(model_mat_location, 1, GL_FALSE, glm::value_ptr(model)); 
    int view_mat_location = glGetUniformLocation(shader_programme, "view"); 
    glUniformMatrix4fv(view_mat_location, 1, GL_FALSE, glm::value_ptr(view)); 
    int proj_mat_location = glGetUniformLocation(shader_programme, "projection"); 
    glUniformMatrix4fv(proj_mat_location, 1, GL_FALSE, glm::value_ptr(projection)); 
    glUseProgram(shader_programme); 

    while (!glfwWindowShouldClose(g_window)) { 
     glfwMakeContextCurrent(g_window); 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
     glViewport(0, 0, g_gl_width, g_gl_height); 
     glBindVertexArray(vao); 
     glUseProgram(shader_programme); 
     glDrawArrays(GL_TRIANGLES, 0, 36); 
     if (GLFW_PRESS == glfwGetKey(g_window, GLFW_KEY_ESCAPE)) { 
      glfwSetWindowShouldClose(g_window, 1); 
     } 
     glfwPollEvents(); 
     glfwSwapBuffers(g_window); 
    } 
    glfwTerminate(); 
    return 0; 
} 

編輯:

我也想指出,我在代碼中還有另外一個錯誤的

mat4 view = glm::mat4(1.0f); 
glm::translate(view, vec3(0.0f, 0.0f, 0.0f)); 
glm::rotate(view, 0.0f, vec3(0.0f, 0.0f, 1.0f)); 
glm::rotate(view, 0.0f, vec3(0.0f, 1.0f, 0.0f)); 
glm::rotate(view, 0.0f, vec3(1.0f, 0.0f, 0.0f)); 

應該是:

mat4 view = glm::mat4(1.0f); 
view = glm::translate(view, vec3(0.0f, 0.0f, 0.0f)); 
view = glm::rotate(view, 0.0f, vec3(0.0f, 0.0f, 1.0f)); 
view = glm::rotate(view, 0.0f, vec3(0.0f, 1.0f, 0.0f)); 
view = glm::rotate(view, 0.0f, vec3(1.0f, 0.0f, 0.0f)); 

和型號也。

回答

2

問題可能出現在這裏的代碼中。

int model_mat_location = glGetUniformLocation(shader_programme, "model"); 
glUniformMatrix4fv(model_mat_location, 1, GL_FALSE, glm::value_ptr(model)); 
int view_mat_location = glGetUniformLocation(shader_programme, "view"); 
glUniformMatrix4fv(view_mat_location, 1, GL_FALSE, glm::value_ptr(view)); 
int proj_mat_location = glGetUniformLocation(shader_programme, "projection"); 
glUniformMatrix4fv(proj_mat_location, 1, GL_FALSE, glm::value_ptr(projection)); 
glUseProgram(shader_programme); 

您需要之前調用glUseProgram你試圖對統一的值進行任何更改。 location變量爲每個着色器獨立分配,這意味着對於程序1,位置將在[0,1,2,3,...]範圍內,對於程序2,位置也將在[ 0,1,2,3,...]。因此,在沒有活動程序的情況下調用glUniform*意味着OpenGL不知道您正在更新制服的程序,因此不知道如何應用您傳遞的值。

此外,您可能需要更改此代碼,以及:

mat4 view = glm::mat4(1.0f); 
glm::translate(view, vec3(0.0f, 0.0f, 0.0f)); 
glm::rotate(view, 0.0f, vec3(0.0f, 0.0f, 1.0f)); 
glm::rotate(view, 0.0f, vec3(0.0f, 1.0f, 0.0f)); 
glm::rotate(view, 0.0f, vec3(1.0f, 0.0f, 0.0f)); 

雖然沒有什麼根本不對的代碼,這是怎麼回事把相機的立方體內。啓用面部剔除功能後,您可能無法真正看到任何東西,因爲所有面部都會背對着你。出於測試目的,請考慮使用glm::lookAt

mat4 view = glm::lookAt(vec3(3, 3, 1), vec3(0, 0, 0), vec3(0, 1, 0)); 
+0

非常感謝你,我添加了你的兩個建議,它的工作! – Akef