だから私はタワーディフェンスゲームを手短にしています。ビルドを共有したので、別のホストですべてが正常に動作するかどうかを確認できます。
そして、実際に何が起こるかというと、私の側ではすべてが完全にレンダリングされますが (私の mac/xcode + windows/visual studio 2012 の両方で)、私の友人の側では、ジオメトリが台無しになっているように見えます。画面上の各オブジェクトは、毎回異なる場所にレンダリングするために使用する VBO で表されます。しかし、私の VBO には、すべてのモデルからインポートされたすべてのジオメトリがあるようです。(したがって、側面に木があるタワー。)
結果は次のとおりです。
(私のパソコン)
(友達のパソコン)
今のところ、この問題を特定の時点までデバッグすることができました。VBOとしてgpuに送信する前にすべてのベクトルを含むdebug.txtファイルを作成していて、両方のコンピューターで同じ値を出力しているため、モデルをインポートする方法ではないことがわかります。だから私は彼らのベクトルがメモリの問題やそのようなものによって台無しにされていません. だから私は多分それが私のVBOを設定またはレンダリングしている方法だと思っています
しかし、最も印象に残っているのは、友人のコンピューターでは機能しないのに、自分のコンピューターでは機能する理由です。私が確かに知っている違いの 1 つは、私のコンピューターは (これが何を意味するにせよ) 開発者ステーションであり、友人のコンピューターはそうではないということです。
これは私の 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);
}
私はアイデアがありません。誰かがこれをさらにデバッグする方法を教えてくれることを願っています。