Làm thế nào tôi có thể tạo ra một hiệu ứng long lanh?


9

Tôi đang cố gắng tạo hiệu ứng lấp lánh cho trình tạo bóng thời gian thực của mình nhưng tôi không biết làm thế nào.

Đây là một ví dụ , và một ví dụ khác .

nhập mô tả hình ảnh ở đây

Tôi có thể sử dụng kỹ thuật gì để thực hiện điều này?


Nó có thể đạt được thông qua hiệu ứng Hậu xử lý, tương tự như nở hoa, nhưng áp dụng mô hình (kết cấu sao) cho pha xuống mẫu. Đây chỉ là suy đoán khó khăn.
bất thường

1
Một bản đồ bình thường và đặc biệt sẽ cho phép bạn làm điều này thông qua một kết cấu?
JohnB

Tôi đã thực hiện một số thử nghiệm bằng cách sử dụng bản đồ bình thường. Nhưng điều khó là làm cho chúng lấp lánh theo hướng nhìn và hướng ánh sáng.
MaT

Câu trả lời:


10

Chà, khi được yêu cầu thiết kế bất kỳ shader nào, chúng ta nên bắt đầu bằng cách phá vỡ mọi thứ thành những vấn đề nhỏ hơn. Và cũng giống như lưu ý, hiệu ứng lấp lánh không thực sự làm cho shader trông đẹp, nhưng ánh sáng và hiệu ứng tổng thể, chỉ sử dụng một trong số chúng sẽ không đẹp như vậy.

Trước hết chúng ta hãy nói những gì không phải là một phần trực tiếp của shader:

  1. Shadowing không phải là một phần của shader và nó được thực hiện thông qua pass Shadowing riêng biệt.
  2. Tôi giả sử có sự tắc nghẽn xung quanh (đặc biệt là hình ảnh này được hiển thị trong câu hỏi đặc biệt không sử dụng trình kết xuất thời gian thực nhưng đó là một giả định).

Thứ hai, hãy phá vỡ shader thực tế thành các hiệu ứng riêng biệt:

  1. Có một bất đẳng hướng như ánh sáng, điều này rất cơ bản đối với cái nhìn tổng thể của shader. Lý do đằng sau điều này là vì vật liệu thực tế có chứa vải, những loại vải sáng bóng này làm cho sự phản xạ ánh sáng có sự lệch hướng, tạo ra lượng ánh sáng phản xạ nhiều nhất theo hướng nhất định đó.

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây Lưu ý rằng các loại vải như vậy có vô số quy tắc, nhưng kỹ thuật được mô tả ở đây gần đúng với mức bình thường đáng kể nhất

Để xấp xỉ quan trọng nhất bình thường, có một cách để làm, là sử dụng kết cấu tọa độ và tiếp tuyến tính toán của lưới, và thay vì tính toán N . L bạn tính 1- (NT).

Giải thích đầy đủ ở đây . Và có lẽ bạn cần phải thực hiện điều đó trong shader mảnh hơn là kỹ thuật đỉnh mà họ nói đến. Các mô hình dị hướng khác cũng có thể được áp dụng.

Bây giờ cho hiệu ứng lấp lánh:

Điều này có thể được thực hiện trong không gian thế giới / không gian kết cấu cục bộ hoặc không gian màn hình dưới dạng một đường chuyền riêng.

Thuật toán tôi có thể nghĩ ra, sử dụng kỹ thuật xử lý hình ảnh (giả sử lưới có các kết cấu kết cấu).

  • Tạo tiếng ồn 2D tần số cao trên bề mặt lưới bằng tọa độ kết cấu của nó, nhiễu perlin có vẻ là một ứng cử viên tốt.
  • Áp dụng bộ lọc tối đa bằng hạt nhân 3x3 trên tạp âm. Điều này sẽ tạo ra một hiệu ứng tương tự như hình ảnh bên dưới và bộ lọc tối đa được mô tả ở đây .

nhập mô tả hình ảnh ở đây

Lưu ý hình ảnh trên chỉ là một ví dụ về bộ lọc tối đa và việc áp dụng nó vào nhiễu sẽ cho sth tương tự như trường sao.

  • Khi bạn đã thực hiện điều này, hãy áp dụng bộ lọc Gaussian với độ lệch nhất định về nhiễu để có được hình dạng giống như ngôi sao.

nhập mô tả hình ảnh ở đây

Ví dụ về bộ lọc Gausian áp dụng cho nhiễu tối đa (ed).

  • Bước cuối cùng là kết hợp điều này với kết cấu và ánh sáng lưới ban đầu. Điều này được thực hiện tốt nhất bằng cách sử dụng thao tác nhị phân (|) hoặc-ing với kết cấu / màu gốc của lưới, việc này sẽ chỉ lấy màu trắng khỏi nhiễu và loại bỏ bất kỳ pixel đen nào. Về ánh sáng (và có thể cả các bản đồ đặc trưng khác), điều tốt nhất cần làm là thêm nó hoặc điều chỉnh nó với các pixel được kết hợp trước đó của bạn. Bạn cũng có thể cần một hiệu ứng xử lý hậu phát sáng để có ánh sáng tốt hơn.

Lưu ý, kỹ thuật này có thể cần tối ưu hóa đáng kể cho trình tạo bóng thời gian thực.


3

Có một bài viết thú vị AMD - Bắt đầu thủ tục .

Có vẻ như lấp lánh khó hơn tôi nghĩ.
Giải pháp Decent: Sử dụng vị trí 3D để lập chỉ mục chức năng nhiễu 3D, thêm vectơ xem, sử dụng chức năng frac để tiếp tục ngẫu nhiên hóa mọi thứ.

Sparkle:
float specBase = saturate(dot(reflect(-normalize(viewVec), normal),
lightDir));
// Perturb a grid pattern with some noise and with the view-vector
// to let the glittering change with view.
float3 fp = frac(0.7 * pos + 9 * Noise3D( pos * 0.04).r + 0.1 * viewVec);
fp *= (1 - fp);
float glitter = saturate(1 - 7 * (fp.x + fp.y + fp.z));
float sparkle = glitter * pow(specBase, 1.5);
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.