gpt4 book ai didi

android - 在 Android OpenglES 2.0 中加载压缩纹理

转载 作者:行者123 更新时间:2023-11-29 20:56:14 30 4
gpt4 key购买 nike

我正在尝试通过压缩纹理来优化我的应用程序。由于我的很多纹理都需要 alpha,所以我不能使用 ETC1。

我已经使用这篇文章中的提示成功地将纹理压缩为其他格式。 Android OpenGL Texture Compression

问题是我似乎无法调整我的代码来读取此纹理。我用这段代码得到的唯一结果是黑色(颜色,而不是纹理)。

这是加载纹理的方法:

public static int loadCompressedTexture(Context context, int resourceId){
final int[] textureObjectIds = new int[1];

glGenTextures(1, textureObjectIds, 0);

if(textureObjectIds[0] == 0){
logTextureHelper(Log.WARN, "Could not generate a new OpenGL texture object");
return 0;
}

final InputStream bitmap = context.getResources().openRawResource(resourceId);
byte[] buffer;
ByteBuffer bf;

try {
buffer = new byte[bitmap.available()];
bitmap.read(buffer);
bf = ByteBuffer.wrap(buffer);

glBindTexture(GL_TEXTURE_2D, textureObjectIds[0]);//binds texture to texture object

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);//minimization filter
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

//texImage2D(GL_TEXTURE_2D, 0, bitmap, 0);//send texture data to OpenGL to the CURRENTLY BOUND object
GLES20.glCompressedTexImage2D(GLES20.GL_TEXTURE_2D, 0, GL10.GL_PALETTE4_RGBA8_OES, 512, 512, 0, bf.capacity(), bf);


//glGenerateMipmap(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, 0); //unbind texture
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return textureObjectIds[0];
}

我目前正在尝试加载 512x512px 的资源,使用 PvrTexTool 压缩,使用 PVRTC 4bpp RGBA 编码。

谁能看出是什么问题?或者更好的是,给我指出一个有效的例子?根据我的发现,我只能找到 ETC1 的示例,它们使用一些 ETCUtil 来加载纹理。

EDIT2:好的,我已经解决了。有两个问题。首先你需要使用这些纹理过滤器。

GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST); GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);

其次,我不知道 pvrtc 有一个单独的 header 。因此正确的偏移量是 67 字节。 PVRTC format specification

这段代码现在可以正常工作了:

            buffer = new byte[bitmap.available()];
bitmap.read(buffer);

int offset = 67; // 52 bit = header, 15 bit = metadata
bf = ByteBuffer.wrap(buffer, offset, buffer.length-offset);
bf.order(ByteOrder.LITTLE_ENDIAN);

long version = bf.getInt(0) & 0xFFFFFFFFL;
long flags = bf.getInt(4);
long pixelFormat = bf.getLong(8);
long colorF = bf.getInt(16);
long chanel = bf.getInt(20);
int height = bf.getInt(24);
int width = bf.getInt(28);
long depth = bf.getInt(32);
long nsurf = bf.getInt(36);
long nface = bf.getInt(40);
long mipC = bf.getInt(44);
long mSize = bf.getInt(48);
long fourCC = bf.getInt(52)& 0xFFFFFFFFL;
long key = bf.getInt(56)& 0xFFFFFFFFL;
long dataSize = bf.getInt(60)& 0xFFFFFFFFL;



// Log.d("TextureHelper","Buffer size: "+version+" "+flags+" "+pixelFormat+" "+colorF+" "+chanel+" "+height+" w: "+width+" h: "+height+" "+depth+" "+nsurf+" "+nface+" "+mipC+" "+mSize);
// Log.d("TextureHelper","Buffer size: "+fourCC+" "+key+" "+dataSize);


glBindTexture(GL_TEXTURE_2D, textureObjectIds[0]);

GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);


GLES20.glCompressedTexImage2D(GL_TEXTURE_2D, 0,GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG, width, height, 0, bf.capacity()-offset, bf);
Log.d("TextureHelper","Buffer size: "+bf.capacity()+" : "+buffer.length+" error:"+GLES20.glGetError());

glBindTexture(GL_TEXTURE_2D, 0); //unbind texture

最佳答案

您想通过 glCompressedTexImage2D 加载 PVRTC 4bpp RGBA 纹理吗?您应该使用 COMPRESSED_RGBA_PVRTC_4BPPV1_IMG 而不是 GL10.GL_PALETTE4_RGBA8_OES。

IMG_texture_compression_pvrtc https://www.khronos.org/registry/gles/extensions/IMG/IMG_texture_compression_pvrtc.txt

我不确定,但似乎Android GLES20没有这些常量,因此您需要定义它。

// PowerVR Texture compression constants
public static final int GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG = 0x8C00;
public static final int GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG = 0x8C01;
public static final int GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG = 0x8C02;
public static final int GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG = 0x8C03;

而且你应该在 glCompressedTexImage2D 调用后检查 glGetError。 glGetError 的值应该是 GL_NO_ERROR。

关于android - 在 Android OpenglES 2.0 中加载压缩纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27641932/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com