Проблема рендеринга на разных компьютерах
Так что я делаю короткую игру об обороне башни. Я поделился сборкой с ними, чтобы я мог проверить, все ли работает на другом хосте так, как должно.
И что на самом деле происходит, так это то, что в то время как все отлично отрисовывается на моей стороне (как на моем mac / xc, ode + windows / visual studio 2012), на стороне моего друга кажется, что геометрия испорчена. Каждый объект на моем экране представлен VBO, который я использую каждый раз для рендеринга в разных местах. Но похоже, что мои VBO имеют всю геометрию, импортированную из всех моделей. (Отсюда и Башня с деревом на стороне.)
Вот результат:
(Мой компьютер)(Компьютер моего друга)
На данный момент мне удалось отладить эту проблему до определенного момента. Я могу сказать, что это не тот способ, которым я импортирую свои модели, потому что я создаю файл debug.txt со всеми векторами, прежде чем отправить их в gpu как VBO, и на обоих компьютерах они выдают одинаковые значения. Так что их векторы не запутались из-за проблем с памятью или чего-то в этом роде. Так что я думаю, может быть, это то, как я настраиваю или рендеринг своих VBO
Больше всего меня поражает то, что на моем компьютере все работает, а на компьютере моих друзей - нет. Одно из отличий, которое я точно знаю, это то, что мой компьютер - это станция разработчика (что бы это ни значило), а компьютер моего друга - нет.
Это моя функция загрузки VBO и функция рисования VBO: я использую glfw для создания своего окна и контекста и включаю заголовки glew, чтобы включить некоторые новые функции opengl.
void G4::Renderer::LoadObject(
G4::TILE_TYPES aType,
std::vector<float> &v_data,
std::vector<float> &n_data,
std::vector<float> &t_data,
float scale,
bool has_texture,
unsigned int texture_id
)
{
unsigned int vertices_id, vertices_size, normals_id, texturecoordinates_id;
vertices_size = static_cast<unsigned int>(v_data.size());
glGenBuffers(1, &vertices_id);
glGenBuffers(1, &normals_id);
//::->Vertex array buffer upload.
glBindBuffer(GL_ARRAY_BUFFER, vertices_id);
glBufferData(GL_ARRAY_BUFFER, sizeof(float)*v_data.size(), &v_data.front(), GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
//::->Normal Array buffer upload.
glBindBuffer(GL_ARRAY_BUFFER, normals_id);
glBufferData(GL_ARRAY_BUFFER, sizeof(float)*n_data.size(), &n_data.front(), GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
if (has_texture)
{
glGenBuffers(1, &texturecoordinates_id);
glBindBuffer(GL_ARRAY_BUFFER, texturecoordinates_id);
glBufferData(GL_ARRAY_BUFFER, sizeof(float)*t_data.size(), &(t_data[0]), GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
}
this->vbos[aType].Update(vertices_id, vertices_size, normals_id, texture_id, texturecoordinates_id, scale, has_texture);
}
Нарисуйте код:
void G4::Renderer::DrawUnit(G4::VBO aVBO, bool drawWithColor, float r, float g, float b, float a)
{
bool model_has_texture = aVBO.HasTexture();
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
if (model_has_texture && !drawWithColor) {
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnable(GL_TEXTURE_2D);
}
if (drawWithColor)
{
glColor4f(r, g, b, a);
}
glScalef(aVBO.GetScaleValue(), aVBO.GetScaleValue(), aVBO.GetScaleValue());
glBindBuffer(GL_ARRAY_BUFFER, aVBO.GetVerticesID());
glVertexPointer(3, GL_FLOAT, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ARRAY_BUFFER, aVBO.GetNormalsID());
glNormalPointer(GL_FLOAT, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
if (model_has_texture && !drawWithColor)
{
glBindTexture(GL_TEXTURE_2D, aVBO.GetTextureID());
glBindBuffer(GL_ARRAY_BUFFER, aVBO.GetTextureCoordsID());
glTexCoordPointer(2, GL_FLOAT, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
}
glDrawArrays(GL_TRIANGLES, 0, aVBO.GetVerticesSize());
if (model_has_texture && !drawWithColor) {
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_TEXTURE_2D);
}
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
}
У меня нет идей, я надеюсь, что кто-нибудь может подсказать мне, как отлаживать это дальше.