我正在尝试使用 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,所以我想可以这么说,翻译过程中可能会丢失一些东西,除非我只是遗漏了一些非常基本的东西(更多可能。)
我们如何解决这个问题,以便它使用 Vertex 列表来绘制三角形?
最佳答案
错误太多了。确实有很多例子,用任何语言都可以,那为什么呢?
const float pi = 3.141592653589793;
是Vector3f
的成员域。您是否意识到这是非静态成员并且它包含在您使用的每个 Vector3f 中,因此您的 vector 实际上有四个元素 - x、y、z 和 pi?您是否通知 GL,以便它可以跳过这些垃圾数据?我不这么认为。
您使用 glVertexAttribPointer
,但没有事件着色器。不能保证位置在插槽 0 中。要么使用 glVertexPointer
,要么使用位置属性绑定(bind)到 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 (顶点)
(假设 m_size 计算正确)。
关于c++ - OpenGL顶点数组不渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24431033/