我有一个在 android 中反复使用的应用程序,它使用 opengl-es。
目前我从位图加载纹理,如下所示:
//Load up and flip the texture - then dispose the temp
Bitmap temp = BitmapFactory.decodeResource(Deflecticon.getContext().getResources(), resourceID);
Bitmap bmp = Bitmap.createBitmap(temp, 0, 0, temp.getWidth(), temp.getHeight(), flip, true);
temp.recycle();
//Bind the texture in memory
gl.glBindTexture(GL10.GL_TEXTURE_2D, id);
//Set the parameters of the texture.
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
//On to the GPU
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bmp, 0);
明显的问题是我使用的纹理必须是 2 的幂。目前我正在 Photoshop 中将纹理预编辑为 2 的幂,并且只有空边框。然而,这有点乏味,我希望能够按原样加载它们..认识到它们不是 2 的幂并将它们加载到纹理中。
我知道我可以将位图缩放为 2 的幂大小并简单地拉伸纹理,但我不希望拉伸纹理,并且在某些情况下可能希望将多个纹理放入一个“图集”中。
我知道我可以使用 glTexSubImage2D() 将我想要的数据粘贴到我想要的原点的纹理中。这很棒!
但是我不知道如何在Android中初始化没有数据的纹理?
在这个问题中之前问过 https://stackoverflow.com/questions/5073611/possible-to-glteximage2d-an-npot-image-onto-a-pow-2-texture-without-extra-allocat建议是在没有数据的情况下调用 glTexImage2D() ,然后填充它。
然而在android中,当你调用“GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bmp, 0);”时您没有指定宽度/高度。它是从我假设的位图中读取的。
做这个的最好方式是什么?我可以创建一个 2 的右幂大小的新位图,仅空白且不填充任何数据,并使用它来初始化纹理,然后使用 subImage 粘贴到其中吗?或者我应该制作一个新的位图,以某种方式将我想要的像素(不确定是否可以轻松做到这一点)复制到这个新的位图(留下边框)中,然后使用它?
编辑:澄清我正在使用 opengl。