我正在编写一个使用OpenGL进行3D渲染的程序,到目前为止,我一直在使用Ubuntu进行编程,一切都很好。但是,我不得不改为Windows,而且令我惊讶的是用于渲染立方体,四边形或其他任何东西的代码,因为它工作得非常好,完全没有渲染。
为了测试代码确实是相同的,我拿了我在Windows上的副本,再次在Ubuntu上完成了重建,并且它按预期工作。
所以,在我试图看到我可能出错的地方时,我调试了几次调试器以查看是否没有发生任何奇怪的内存泄漏或类似的东西,我确认内存很好
OpenGL上下文正在创建中,因为显示的颜色清晰,所以我真的不知道可能出现的问题。
渲染代码如下:
void render(Handle<Model> _model)
{
if(!_model->created && _model->loaded)
{
glGenVertexArrays(1, &_model->VAO);
glGenBuffers(1, &_model->VBO);
glGenBuffers(1, &_model->EBO);
glBindVertexArray(_model->VAO);
glBindBuffer(GL_ARRAY_BUFFER, _model->VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex) * _model->vertices.size(), &_model->vertices[0], GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _model->EBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int) * _model->indices.size(), &_model->indices[0], GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)(3*sizeof(float)));
glEnableVertexAttribArray(1);
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)(6*sizeof(float)));
glEnableVertexAttribArray(2);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
_model->created = true;
}
if(_model->loaded && _model->created)
{
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture);
_model->shader.useProgram();
_model->shader.setMat4("transform", _model->transform);
_model->shader.setMat4("view", this->view);
_model->shader.setMat4("projection", this->projection);
glBindVertexArray(_model->VAO);
glDrawElements(GL_TRIANGLES, _model->indices.size(), GL_UNSIGNED_INT, 0);
glBindVertexArray(0);
if(glGetError() != GL_NO_ERROR)
{
std::cout << "erro" << std::endl;
}
}
}
Handle或多或少是一个指针包装器,而Model结构只是一堆数据:
struct Model
{
unsigned int VAO;
unsigned int VBO;
unsigned int EBO;
std::vector<unsigned int> indices;
Shader shader;
glm::mat4 transform;
std::vector<Vertex> vertices;
bool created;
bool loaded;
};
此代码适用于Ubuntu而不是Windows的事实让我感到疯狂。