-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 ); 在循环之外,(因为我认为这可能需要很多时间)它不起作用,我不知道

}

4

1 回答 1

1

也许我不了解您的程序的工作方式,但据我了解,您需要绘制 num 个不同的纹理。

如果您将 texImage2D 排除在循环之外,您将只加载一个纹理而不是 num 纹理,因此显然这不起作用。

关于open gl的另一件事是,您不需要每次绘制时都调用GLUtil.texImage2D,而只需每次纹理更改时调用。

一旦调用了texImage2D,bitmap的当前状态就会保存到GL上下文的纹理内存中,在之前调用的纹理名称下glBindTexture(GL10.GL_TEXTURE_2D, /*texture name here*/),所以下次需要绘制纹理时,只需要调用名称为的glBindTexture即可纹理,就是这样,不需要昂贵的操作。

您应该做的是使每个纹理的名称(表示纹理的唯一整数)是它的位置 (=(row * maxCol) + col) + 1 (这样您就没有名为 0 的纹理(保留纹理名称)。

此外,您应该创建一个名为 mDirty 的大小为 num 的布尔数组,以便当对应于单元格位置的纹理发生更改并需要重新加载时,每个单元格都为真。

这样,您可以在循环中只检查是否mDirty[(row * maxCol) + col] == true,如果为真,则调用 texImage2D,并将 mDirty[(row * maxCol) + col] 设置为 false 以指示纹理在 gl 内存中更新。

于 2012-04-09T12:03:02.483 回答