当我尝试从vbo中获取颜色时,glDrawElements没有输出

问题描述

我是OpenGL的新手,我尝试扩展当前的代码,该代码使用作为统一变量提供的颜色来显示正方形,该代码将基于vbo中给出的颜色显示正方形。

int main(int argc,char **argv)
{
    //! The pointer to the GLFW window
    GLFWwindow *window;

    //! Initialize GLFW
    if (!glfwInit())
        return -1;

    glfwWindowHint(GLFW_SAMPLES,4);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR,4);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MInor,4);
    glfwWindowHint(GLFW_OPENGL_PROFILE,GLFW_OPENGL_CORE_PROFILE);

    window = glfwCreateWindow(512,512,"Testing COde",NULL,NULL);
    if (!window)
    {
        glfwTerminate();
        return -1;
    }

    glfwMakeContextCurrent(window);

    glewExperimental = GL_TRUE;
    GLenum err = glewInit();
    if (GLEW_OK != err)
    {
        std::cerr << "GLEW Init Failed : %s" << std::endl;
    }

    std::cout << "vendor: " << glGetString(GL_vendOR) << std::endl;
    std::cout << "Renderer: " << glGetString(GL_RENDERER) << std::endl;
    std::cout << "Version: " << glGetString(GL_VERSION) << std::endl;
    std::cout << "GLSL Version: " << glGetString(GL_SHADING_LANGUAGE_VERSION) << std::endl;

    // Ensure we can capture the escape key being pressed below
    glfwSetInputMode(window,GLFW_STICKY_KEYS,GL_TRUE);

    // Format (x,y,r,g,b,a)
    float position[] = {
        -0.5f,0.5f,1.0f,0.0f,-0.5f,1.0f
    };     

    uint indeces[] = {
        0,1,2,3
    };

    gluint VertexArrayID;
    glGenVertexArrays(1,&VertexArrayID);
    glBindVertexArray(VertexArrayID);

    gluint buffer;
    glGenBuffers(1,&buffer);
    glBindBuffer(GL_ARRAY_BUFFER,buffer);
    glBufferData(GL_ARRAY_BUFFER,4 * 6 * sizeof(float),position,GL_STATIC_DRAW);
    
    gluint ibo;
    glGenBuffers(1,&ibo);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,ibo);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER,3 * 2 * sizeof(uint),indeces,GL_STATIC_DRAW);

    struct shaderbundle* str_shader = parseShader("res/shaders/vertexshader.glsl","res/shaders/fragmentshader.glsl");

    uint shader = CreateShader(str_shader->vertex,str_shader->fragment);
    gluseProgram(shader);

    uint vPosition = glGetAttribLocation( shader,"position" );
    glEnabLevertexAttribArray(vPosition);
    glVertexAttribPointer(vPosition,GL_FLOAT,GL_FALSE,sizeof(float) * 6,(GLvoid*)(0));

    uint inColor = glGetAttribLocation( shader,"in_color" );
    if (inColor != -1) {
        glEnabLevertexAttribArray(inColor);
        glVertexAttribPointer(inColor,4,(GLvoid*)(2*sizeof(float)));
    }
    else {
        "no color recieved";
    }

    uint u_color = glGetUniformlocation( shader,"u_color" );
    if (u_color != -1) {
        gluniform4f(u_color,0.4f,0.6f,1.0f);
    }
    else {
        "no color recieved";
    }
    
    while (glfwWindowShouldClose(window) == 0)
    {
        glClear(GL_COLOR_BUFFER_BIT);

        // glDrawArrays(GL_TRIANGLES,3 * 2);
        glDrawElements(GL_TRIANGLES,6,GL_UNSIGNED_INT,nullptr);

        // Swap front and back buffers
        glfwSwapBuffers(window);

        // Poll for and process events
        glfwPollEvents();
    }

    glDeleteProgram(shader);

    glfwTerminate();
    return 0;
}

为此,我正在使用以下片段着色器:

#version 330 core
out vec4 color;
uniform vec4 u_color;
in  vec4 in_color;
void main() {
    // color = in_color;
    color = u_color;
};

但是当我使用in_color而不是u_color时,屏幕上什么都没有显示。位置数组的内容采用格式(x位置,y位置,r颜色,g颜色,b颜色,alpha)。因此,在glGetVertexAttribPointer中,我将跨步用作6*sizeof(float),位置的偏移量为0,颜色的偏移量为2*float。我尝试使用glGetError()进行调试,但未返回任何内容。请帮助我找出我到底在做什么错。

解决方法

您不能直接设置片段着色器输入。 in_color必须是顶点着色器输入(属性)。将顶点着色器输入传递到片段着色器。例如:

顶点着色器

#version 330 core

layout(location = 0) in vec4 position;
layout(location = 1) in vec4 in_color;

out vec4 vert_color;

void main()
{
    vert_color  = in_color;
    gl_Position = position;
}

片段着色器

#version 330 core

out vec4 color;
in vec4 vert_color;

void main() 
{
    color = vert_color;
}