Android Opengl-es加载非2的幂纹理

2023-12-22

我有一个在 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。


我认为如果您尝试创建具有 2 个轴大小的幂的位图,然后添加您的位图,它应该可以正常工作。也许像

Bitmap.createBitmap(notPowerOf2Bitmap, offx, offy, xsize, ysize, bitmapFlag)

除此之外,我想说的是,在 Photoshop 过程中受苦了。你有多少张照片?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android Opengl-es加载非2的幂纹理 的相关文章

随机推荐