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

Triangles not being drawn on screen openGL even when no error is occurred

本文关键字:屏幕 openGL 绘制 三角形 错误      更新时间:2023-10-16

我写了一个简单的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 150n"
        "in vec2 position;n"
        "void main() {n"
        "vec4 gl_Position = vec4( position , 0.0 , 1.0 );n"
        "}";
    const GLchar * fs =
         "#version 150n"
         "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 successn");
    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 successn");
    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 150n"
        "in vec2 position;n"
        "void main() {n"
        "vec4 gl_Position = vec4( position , 0.0 , 1.0 );n"
        "}";

只需在后面添加这些行glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

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

我的意思是使用位置0而不是1希望对大家有所帮助