OpenGL ES 紋理壓縮之ETC (二)
阿新 • • 發佈:2018-12-12
前面介紹了OpenGL ES2.0 支援的壓縮ETC1;下面我們來學習一下ETC2。
從opengl es3.0 開始支援ETC2紋理壓縮,而這種壓縮可以支援透明通道。
下面看如何使用
載入pkm檔案
public static byte[] loadDataFromAssets(String fname, Resources r){
byte[] data=null;
InputStream in=null;
try
{
in = r.getAssets().open(fname);
int ch=0;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
while((ch=in.read())!=-1)
{
baos.write(ch);
}
data=baos.toByteArray();
baos.close();
in.close();
}
catch(Exception e)
{
e.printStackTrace();
}
return data;
}
生成紋理Id
public static int initTexture(String pkmName,Resources r){
//生成紋理ID
int[] textures = new int[1];
GLES30.glGenTextures
(
1, //產生的紋理id的數量
textures, //紋理id的陣列
0 //偏移量
);
int textureId=textures[0 ];
GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, textureId);
GLES30.glTexParameterf(GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_MIN_FILTER,GLES30.GL_NEAREST);
GLES30.glTexParameterf(GLES30.GL_TEXTURE_2D,GLES30.GL_TEXTURE_MAG_FILTER,GLES30.GL_LINEAR);
GLES30.glTexParameterf(GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_WRAP_S,GLES30.GL_CLAMP_TO_EDGE);
GLES30.glTexParameterf(GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_WRAP_T,GLES30.GL_CLAMP_TO_EDGE);
byte[] data=loadDataFromAssets(pkmName,r);
ByteBuffer buffer = ByteBuffer.allocateDirect(data.length).order(ByteOrder.LITTLE_ENDIAN);
buffer.put(data).position(16);
ByteBuffer header = ByteBuffer.allocateDirect(PKM_HEADER_SIZE).order(ByteOrder.BIG_ENDIAN);
header.put(data, 0, 16).position(0);
int width = header.getShort(12);
int height = header.getShort(14);
GLES30.glCompressedTexImage2D
(
GLES30.GL_TEXTURE_2D,
0,
GLES30.GL_COMPRESSED_RGBA8_ETC2_EAC,
width,
height,
0,
data.length - 16,
buffer
);
return textureId;
}
左圖為 pkm 右圖為 png 看起來還差不多