我有一个在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的幂并仅拉伸(stretch)纹理,但是我不希望拉伸(stretch)纹理,在某些情况下可能希望将多个纹理放入一个“图集”中。

我知道我可以使用glTexSubImage2D()将想要的数据粘贴到纹理中。这很棒!

但是我不知道如何在Android中初始化没有数据的纹理?

在这个问题previously asked中,建议是在没有数据的情况下调用glTexImage2D(),然后进行填充。

但是在android中,当您调用“GLUtils.texImage2D(GL10.GL_TEXTURE_2D,0,bmp,0);”时,您未指定宽度/高度。它从我假设的位图读取此内容。

做这个的最好方式是什么?我可以创建一个具有2幂次方的正确位图的新位图,该位图只有空白并且没有填充任何数据,然后使用它来初始化纹理,然后使用subImage粘贴到其中吗?还是我应该制作一个新的位图,以某种方式将我想要的像素(不确定是否可以轻松地做到这一点)复制到这个新的位图中(留出边界),然后使用它?

编辑:阐明我正在使用opengl。

最佳答案

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

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

除此之外,我会说在Photoshop程序中受了苦。你有几张照片?

关于Android Opengl-es加载2的幂次方,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5705753/

10-09 01:24