因此,我试图在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);
}
我的投影矩阵不应该在禁用着色器的情况下工作,但我仍然在屏幕上看到一个三角形渲染...??
1条答案
按热度按时间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);