0

私は現在、立方体を球体にマッピングし、各面に高さマップを適用して地形を生成することで機能する手続き型の惑星生成ツールに取り組んでいます。

次の方法を使用して作成された各面に VBO を使用しています。

void Planet::setVertexBufferObject()
{
 Vertex* vertices;
 int currentVertex;
 Vertex* vertex;

 for(int i = 0; i < 6; i++)
 {
  // bottom face
  if(i == 0)
  {
   glBindBuffer(GL_ARRAY_BUFFER, bottomVBO);    
  }
  // top face
  else if(i == 1)
  {
   glBindBuffer(GL_ARRAY_BUFFER, topVBO);    
  }
  // front face
  else if(i == 2)
  {
   glBindBuffer(GL_ARRAY_BUFFER, frontVBO);    
  }
  // back face
  else if(i == 3)
  {
   glBindBuffer(GL_ARRAY_BUFFER, backVBO);    
  }
  // left face
  else if(i == 4)
  {
   glBindBuffer(GL_ARRAY_BUFFER, leftVBO);    
  }
  // right face
  else
  {
   glBindBuffer(GL_ARRAY_BUFFER, rightVBO);    
  } 

  vertices = (Vertex*)glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);

  currentVertex = 0;

  for(int x = 0; x < size; x++)
  {
   for(int z = 0; z < size; z++)
   {
    currentVertex = z * size + x;

    vertex = &vertices[currentVertex];

    vertex->xTextureCoord = (x * 1.0f) / 512.0f;
    vertex->zTextureCoord = (z * 1.0f) / 512.0f;

    Vector3 normal;

    vertex->xNormal = normal.x;
    vertex->yNormal = normal.y;
    vertex->zNormal = normal.z;

    vertex->x = heightMapCubeFace[i][x][z][0];
    vertex->y = heightMapCubeFace[i][x][z][1];
    vertex->z = heightMapCubeFace[i][x][z][2];

    vertex->x *= (1.0f +((heightMaps[i][z][x]/256.0f) * 0.1));
    vertex->y *= (1.0f +((heightMaps[i][z][x]/256.0f) * 0.1));
    vertex->z *= (1.0f +((heightMaps[i][z][x]/256.0f) * 0.1));
   }
  }
  glUnmapBuffer(GL_ARRAY_BUFFER);
  glBindBuffer(GL_ARRAY_BUFFER, 0);
 }
}

setIndexBufferObject() メソッドは正常に機能しているため、省略しました。

次に、このメソッドを使用して球をレンダリングしています。

void Planet::render()
{
    // bottom face

    glBindBuffer(GL_ARRAY_BUFFER, bottomVBO);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bottomIBO);

    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET(6 * sizeof(float)));

    glEnableClientState(GL_NORMAL_ARRAY);
    glNormalPointer(GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET(3 * sizeof(float)));

    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3, GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET(0));

 TextureManager::Inst()->BindTexture(textueIDs[0]);
 glClientActiveTexture(GL_TEXTURE0+textueIDs[0]);
 glDrawElements(GL_TRIANGLE_STRIP, numberOfIndices, GL_UNSIGNED_INT, BUFFER_OFFSET(0)); 

    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_NORMAL_ARRAY);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);

    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

 // next face and so on...

上記のコードからわかるように、テクスチャはフリー イメージを使用してロードされています。フリー イメージに付属のサンプル テクスチャ マネージャを使用しているだけです。

テクスチャのバインドが機能しないのはなぜですか?

4

2 に答える 2

1

テクスチャのバインドが機能しないのはなぜですか?

表示されている動作を非常に具体的に説明するか、URL をスクリーンショットに添付すると、グラフィックに関する質問を解決しようとするときに大いに役立ちます。

次に、gl エラー状態を含めるか、少なくともコード内で、glGetError() が GL_NO_ERROR を返さない場合にチェックして失敗することを示す必要があります。

意図的にインデックス バッファ オブジェクトの定義を省略したにもかかわらず、VBO / 描画要素の状態は妥当に見えるので、glDrawElements() 呼び出しに実際のインデックスを送信していると信じています。健全性チェックのために、要素の VBO をバインドするのではなく、生のインデックス ポインターを使用して glDrawElements() 呼び出しを実行します。

glTexCoordPointer() に提供しているオフセットが構造体定義と一致しているかどうかを知るために必要な Vertex の型定義も省略しました。

最後に、フォーラムのほとんどの人は「フリー イメージ」を知らないと思います。これは、テクスチャをロードするために使用していると述べたものだと思います。テクスチャリングに問題がある場合、このサード パーティ ライブラリを使用してテクスチャリングをセットアップするという不透明な性質のため、それを確認することは不可能です。

テクスチャ ID を混同している場合は、サポートされていないラップ モードを設定するか、予想されるミップマッピング (オン/オフ) と一致する縮小フィルターを設定しないか、テクスチャリングを有効にしないか、テクスチャ環境モードを設定して、変調がベース ジオメトリの色が期待どおりではありません。これらすべてにより、テクスチャリングが機能しなくなったり、機能しているように見えたりします。

トラブルシューティングを行うには、テクスチャ ロード用のライブラリを使用し、ライブラリが提供するテクスチャ ID を使用します。次に、フィルタ モードとテクスチャ環境を自分で設定します。トラブルシューティング中はミップマッピングをオフにします。不完全なミップマップ チェーンは、テクスチャリング時の非常に一般的なエラーです。

トラブルシューティングを簡素化するために、フラグメントごとの操作をオフにすることもできます。ブレンディング、深度テスト、およびシザリングを無効にします。

テクスチャが 2 次元の累乗であるか、実装が NPOT をサポートしていると仮定すると、描画の直前に次の設定を試してください。

glDisable(GL_DEPTH_TEST);
glDisable(GL_BLEND);
glDisable(GL_SCISSOR_TEST);
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
glBindTexture(GL_TEXTURE_2D, texID);
glTexEnvi(GL_TEXTURE_ENV_MODE, GL_REPLACE); // モジュレーションをオフにする
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // ミップマッピングをオフにする
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); // 繰り返しをオフにする
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);

于 2010-11-07T21:22:30.433 に答える
1
glClientActiveTexture(GL_TEXTURE0+textueIDs[0]);

ここで何をしようとしていますか?

アクティブなテクスチャ ユニットは、ランダム テクスチャ オブジェクトとは関係ありません。

于 2010-11-07T21:53:09.397 に答える