所以我做了一個缺乏塔防遊戲。我與他們共享一個構建,所以我可以檢查是否一切正常,因爲它應該在另一臺主機上。不同電腦的渲染問題
實際情況是,雖然所有東西都完美地呈現在我身邊(在我的mac/xcode + windows/visual studio 2012上),但在我的朋友那邊,似乎幾何圖形已經搞砸了。我的屏幕上的每個對象都由一個VBO表示,我每次都使用它來渲染到不同的位置。但是,似乎我的維也納組織有從所有模型導入的所有幾何圖形。 (。因此,塔與一側的樹)
這裏的結果:
(我的電腦)(我的朋友的電腦)
正如現在我已經成功地調試這個問題直到某個點。我可以告訴它不是我導入我的模型的方式,因爲我在創建一個帶有所有向量的debug.txt文件,然後將它們發送到gpu作爲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);
}
我的想法,我希望有人能告訴我如何繼續調試。
這些文物看起來更像一個光柵化問題,不是一個幾何問題。由於您正在渲染實際的幾何圖形,所以這些工件因爲它們對硬件問題可見而提示。詢問你的朋友是否超頻他的GPU和/或其內存。還可以嘗試在驅動程序更新之後或使用相同類型的其他GPU替換之後發生的情況。 – datenwolf
我拒絕相信它是硬件相關的。另外我試了一臺我的另一位朋友的電腦,他的結果和我的其他朋友一樣。此外,你所謂的工件,因爲我提到的問題,我設法將它們識別爲(可能)其他所有模型的導入幾何。他們似乎合併爲一個 – Bisder
你總是可以把它全部拋出,並重新開始使用[現代openGL API](http://duriansoftware.com/joe/An-intro-to-modern-OpenGL.-Chapter-1 :-The-Graphics-Pipeline.html)(半認真的) –