2

高さマップ上にドレープされた大きなテクスチャがたくさんある地形エンジンを書いています。これらのテクスチャは、一連のものをレンダリングしてからglCopyTexSubImage2Dコマンドを数回使用することによって生成されます。

すべて問題ありません (速度と品質の面では)、しかし、それらをたくさん (>45 1Mpixel) 作成すると、フレームレートが 60 から約 2 に急降下します。レンダリングするたびにテクスチャごとに 100 万ピクセルすべてをプルすると、確実に速度が低下するため、解決策と思われることを試しました。つまり、ミップマッピングを実装することです。

したがって、すべての rgb 値を配列に取り込み、それを に再渡ししgluBuild2DMipmapsます。(これは無駄ではありませんか?私はいくつかのデータを要求し、すぐにそれを返しますか?私が持っているものでこれを行うためのより良い方法はありますか (以下を参照))。

今、中距離のテクスチャはひどく当たり障りのないものに見え、速度の面では私は良くありません.

レンダリングを高速化しながら、遠くのテクスチャの詳細を取得する方法はありますか? 私はfreeglutを使用しているため、opengl 2に限定されていることに注意してください.

[編集: いくつかのコード サンプル]

テクスチャの生成:

//Only executes once as then the texture is defined.
if (TextureNumber == -1)
{
    glGenTextures (1, &TextureNumber); 
    glBindTexture(GL_TEXTURE_2D, TextureNumber);

    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR );
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR );
    // ... Other not directly related stuff
    glTexImage2D (GL_TEXTURE_2D, 0, GL_RGB, TEXTURE_SIZE, TEXTURE_SIZE, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
}
//The texture is built up a little bit at a time, over a number of calls.

// Do some rendering
// ...
glBindTexture(GL_TEXTURE_2D, TextureNumber);
//And copy it into the big texture
glCopyTexSubImage2D (GL_TEXTURE_2D, 0, texX * _patch_size, texY * _patch_size, 0, 0, _patch_size, _patch_size);

最後に、これは 1 回実行されます。

unsigned char* dat = new unsigned char [TEXTURE_SIZE*TEXTURE_SIZE*3];
glBindTexture(GL_TEXTURE_2D, TextureNumber);
glGetTexImage(GL_TEXTURE_2D,0,GL_RGB,GL_UNSIGNED_BYTE,dat);
gluBuild2DMipmaps(GL_TEXTURE_2D,3,TEXTURE_SIZE,TEXTURE_SIZE,GL_RGB,GL_UNSIGNED_BYTE,dat);
finishedTexture = true;
delete[] dat;

レンダリング:

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glColor3f(1,1,1);
glVertexPointer( 3, GL_FLOAT, 0, VertexData);   
glTexCoordPointer(2, GL_FLOAT, 0, TextureData);
glBindTexture(GL_TEXTURE_2D, TextureNumber);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glDrawElements( GL_TRIANGLES, //mode
              numTri[detail],  //count, ie. how many indices
              GL_UNSIGNED_INT, //type of the index array
              TriangleData[detail]);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
4

1 に答える 1