Làm cách nào để triển khai khử răng cưa trong OpenGL?


28

Tôi muốn thực hiện khử răng cưa toàn màn hình trong OpenGL và không muốn sử dụng khử răng cưa do chính OpenGL cung cấp, vì tôi đang xây dựng một trò chơi và muốn có hiệu ứng tốt trong đó.

Tôi nên tiến hành như thế nào?


Bằng "tính năng khử răng cưa do chính GL cung cấp", bạn có đề cập đến các gợi ý về chất lượng đa giác và dòng được đặt tên kém được gắn nhãn là "khử răng cưa" hay bạn đang đề cập đến việc sử dụng MSAA thông thường qua hình ảnh GLX / WGL?
Lars Viklund

Câu trả lời:


28

Có một số lựa chọn thay thế cho MSAA bản địa trong OpenGL. Với các hiệu ứng xử lý hậu kỳ, điều tốt nhất về chúng là bạn thường có thể ném bóng vào hình ảnh cuối cùng, chưa xử lý và phần còn lại sẽ làm. Dưới đây là ba phương pháp đáng để xem:

  • Khử răng cưa gần đúng nhanh (Geek3D) - Tốt trong hầu hết các trường hợp. Khá dễ dàng để áp dụng và hiểu. Nhược điểm là sắc nét, độ tương phản cao trong kết cấu bị mờ đi một chút. Các cạnh có độ dốc cao bằng 1/4 pixel trông chính xác như MSAA truyền thống. Bất kỳ độ dốc nào thấp hơn thế, nó sẽ mất một chút độ chính xác.

  • Khử răng cưa bình thường (GameDev ) - Chưa thử nghiệm chính xác cái này, nhưng nó dễ hiểu nhất. Trong trường hợp tốt nhất, nó giống với 16 lần MSAA và trong trường hợp xấu nhất, nó giống như gấp đôi MSAA. Nó tạo ra một bản đồ bình thường tạm thời để thể hiện các cạnh và các góc tương đối. Bạn có thể lấy mẫu bản đồ bình thường với độ lệch màu hoặc độ lệch màu.

  • Khử răng cưa hình thái (Iryoku) - đã được cải tiến thành SMAA - Subpixel Mophological AA. Nó khá phức tạp ở 4 đường chuyền, nhưng đạt được kết quả tốt nhất tôi từng thấy. Nó tạo độ dốc dọc theo các cạnh dần dần theo độ dốc 1/100 đến 1/200 pixel (!). Lấy mẫu có thể dựa trên luma, dựa trên màu sắc hoặc dựa trên chiều sâu. Hoạ tiết vẫn rất sắc nét và sạch sẽ. (ví dụ dựa trên DX10 và HLSL, sẽ mất một thời gian để chuyển nó sang GLSL một cách chính xác)

Các kỹ thuật này không siêu mẫu hoặc đa mẫu, do đó, các dòng có độ dày dưới 1 pixel sẽ xuất hiện với các khoảng trống và không được khử răng cưa chính xác. Đây là nhược điểm của việc sử dụng phương pháp không MSAA. Vì bạn chỉ làm việc với hình ảnh raster ở độ phân giải đầy đủ, bạn không thể tạo thêm thông tin từ những khoảng trống này.

Lưu ý rằng tất cả các kỹ thuật này phụ thuộc vào việc lấy mẫu các giá trị độ sáng (độ sáng) hoặc sắc độ (màu) liền kề. Tính toán độ sáng và hiệu chỉnh gamma tùy chọn yêu cầu các hướng dẫn bổ sung về trình tạo bóng AA, mặc dù điều này khá đơn giản. Bạn có thể giảm tải điều này bằng cách tính toán độ sáng trong trình đổ bóng trước đó cung cấp hình ảnh chưa được chỉnh sửa, lưu trữ độ sáng trong kênh alpha. Sau đó, trong trình tạo bóng AA, bạn chỉ cần lấy mẫu alpha.


7

Có rất nhiều cách để khử răng cưa. Một là sử dụng khử răng cưa đa mẫu (MSAA), trong đó bộ đệm phía sau của bạn thực sự lưu trữ nhiều mẫu pixel phụ và khi bạn hiển thị hình tam giác, đường, v.v., hệ thống sẽ tự động điền vào bộ mẫu chính xác trong mỗi pixel. Sau đó, khi kết thúc hiển thị, hình ảnh được "giải quyết" bằng cách lấy trung bình trên tất cả các mẫu pixel phụ để lấy một mẫu trên mỗi pixel.

Một cách khác là sử dụng khử răng cưa xử lý hậu kỳ, trong đó bạn hiển thị cảnh như bình thường và sau đó thực hiện một số mục tiêu làm mờ trên kết quả cuối cùng để ẩn các cạnh bí danh. Có nhiều kỹ thuật cho việc này, nhưng một trong những kỹ thuật tốt nhất / phổ biến nhất tại thời điểm này được gọi là FXAA (Khử răng cưa nhanh gần đúng).

MSAA nói chung sẽ cho kết quả đẹp hơn so với xử lý hậu kỳ AA, nhưng có thể chậm hơn vì nó yêu cầu khoảng gấp đôi băng thông bộ nhớ cho mỗi hoạt động kết xuất. MSAA cũng có thể yêu cầu nhiều bộ nhớ video hơn xử lý hậu kỳ AA, tùy thuộc vào chi tiết thiết lập.

Bạn có thể tìm thấy thông tin cụ thể về việc triển khai MSAA hoặc FXAA trên Web - chỉ cần google một trong những điều khoản đó.


2

Bạn có sẵn sàng viết mã shader GLSL của riêng mình không? Nếu vậy, hãy xem hướng dẫn này .


tôi cũng muốn làm điều đó bằng cách sử dụng shader vì tôi cũng sử dụng shader cho các hiệu ứng khác. Bạn có thể cung cấp một số liên kết khác cho shader nữa không
gật đầu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.