Bài đăng phổ biến

Thứ Sáu, 19 tháng 10, 2012

ANDROID BÀI 6: GIỚI THIỆU VỀ TEXTURE FILTERING

Trong bài này chúng ta sẽ tìm hiểu các kiểu khác nhau cơ bản chế độ lọc của Texture. và làm thế nào để sử dụng chúng bao gồm nearest - neighbour, bilinearing -filering và trilinearing - filtering sử dụng mipmap.

Bạn sẽ tìm hiểu làm thế nào để làm cho textures của bạn xuất hiện mịn hơn cũng như những hạn chế của nó, Ngoài ra còn có nhiều cách khác nhau xoay một đối tượng, một trong số đó được sử dụng trong bài học này.
Yêu cầu bài này là hiểu cơ bản về Texture trong bài 4:


  • LỌC TEXTURE LÀ GÌ
Textures OpenGL được tạo thành các mảng các phần tử được gọi là texels, có chứa màu sắc và giá trị alpha. Điều này tương ứng với màn hình hiển thị, được thực hiện một loạt các điểm ảnh và hiển thị một màu khác nhau tại mỗi điểm. Trong OpenGL, Texture được áp dụng hình tam giác và vẽ trên màn hình, vì vậy , các textures này có thể được vẽ trong các kích cỡ khác nhau và định hướng.Tuỳ chọn lọc texture trong OpenGL nói với nó thế nào để lọc các texels vào các điểm ảnh của thiết bị, tùy từng trường hợp.
Có 3 trường hợp sau:
  • Mỗi texel ánh xạ lên nhiều hơn 1 Pixel: Điều này được biết như là PHÓNG ĐẠI
  • Mỗi texel ánh xạ chính xác 1 pixel: Bộ lọc không áp dụng trong trường hợp này
  • Mỗi texel ánh xạ ít hơn 1 pixel: Điều này được biết đến như là THU NHỎ
OpenGL cho phép chúng ta gán một bộ lọc cho cả hai phóng đại và thu nhỏ, và cho phép chúng sử dụng láng giềng gần nhấu, lọc Bilinear (Tuyến tính), hoặc lọc Trilinear (Tam tuyến tính). Tôi sẽ giải thích những gì chúng có ý nghĩa hơn dưới đây.
  • PHÓNG ĐẠI VÀ THU NHỎ
Đây là hình ảnh mô phỏng của cả hai phóng đại và thu nhỏ với láng giềng gần nhất được vẽ bằng việc sử dụng cube Android mà xuất hiện khi bạn có USB của bạn kết nối với thiết bị Android của bạn :












normal                                                                               Minifination                        Magnification

  • CÁC CHẾ ĐỘ LỌC TEXTRUE
  • Bilinear interpolation (Tuyến tính nội suy)


Các texel của 1 texture thì có thể nhìn thấy rõ dàng giống như hình vuông lớn trong Magnification khi không có nội suy giữa các texel được thực hiện.  Khi hiển thị (Rendering) thì được thực hiện trong chế độ láng giềng gần nhất. Pixel được gán giá trị của texcel gần nhất.


Chất lượng dựng hình có thể được cải thiện đáng kể bằng cách chuyển sang nội suy Bilinear. Thay vì việc gán các giá trị của một nhóm các điểm ảnh với giá trị Texel cùng gần đó, các giá trị thay vào đó sẽ được nội suy tuyến tính giữa các láng giềng bốn texels. Mỗi điểm ảnh sẽ được cân bằng và hình ảnh kết quả sẽ trông mượt hơn:


Một vài khối vẫn còn rõ ràng, nhưng hình ảnh trông mượt mà hơn nhiều so với trước đây. Những người chơi game 3D trở lại trong những ngày trước khi card 3D ra đời, nhớ rằng đây là các tính năng xác định giữa một phần mềm trò chơi-rendered và một trò chơi tăng tốc phần cứng: phần mềm trò chơi-rendered chỉ đơn giản là không có kinh phí xử lý để làm mịn , vì vậy tất cả mọi thứ xuất hiện khối ô vuông và lởm chởm. Thứ này đột nhiên trơn tru, một khi người ta bắt đầu bằng cách sử dụng tăng tốc đồ họa. 
Nội suy tuyến tuyến rất hữu ích cho việc phóng to. Nó cũng được sử dụng cho việc thu nhỏ lại nhưng bên ngoài một điểm nào đó và chúng tôi chạy vào cùng một vấn đề mà chúng ta đang cố gắng nhồi nhét nhiều texels vào cùng một điểm ảnh. Opengle chỉ sử dụng 4 texel để đưa vào 1 Pixel vì vậy rất nhiều thông tin vẫn mất đi. 
Nếu chúng ta nhìn chi tiết nội suy tuyến tính được áp dụng vào. nó trông sẽ rất nhiễu, nếu chúng ta nhìn trong 1 khoảng cách xa từ đó một tập hợp khác nhau của texels sẽ được lựa chọn mỗi frame.


  • MIPMAPING

Làm thế nào chúng ta có thể giảm bớt (bé lại) các texture mà không có nhiễu (răng cưa) và sử dụng tất cả các texels? Điều này có thể được thực hiện bằng cách tạo ra một tập hợp các Texture được tối ưu dành cho kích thước khác nhau mà chúng ta có thể sử dụng trong thời gian chạy. Từ khi những Texture này được tạo ra trước, chúng có thể được lọc bằng cách sử dụng nhiều kỹ thuật đắt tiền mà sử dụng tất cả các texels, và tại thời gian chạy OpenGL sẽ chọn mức độ thích hợp nhất dựa trên kích thước cuối cùng của texture trên màn hình.



