openGL矩形渲染三角形代替?

openGL rectangle rendering triangle instead?

所以我试图在 openGL 中使用索引缓冲区渲染一个矩形,但是我得到的是一个在原点有一个顶点的三角形(即使我的矩形中没有顶点被支持到原点)。

void Renderer::drawRect(int x,int y,int width, int height)
{   

    //(Ignoring method arguments for debugging)
    float vertices[12] = {200.f, 300.f, 0.f,
                          200.f, 100.f, 0.f,
                          600.f, 100.f, 0.f,
                          600.f, 300.f, 0.f};

    unsigned int indices[6] = {0,1,3,1,2,3};

    glBindVertexArray(this->flat_shape_VAO);

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,this->element_buffer);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(indices),indices,GL_DYNAMIC_DRAW);

    glBindBuffer(GL_ARRAY_BUFFER,this->render_buffer);
    glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_DYNAMIC_DRAW);

    glEnableVertexAttribArray(0);

    glUseProgram(this->shader_program);
    glUniformMatrix4fv(this->model_view_projection_uniform,1,GL_FALSE,glm::value_ptr(this->model_view_projection_mat));
    glUniform3f(this->color_uniform,(float) this->color.r,(float)this->color.g,(float)this->color.b);
    glDrawElements(GL_TRIANGLES,6,GL_UNSIGNED_INT,nullptr);

}

我的投影矩阵工作正常我仍然可以在正确的屏幕坐标处渲染三角形。我怀疑也许我做错了索引缓冲?变换矩阵也可以正常工作,至少在我的三角形上。

编辑:

VAO 的属性在 class 构造函数中设置 glVertexAttribPointer();

编辑 2: 我完全禁用了着色器,something interesting 发生了。

这是着色器源代码: (顶点着色器)

    #version 330 core
    layout (location = 0) in vec3 aPos;
    uniform mat4 mvp;
    uniform vec3 aColor;
    out vec3 color;
    void main()
    {
       gl_Position = mvp * vec4(aPos, 1.0);
       color = aColor;

    }

(片段着色器)


    #version 330 core
    in vec3 color;
    out vec4 FragColor;
    void main()
    {
       FragColor = vec4(color,1.0f);
    }

我的投影矩阵不应该在禁用着色器的情况下工作,但我仍然在屏幕上看到三角形渲染..??

glVertexAttribPointer 的步幅参数是多少? stride 指定连续通用顶点属性之间的字节偏移量。在你的情况下它应该是 0 或 12 (3*sizeof(float)) 但如果你看你的图像它似乎是 24 因为三角形有第一个 (200, 300) 和第三个 (600, 100) 顶点和一个坐标为 (0, 0) 的顶点。

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), nullptr);

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), nullptr);