2016-10-21 57 views
1

我寫了一個簡單的openGL程序在屏幕上繪製一個三角形。我已經用glGetError()進行了調試,現在代碼中沒有錯誤,但是當我嘗試運行它時,只會出現黑屏。即使在沒有錯誤發生的情況下也不會在屏幕上繪製三角形

這是我的代碼。我正在使用GLFW進行窗口創建。

#include<glew.h> 
#include<glfw3.h> 
#include<stdio.h> 

int main(int argc, char ** argv) 
{ 
    glfwInit(); 
    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); 
    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE); 

    GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL", nullptr,   nullptr); 
    glfwMakeContextCurrent(window); 

    glewExperimental = GL_TRUE; 
    glewInit(); 

    float vertices[] = { 
     0.0f, 0.5f, 
     0.5f, -0.5f, 
     -0.5f, -0.5f 
    }; 
    GLuint vao; 
    glGenVertexArrays(1, &vao); 
    glBindVertexArray(vao); 
    GLuint vbo; 
    glGenBuffers(1, &vbo); 
    glBindBuffer(GL_ARRAY_BUFFER, vbo); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); 

    const GLchar * vs = 
     "#version 150\n" 
     "in vec2 position;\n" 
     "void main() {\n" 
     "vec4 gl_Position = vec4(position , 0.0 , 1.0);\n" 
     "}"; 

    const GLchar * fs = 
     "#version 150\n" 
     "out vec4 out_color; \n" 
     "void main() { \n" 
     "out_color = vec4(1.0, 1.0, 1.0, 1.0);\n" 
     "}"; 

    GLuint vsh = glCreateShader(GL_VERTEX_SHADER); 
    glShaderSource(vsh, 1, &vs, NULL); 
    glCompileShader(vsh); 
    GLint status; 
    glGetShaderiv(vsh, GL_COMPILE_STATUS, &status); 
    if (status == GL_TRUE) printf("Vertex Shader Compiled success\n"); 

    GLuint fsh = glCreateShader(GL_FRAGMENT_SHADER); 
    glShaderSource(fsh, 1, &fs, NULL); 
    glCompileShader(fsh); 
    glGetShaderiv(fsh, GL_COMPILE_STATUS, &status); 
    if (status == GL_TRUE) printf("Fragment Shader Compiled success\n"); 

    GLuint sp = glCreateProgram(); 
    glAttachShader(sp, vsh); 
    glAttachShader(sp, fsh); 
    glBindFragDataLocation(sp, 0, "out_color"); 
    glBindAttribLocation(sp,1,"position"); 
    glLinkProgram(sp); 
    glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, 0); 
    glEnableVertexAttribArray(1); 

    glUseProgram(sp); 

    while (!glfwWindowShouldClose(window)) 
    { 
     glClear(GL_COLOR_BUFFER_BIT); 
     glDrawArrays(GL_TRIANGLES, 0, 3); 
     glfwSwapBuffers(window); 
     glfwPollEvents(); 
    } 
    glfwTerminate(); 
    return 0;  
} 

更新 我已經縮小了問題的代碼

GLint pos = glGetAttribLocation(sp, "position") //sp is shader program 

的問題是它返回-1只是一條線。我已經閱讀過教程,如果你不使用變量,它將被編譯器優化。我已經在代碼中使用了的位置,那麼它爲什麼會被拋棄。以下是我的頂點着色器。

const GLchar * vs = 
     "#version 150\n" 
     "in vec2 position;\n" 
     "void main() {\n" 
     "vec4 gl_Position = vec4(position , 0.0 , 1.0);\n" 
     "}"; 
+0

您的三角形的頂點順時針走,這是一般不會做正確的事。不知道這是否是真正的原因。 – hidefromkgb

+0

@hidefromkgb我發現了花葯線索。 'glGetError()'在'glLinkProgram()'行上給出錯誤。 –

+0

這樣更好。現在你可以調用['glGetProgramInfoLog()'](https://www.opengl.org/wiki/OpenGL_Shading_Language#Error_Checking)來找出發生了什麼。 – hidefromkgb

回答

-1

剛過 glBufferData添加這些行(GL_ARRAY_BUFFER,的sizeof(頂點),頂點GL_STATIC_DRAW);

glEnableVertexAttribArray(0); glVertexAttribPointer(0,2,GL_FLOAT,GL_FALSE,0,0);

我的意思是使用位置0而不是1只 希望這有助於

相關問題