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)
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 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
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
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
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