我正在尝试使用opengl绘制一些基本三角形,但它不会在屏幕上渲染。这些是相关功能:
glewInit();
glClearColor(0.0, 0.0, 0.0, 1.0);
glFrontFace(GL_CW);
glCullFace(GL_BACK);
glEnable(GL_CULL_FACE);
glEnable(GL_DEPTH_TEST);
Vertex vertices[] = {Vertex(Vector3f(0.0, 1.0, 0.0)),
Vertex(Vector3f(-1.0, -1.0, 0.0)),
Vertex(Vector3f(1.0, -1.0, 0.0))};
mesh.addVertices(vertices, 3);
Pastebin链接到Vertex.hpp和Vector3f.hpp:
/*
* Mesh.cpp:
*/
Mesh::Mesh()
{
glGenBuffers(1, &m_vbo); // unsigned int Mesh::m_vbo
}
void Mesh::addVertices(Vertex vertices[4], int indexSize)
{
m_size = indexSize * 3;
glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
glBufferData(GL_ARRAY_BUFFER, m_size, vertices, GL_STATIC_DRAW);
}
void Mesh::draw()
{
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 4 * sizeof(Vertex), 0);
glDrawArrays(GL_TRIANGLES, 0, m_size);
glDisableVertexAttribArray(0);
}
如果我调用glClear
,则只是黑色,否则只是默认窗口的随机噪音。我可以使用最原始的方法绘制三角形:
glBegin(GL_TRIANGLES);
glColor3f(0.4, 0.0, 0.0);
glVertex2d(0.0, 0.5);
glVertex2d(-0.5, -0.5);
glVertex2d(0.5, -0.5);
glEnd();
它可以正常显示它应该做什么,所以我想至少说我的应用程序不是100%被破坏。我正在使用的教程是用Java编写的,我正在将它翻译成C ++ SFML,所以我想可能会有一些东西在翻译中丢失,除非我只是遗漏了一些非常基本的东西(更多)可能的。)
我们如何解决这个问题,以便它使用顶点列表来绘制三角形?
答案 0 :(得分:2)
这么多错误。在任何语言中都有很多例子,为什么呢?
const float pi = 3.141592653589793;
是Vector3f
的成员字段。您是否意识到这是非静态成员,并且它包含在您使用的每个Vector3f中,因此您的向量实际上有四个元素 - x,y,z和pi?你有没有告知GL,所以它可以跳过这个垃圾数据?我不这么认为。
您使用glVertexAttribPointer
,但没有活动着色器。无法保证位置位于插槽0中。可以使用glVertexPointer
,也可以使用位置属性绑定为0的着色器。
void Mesh::addVertices(Vertex vertices[4], int indexSize)
[4]
在这里应该是什么意思?虽然这不是错误,但至少是误导。
glBufferData(GL_ARRAY_BUFFER, m_size, vertices, GL_STATIC_DRAW);
m_size是3*3
,而文档说它应该是以字节为单位的数组大小 - sizeof(Vertex) * indexSize
。
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 4 * sizeof(Vertex), 0);
为什么stride
参数为4*sizeof(Vertex)
?将其设置为0或写入正确的步幅 - 即sizeof(Vertex)
。
glDrawArrays(GL_TRIANGLES, 0, m_size);
m_size已经[错误地]设置为“顶点缓冲区大小”,而DrawArrays需要绘制顶点数 - 这是m_size / sizeof(Vertex)
(给定m_size是正确计算的)。