OpenGL顶点数组无法渲染

时间:2014-06-26 12:51:05

标签: c++ opengl

我正在尝试使用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:

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,所以我想可能会有一些东西在翻译中丢失,除非我只是遗漏了一些非常基本的东西(更多)可能的。)

我们如何解决这个问题,以便它使用顶点列表来绘制三角形?

1 个答案:

答案 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是正确计算的)。