我试图用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方法时实际上没有绘制任何内容。如果有人有任何见解,将不胜感激。感谢