-1

私はbmpサイズ= 512 * 512を持っており、サーフェスがプレーンではないため、それを使用してサーフェスをレンダリングしたいと思います。サーフェスを長方形の小さな部分に切り取り(num = rowMax * colMax)、次のようなコード:

draw(GL10 gl)
{  
  int[] textures = new int[];
  gl.glBindTexture(...);
  gl.glTxtParameterf(...);

 for(int row =0; row< maxRow; row++)
 {
   for(int col=0; col<maxCol; col++
  { 
     GLUtil.texImage2D(GL10.GL_TEXTURE_2D , bitmap,0 );// bitmap is the 512*512 bmp
    //generate 4 point coordinate
    ...

    //generate texture uv coordinate 
    ...
    //draw it
   gl.glDrawArray(...);    
    }  
  }

それは正常に動作します。

しかし、私がステートメントを取るとき:
GLUtil.texImage2D(GL10.GL_TEXTURE_2D , bitmap,0 ); ループ外、(これにはかなりの時間がかかると思うので)うまくいきません、わかりませんw

}

4

1 に答える 1

1

多分私はあなたのプログラムの仕組みを理解していませんでしたが、私が理解していることから、描画する必要がある多数の異なるテクスチャがあります.

texImage2D をループから外した場合、num テクスチャではなく 1 つのテクスチャだけをロードすることになるため、明らかに機能しません。

オープン gl について知っておくべきもう 1 つのことは、描画するたびに GLUtil.texImage2D を呼び出す必要はなく、テクスチャが変更されるたびに呼び出す必要があるということです。

texImage2D を呼び出すと、ビットマップの現在の状態が GL コンテキストのテクスチャ メモリに、以前に呼び出したテクスチャ名で保存されるglBindTexture(GL10.GL_TEXTURE_2D, /*texture name here*/)ため、次にテクスチャを描画する必要がある場合は、次の名前で glBindTexture を呼び出すだけで済みます。テクスチャ、それだけです。コストのかかる操作は必要ありません。

すべきことは、各テクスチャの名前 (テクスチャを表す一意の整数) がその位置 (=(row * maxCol) + col) + 1 になるようにすることです (0 という名前のテクスチャがないように (予約済み)テクスチャ名)。

また、mDirty と呼ばれる num のサイズのブール値の配列を作成して、セルの位置に対応するテクスチャが変更され、再ロードする必要がある場合に各セルが true になるようにする必要があります。

このようにして、ループ内で をチェックしmDirty[(row * maxCol) + col] == true、true の場合は texImage2D を呼び出し、mDirty[(row * maxCol) + col] を false に設定して、gl メモリでテクスチャが更新されたことを示すことができます。

于 2012-04-09T12:03:02.483 に答える