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);
所以我试图在 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);