即使没有发生错误,也不会在屏幕openGL上绘制三角形

时间:2016-10-21 10:25:13

标签: c++ opengl glfw

我写了一个简单的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"
        "}";

1 个答案:

答案 0 :(得分:-1)

之后添加这些行 glBufferData(GL_ARRAY_BUFFER,sizeof(顶点),顶点,GL_STATIC_DRAW);

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

我的意思是使用位置0而不是1 希望这有帮助