为什么glDrawElements不会渲染我的三角形?

时间:2016-03-31 21:56:18

标签: c++ opengl

我一直在youtube上关注BennyBox的3D游戏引擎教程系列。由于计算速度的原因,这个系列是用java完成的,我喜欢c ++,我按照教程一直到#15开始使用glDrawElements而不是glDrawArrays。直到现在在教程中我一直很好地将他的java代码转换为c ++,但现在我可以绘制任何东西,opengl给我没有错误。我几乎可以肯定问题是缓冲opengl的数据或告诉opengl如何缓冲数据。这是我的代码。

mainGame.cpp:

INIT:

glClearColor(0.1f, 0.0f, 0.5f, 0.0f);
glFrontFace(GL_CW);
glCullFace(GL_BACK);
glEnable(GL_CULL_FACE);
glEnable(GL_DEPTH_TEST);
glEnable(GL_FRAMEBUFFER_SRGB);

vector<Vertex> vertices;
vertices.push_back(glm::vec3(-1, 1, 0));
vertices.push_back(glm::vec3(0, -0.5f, 0));
vertices.push_back(glm::vec3(-1, -1, 0));
vertices.push_back(glm::vec3(1, 1, 0));
vertices.push_back(glm::vec3(1, -1, 0));
vertices.push_back(glm::vec3(0, 0.5, 0));

vector<unsigned short> indices;
indices.push_back(0);
indices.push_back(1);
indices.push_back(2);
indices.push_back(3);
indices.push_back(4);
indices.push_back(5);

mesh.meshInit();
mesh.addVerticies(vertices, indices);
mesh.draw();

gameLoop:

    while (_gameState != GameState::EXIT) {
        processInput();
        updateScene();
        drawScene();
        if (_TEST)
        {
            GLenum err;
            while ((err = glGetError()) != GL_NO_ERROR) {
                cout << "OpenGL error: " << err << endl;
            }
        }
    }

processInput()当前影响与opengl绘图无关,并且updateScene()仅清除屏幕,并更新转换对象,但这不是问题。我知道,因为我试着评论那个部分,并且没有任何东西仍然由opengl渲染/绘制。

drawScene:

shader.bind();
shader.setUniform("translation", transform.getTransformation());
mesh.draw();
SDL_GL_SwapWindow(_window);

以下是网格类的功能,我相信我没有发送正确的信息。

mesh.cpp:

void Mesh::meshInit()
{
    glGenVertexArrays(1, &VAO);
    glBindVertexArray(VAO);
    glGenBuffers(1, &IBO);
    glGenBuffers(1, &VBO);
}

void Mesh::addVerticies(vector<Vertex> vertices, vector<unsigned short> indices)
{
    _indices = &indices[0];

    _vSize = vertices.size() * sizeof(float);
    _iSize = indices.size() * sizeof(unsigned short);

    if (_TEST) {
        cout << "size of verticies: " << _vSize << endl;
        cout << "size of indices: " << _iSize << endl;
        cout << "number of verticies: " << vertices.size() << endl;
        cout << "number of indices: " << indices.size() << endl;
        for (int i = 0; i < vertices.size() ; i++)
        {
            cout << vertices[i].getPos().x << " ";
            cout << vertices[i].getPos().y << " ";
            cout << vertices[i].getPos().z << " ";
            cout << "\n";
        }
    }    

    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferData(GL_ARRAY_BUFFER, _vSize, &vertices[0], GL_STATIC_DRAW);

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, _iSize, &indices[0], GL_STATIC_DRAW);
}

int vertexAtribStride = Vertex::SIZE * sizeof(float);

void Mesh::draw()
{
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, vertexAtribStride, 0);
    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);
    glDrawElements(GL_TRIANGLES, _iSize, GL_INT, _indices);
    glDisableVertexAttribArray(0);
}

1 个答案:

答案 0 :(得分:2)

glDrawElements的第三个参数应该是GL_UNSIGNED_SHORT,最后一个参数应该是0,因为它是GL_ELEMENT_ARRAY_BUFFER开头的偏移量。除此之外我不知道Vertex :: SIZE是什么,但由于你只有一个属性,你可以将glVertexAttribPointer的步幅设置为0,这样OpenGL就会认为它们是紧包(它们是)

相关问题