Hình ảnh thu được có thể có chi tiết hơn, hạn chế nhiễu, và nhìn tổng thể tốt hơn. Mặc dù bộ nhớ hơn một chút sẽ được sử dụng, dựng hình cũng có thể được nhanh hơn, như mức độ nhỏ hơn có thể dễ dàng lưu giữ trong bộ nhớ cache texture của GPU. Chúng ta hãy xem xét kỹ hơn ảnh kết quả tại 1/8th kích thước ban đầu của nó, bằng cách sử dụng Bilinear lọc không có và với mipmaps, hình ảnh đã được mở rộng cho rõ ràng:















Bilinear filtering without mipmaps                                                     Bilinear filtering with mipmaps


Phiên bản sử dụng mipmaps có chi tiết rộng hơn. Bởi vì trước khi xử lý hình ảnh vào các mức khác nhau, tất cả các texels cuối nhận được sử dụng trong hình ảnh cuối cùng.

  • Trilinear filtering (Tam tuyến tính)

 Khi chúng ta sử dụng với lọc tuyến tính (Bilinear filtering), thỉnh thoảng chúng ta chú ý có điểm nhảy hoặc dòng được nhìn thấy trong cảnh chiếu. Ở đó opengle chọn lựa giữa các mức khác nhau của texture. Điều này sẽ được chỉ ra xa hơn một chút dưới đây khi so sánh texture OpenGL khác nhau lọc chế độ.

Lọc tam tuyến tính giải quyết vấn đề này, bằng cách nội suy các mức mipmap khác nhau vì vậy mà tổng 8 texels được sử dụng nội suy vào giá trị pixel cuối cùng. Kết quả trông hình ảnh rất là mượt mà

  • OpenGL texture filtering modes 



Opengl có 2 tham số có thể thiết lập

  • GL_TEXTURE_MIN_FILTER
  • GL_TEXTURE_MAG_FILTER

Những cái này tương ứng với thu nhỏ và phóng đại so với ban đầu. GL_TEXTURE_MIN_FILTER chấp nhận tùy chọn sau:
  • GL_NEAREST
  • GL_LINEAR
  • GL_NEAREST_MIPMAP_NEAREST
  • GL_NEAREST_MIPMAP_LINEAR
  • GL_LINEAR_MIPMAP_NEAREST
  • GL_LINEAR_MIPMAP_LINEAR

GL_TEXTURE_MAG_FILTER chấp nhận tùy chọn sau:
  • GL_NEAREST
  • GL_LINEAR


GL-NEAREST tương ứng với nearest - neightbour rendering. GL_LINEAR tương ứng với bilinearing filtering. GL_LINEAR_MIPMAP_NEAREST tương ứng với  bilinear filtering with mipmaps. GL_LINEAR_MIPMAP_LINEAR tương ứng với  trilinear filtering. Sau đây là ví dụ: 

  • Như thế nào để thiết lập chế độ lọc Texture

Đầu tiên cần liên kết với texture. Sau đó chúng ta thiết lập bộ lọc thích hợp trên texture đó

GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureHandle);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, filter);


  • Như thế nào để tạo ra 1 mipmap

Điều này thực tế thì rất dễ dàng, sau khi loading texture vào Opengles, trong khi texture vẫn được liên kết chúng ta đơn giản gọi: 

GLES20.glGenerateMipmap(GLES20.GL_TEXTURE_2D);
Việc này tạo ra tất cả các mức độ mipmap cho chúng ta. Và mức độ này tự độ nhận, sử dụng phục thuộc vào bộ lọc texture mà chúng ta đã thiết lập.

  • Chúng nhìn như thế nào?

Nearest-neighbour rendering
GL_TEXTURE_MIN_FILTER = GL_NEAREST
GL_TEXTURE_MAG_FILTER = GL_NEAREST




Bilinear filtering, with mipmaps
Chế độ này được sử dụng rất nhiều ở thời kỳ đầu của game 3D nhanh và được sử dụng nhiều trong android hiện nay.
GL_TEXTURE_MIN_FILTER = GL_LINEAR_MIPMAP_NEAREST
GL_TEXTURE_MAG_FILTER = GL_LINEAR


Thật khó để nhìn thấy trên hình ảnh tĩnh này, nhưng khi mọi thứ đang chuyển động, bạn có thể nhận thấy băng ngang nơi các điểm ảnh render chuyển đổi giữa các mức mipmap.

  • Trilinear filtering


Chế độ này cải thiện về chất lượng render của Bilinear lọc với mipmaps, bằng cách nội suy giữa các mức mipmap.

GL_TEXTURE_MIN_FILTER = GL_LINEAR_MIPMAP_LINEAR
GL_TEXTURE_MAG_FILTER = GL_LINEAR

Các điểm ảnh được hoàn toàn làm nhẵn giữa các khoảng cách xa gần, trong thực tế, các textures có thể xuất hiện quá trơn ở góc xiên. Anisotropic Filtering là một kỹ thuật tiên tiến được hỗ trợ bởi một số GPU di động và có thể được sử dụng để cải thiện kết quả cuối cùng vượt quá những gì lọc Trilinear có thể cung cấp.



























Không có nhận xét nào:

Đăng nhận xét