OpenGL VAO不渲染网格

时间:2015-03-29 18:56:28

标签: c++ opengl vao

我试图用OpenGL和SDL2窗口在屏幕上绘制一个简单的形状。我的着色器没有错误,glGetError()不打印任何东西,所以我不知道问题是什么。这是我的网格类,它加载.OBJ文件并解析它们以供OpenGL渲染。

Mesh::Mesh(const std::string& filename) {
    LoadMesh(filename);
    m_size = (unsigned int) m_indices.size();

    glGenVertexArraysAPPLE(1, &m_vertex_array);
    glBindVertexArrayAPPLE(m_vertex_array);

    glGenBuffers(4, m_vertex_buffer);

    // Vertices
    glBindBuffer(GL_ARRAY_BUFFER, m_vertex_buffer[0]);
    glBufferData(GL_ARRAY_BUFFER, m_vertices.size() * sizeof(m_vertices[0]), &m_vertices[0], GL_STATIC_DRAW);

    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glEnableVertexAttribArray(0);

    // Tex Coords
    glBindBuffer(GL_ARRAY_BUFFER, m_vertex_buffer[1]);
    glBufferData(GL_ARRAY_BUFFER, m_tex_coords.size() * sizeof(m_tex_coords[0]), &m_tex_coords[0], GL_STATIC_DRAW);

    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glEnableVertexAttribArray(1);

    // Normals
    glBindBuffer(GL_ARRAY_BUFFER, m_vertex_buffer[2]);
    glBufferData(GL_ARRAY_BUFFER, m_normals.size() * sizeof(m_normals[0]), &m_normals[0], GL_STATIC_DRAW);

    glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glEnableVertexAttribArray(2);

    // Indices
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_vertex_buffer[3]);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, m_indices.size() * sizeof(m_indices[0]), &m_indices[0], GL_STATIC_DRAW);
}

void Draw() const {
    glBindVertexArrayAPPLE(m_vertex_array);
    glDrawElements(GL_TRIANGLES, m_size, GL_UNSIGNED_INT, 0);
    glBindVertexArrayAPPLE(0);
} 

void Mesh::LoadMesh(const std::string &filename) {
    std::ifstream file(("/Users/Craig/XCode/Game-Engine-2D/res/models/" + filename).c_str());
    std::string line;
    if (file.is_open()) {
        while (getline(file, line)) {
            std::vector<std::string> tokens = Util::Split(line, ' ');
            if (tokens.size() == 0 || tokens[0] == "#") {
                continue;
            } else if (tokens[0] == "v") {
                m_vertices.push_back(Vector3<float>(std::stof(tokens[1]), std::stof(tokens[2]), std::stof(tokens[3])));
            } else if (tokens[0] == "vt") {
                m_tex_coords.push_back(Vector2<float>(std::stof(tokens[1]), std::stof(tokens[2])));
            } else if (tokens[0] == "vn") {
                m_normals.push_back(Vector3<float>(std::stof(tokens[1]), std::stof(tokens[2]), std::stof(tokens[3])));
            } else if (tokens[0] == "f") {
                m_indices.push_back(std::stoi(tokens[1]) - 1);
                m_indices.push_back(std::stoi(tokens[2]) - 1);
                m_indices.push_back(std::stoi(tokens[3]) - 1);
            }
        }
        file.close();
    } else {
        std::cerr << "Error: Could not find file " << filename << std::endl;
        assert(0 != 0);
    }
}

我认为它必须是这里的东西,因为我的着色器正在编译和链接正确,只是在我调用draw方法时实际上没有绘制任何内容。如果有人有任何见解,将不胜感激。感谢

0 个答案:

没有答案