openGL矩形渲染三角形代替?

093gszye  于 2022-11-23  发布在  其他
关注(0)|答案(1)|浏览(181)

因此,我试图在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 的属性是在类构造函数中使用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);
    }

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

yqlxgs2m

yqlxgs2m1#

glVertexAttribPointer的stride参数是什么?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);

相关问题