android opengl GLUtil.texImage2d
我有一个bmp大小=512*512,现在我想用它来渲染曲面 由于曲面不是平面,我将曲面切割成一小块矩形(num=rowMax*colMax),代码如下:android opengl GLUtil.texImage2d,android,opengl-es,Android,Opengl Es,我有一个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<maxC
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(...);
}
}
绘图(GL10 gl)
{
int[]纹理=新的int[];
gl.glBindTexture(…);
gl.glTxtParameterf(…);
对于(int row=0;row 对于(int col=0;col可能我不了解您的程序的工作方式,但据我所知,您需要绘制的纹理有很多种
如果要将texImage2D从循环中取出,则只加载一个纹理,而不是num纹理,因此显然这不起作用
关于OpenGL,需要了解的另一件事是,您不需要在每次绘制时调用GLUtil.texImage2D,而只需要在每次纹理更改时调用
调用texImage2D后,位图的当前状态将保存到GL上下文的纹理内存中,保存在之前调用的glBindTexture(GL10.GL\u texture\u 2D,/*此处的纹理名称*/)下的纹理名称下
with,因此下次需要绘制纹理时,只需使用纹理的名称调用glBindTexture即可,无需进行昂贵的操作
您应该做的是使每个纹理的名称(表示纹理的唯一整数)是它的位置(=(row*maxCol)+col)+1(这样您就不会有名为0的纹理(保留纹理名称)
此外,还应该创建一个称为mDirty的大小为num的布尔数组,以便在与单元位置对应的纹理发生更改并需要重新加载时,每个单元都是真的
这样,您就可以在循环中只检查mdrty[(row*maxCol)+col]==true
,如果为true,则调用texImage2D,并设置mdrty[(row*maxCol)+col]为false表示纹理已在gl内存中更新。中没有texImage2D'3
。实际上,每次我使用其中的一部分时,只有一个纹理,例如使用左上部分64*64像素。每次GLUtils.glTexImage2D将相同的位图加载到纹理时,这“代价高昂”。是否有办法仅加载一个y一次?哦,在这种情况下,将glTex移出循环,并在其前面放置一个glBindTexture(GL10.GL_TEXTURE_2D,/*此处纹理名称*/)命令。