6

編集:すべてのテクスチャリングと法線マッピングを取り除きましたが、問題はまだ残っています

画面に地形の塊を描画しようとしています。レンダリング関数は次のようになります。

void TerrainChunk::Render()
{
   std::cout << "Render Me!\n";
   glColor3f(0.5f, 0.5f, 0.5f)
   glDisable(GL_LIGHTING);
   for(int x = 1; x < kChunkSize - 1; x++)
   {
      for(int z = 1; z < kChunkSize - 1; z++)
      {
         std::cout << height_map_[x][z] << " ";
         glBegin(GL_TRIANGLE_STRIP);
            glVertex3f(x, height_map_[x][z], z);
            glVertex3f(x+1, height_map_[x+1][z], z);       
            glVertex3f(x, height_map_[x][z+1], z+1);
            glVertex3f(x+1, height_map_[x+1][z+1], z+1);
         glEnd();
      }
      std::cout << std::endl;
   }
   glEnable(GL_LIGHTING);
}

オブジェクトがスタック上に作成されるとき

TerrainChunk chunk("chunk1.png", "grass.png");
chunk.Init();

それは完全にレンダリングされます。

新規で作成する場合

TerrainChunk *chunk = new TerrainChunk("chunk1.png", "grass.png");
chunk->Init();

何も表示されません。どちらの場合も、Render が呼び出され、正しいハイトマップが出力されています。これらのケースはどちらも同じように動作すると思います。

編集: 要求された Init() コードは次のとおりです。Render() を呼び出すたびに正しいことを確認済みの高さマップをロードするだけです。

void TerrainChunk::Init()
{
   std::cout << height_file_ << ", " << texture_file_ << std::endl;

   //Load height map
   SDL_Surface *temp = IMG_Load(height_file_.c_str());
   if(!temp)
   {
      printf("Failed to load chunk.\n");
      exit(-1);
   }
   Uint32 *pixels = (Uint32 *)temp->pixels;
   for(int z = 0; z < kChunkSize; z++)
   {
      for(int x = 0; x < kChunkSize; x++)
      {
         Uint8 r, g, b;
         SDL_GetRGB(pixels[x + z * temp->w], temp->format, &r, &g, &b);
         height_map_[x][z] = g / 12;
      }
   }
}
4

2 に答える 2

1

同じオブジェクトがスタックで作成されたときに機能するが、ヒープで作成されたときは機能しない場合、またはその逆の場合、多くの場合、メンバーが単一化されていないためです。ヒープ割り当てはゼロで初期化され、スタック割り当てはゼロで初期化されません。プログラムをvalgrindで実行することをお勧めします。おそらく、何が問題なのかがわかります。

于 2012-11-25T18:40:13.187 に答える
0

Luchian Grigoreに同意する必要があります。スタックベースのバージョンは、使い終わると自動的に削除されます。ヒープベースのバージョンは明示的にのみ削除されます。

変更した場合:

TerrainChunk *chunk = new TerrainChunk("chunk1.png", "grass.png");
chunk->Init();

に:

TerrainChunk *chunk = new TerrainChunk("chunk1.png", "grass.png");
chunk->Init();
delete chunk;

結果は異なりますか?

于 2013-03-06T13:55:52.840 に答える