2012-02-05 29 views
54

Tôi cần một số trợ giúp tìm thông tin (hoặc ví dụ) về cách sử dụng tính năng nén kết cấu cho Android. Tôi có rất nhiều PNG ngay bây giờ và tôi cần phải giảm số lượng bộ nhớ mà họ mất. Tôi đã nhìn vào nén PVR nhưng tôi không thể tìm ra cách sử dụng nó trong OpenGL.Nén kết cấu OpenGL của Android

Có thể một số điểm tôi đi đúng hướng hoặc cung cấp một số ví dụ vì tôi không thể tìm thấy bất kỳ điều gì.

Trả lời

82

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 herehere.

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:

  1. 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.

  2. 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.    
        } 
    
    }   
    
  3. tải nén kết cấu như dữ liệu thô.

  4. 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); 
    
    } 
    
+2

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

+0

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

+0

Rất tuyệt! Rất vui được giúp đỡ :) – gergonzalez

3

Bạn không nên chỉ sử dụng nén PVR trên Android, vì điều này sẽ không hoạt động với tất cả các kiểu máy. Để khắc phục điều đó, bạn chỉ nên sử dụng ETC1 (bắt buộc trên tất cả các thiết bị GLES 2.0) hoặc có các gói kết cấu riêng biệt cho các chế độ GPU riêng biệt. The android dev guide có lớp trợ giúp để tải định dạng nén.

Bạn có thể sử dụng etcpack để thực hiện nén.

Lưu ý rằng bạn sẽ không nhận được kênh alpha với ETC1 - bạn có thể thực hiện một số thủ thuật tô bóng để tìm hiểu xung quanh bằng cách có kênh alpha làm kết cấu riêng biệt.

+0

tôi đã cố gắng mà tuy nhiên Eclipse doesnt biết những gì ETC1Util là gì và nó không thể tìm thấy một khẩu ... bất cứ lý do cho vấn đề đó? – Chris

+0

_ "bạn chỉ nên sử dụng ETC1 (bắt buộc trên tất cả các thiết bị GLES 2.0)" _ Tôi không nghĩ rằng nó là bắt buộc đối với OpenGL ES - Có vẻ, với tôi, là một phần mở rộng: xem http: //www.khronos .org/registry/gles/ –

+2

Đây là phần mở rộng của GLES 1.0/1.1, nhưng được yêu cầu cho GLES 2.0. –

5

Đây là một chủ đề ol, vì vậy tôi nghĩ rằng tôi muốn cập nhật nó với các thông tin có sẵn trên http://devtools.ericsson.com/etc ETC2 là bắt buộc trong các tiêu chuẩn Khronos OpenGL ES 3.0 và OpenGL 4.3.

2

Chỉ muốn chỉ ra etc1 không được hỗ trợ bởi tất cả các thiết bị Android, trái với những gì gergonzalez nói

Chú ý: Định dạng ETC1 được hỗ trợ bởi hầu hết các thiết bị Android, nhưng nó không được bảo đảm có sẵn. Để kiểm tra xem định dạng ETC1 có được hỗ trợ trên thiết bị hay không, hãy gọi phương thức ETC1Util.isETC1Supported().

https://developer.android.com/guide/topics/graphics/opengl.html#textures

+2

Điều đó thật khó chịu, do đó, chỉ có một đảm bảo có vẻ như: 'Định dạng nén kết cấu ETC2/EAC được đảm bảo khả dụng khi sử dụng API OpenGL ES 3.0.'. – leetNightshade

Các vấn đề liên quan