Có chủ yếu bốn loại kết cấu nén hỗ trợ trên Android:
- ETC1 (Ericsson kết cấu nén). Định dạng này được hỗ trợ bởi tất cả các điện thoại Android. Tuy nhiên, nó không hỗ trợ kênh alpha, vì vậy chỉ có thể được sử dụng cho kết cấu mờ đục.
- PVRTC (nén kết cấu PowerVR). Được hỗ trợ bởi các thiết bị có GPU PowerVR (Nexus S, Kindle fire, v.v.).
- ATITC (nén kết cấu ATI). Được sử dụng trong các thiết bị có GPU Adreno từ Qualcomm (Nexus One, v.v.).
- S3TC (nén kết cấu S3). Nén kết cấu này được sử dụng trong các thiết bị tích hợp chipset NVIDIA (Motorola Xoom, v.v.)
Thông tin chi tiết hơn here và here.
Tóm lại, nếu họa tiết của bạn không có alpha, bạn có thể sử dụng ETC1. Nếu họ có alpha, và bạn muốn hỗ trợ tất cả các thiết bị, bạn phải có kết cấu của bạn nén trong ba loại khác và tải chúng theo thiết bị.
Làm thế nào để sử dụng:
Nén file png của bạn (Bạn có thể sử dụng một công cụ như ETC-Pack, PVRTexTool, ATI Compressonator, Nvidia Texure Tools theo loại kết cấu) và thêm vào các tài sản dự án của bạn.
Xác định phần mở rộng có sẵn trong các thiết bị, nếu bạn không sử dụng ETC1:
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
String s = gl.glGetString(GL10.GL_EXTENSIONS);
if (s.contains("GL_IMG_texture_compression_pvrtc")){
//Use PVR compressed textures
}else if (s.contains("GL_AMD_compressed_ATC_texture") ||
s.contains("GL_ATI_texture_compression_atitc")){
//Load ATI Textures
}else if (s.contains("GL_OES_texture_compression_S3TC") ||
s.contains("GL_EXT_texture_compression_s3tc")){
//Use DTX Textures
}else{
//Handle no texture compression founded.
}
}
tải nén kết cấu như dữ liệu thô.
Sử dụng glCompressedTexImage2D thay vì glTexImage2D:
public void onDrawFrame(GL10 gl) {
....
gl.glCompressedTexImage2D(GL10.GL_TEXTURE_2D, level, internalformat, width,
height, border, imageSize, data);
}
Xin chào @Xilliah, chủ đề cũ và có thể bạn đã đúng, ** nhưng giải pháp này đang hoạt động khá tốt trong một số dự án của tôi **. Nếu bạn nghĩ không đúng, bạn có thể làm hai việc, hoặc bạn nói bạn nghĩ gì là sai và tôi sẽ rất vui khi cố gắng sửa nó hoặc vui lòng thêm một câu trả lời khác với giải pháp đúng ... Xin ý kiến xây dựng! .Cảm ơn. – gergonzalez
Xin chào Gergonzalez. Tôi đã mắc lỗi và không chính xác, nhưng không thể xóa nhận xét vì lý do nào đó. Chỉ là tôi lại ngớ ngẩn. Câu trả lời của bạn đã giúp! – Xilliah
Rất tuyệt! Rất vui được giúp đỡ :) – gergonzalez