bóng dựa trên vật lý, làm thế nào để kết hợp các bộ phận đầu cơ & khuếch tán?


8

Sau khi viết shader 'tiêu chuẩn' phong & blinn một thời gian, gần đây tôi bắt đầu học cách tạo bóng dựa trên cơ thể. Một tài nguyên đã giúp tôi rất nhiều là những ghi chú khóa học , đặc biệt là bài viết này - nó giải thích làm thế nào để làm cho blinn trở nên bóng hơn về mặt vật lý.

Tôi đã mô phỏng mô hình blinn được đạo cụ trong bài báo, và tôi thực sự thích nó trông như thế nào. Sự thay đổi đáng kể nhất được đề xuất (imo) là sự bao gồm của phản xạ fresnel, và đây cũng là phần mang lại cho tôi các vấn đề. Thật không may, tác giả đã chọn chỉ tập trung vào phần đầu cơ, bỏ qua phản xạ khuếch tán. Ví dụ như một phản xạ khuếch tán lambertian, tôi chỉ không biết làm thế nào để kết hợp nó với blinn 'được cải thiện' - bởi vì chỉ cần thêm các phần khuếch tán & đặc biệt dường như không còn đúng nữa.

Trong một số shader tôi đã thấy một dấu phẩy động 'thuật ngữ fresnel' trong phạm vi 0 - 1 đang được sử dụng, dựa trên các chỉ số khúc xạ của phương tiện tham gia. Xấp xỉ của Schlick được sử dụng mỗi lần:

float schlick( in vec3 v0, in vec3 v1, in float n1, in float n2 )
{
    float f0 = ( n1 - n2 ) / ( n1 + n2 );
    f0 *= f0;   
    return f0 + ( 1 - f0 ) * pow( dot( v0, v1 ), 5 );
} 

Làm như thế này, người ta có thể nội suy tuyến tính giữa đóng góp khuếch tán và đầu cơ dựa trên thuật ngữ fresnel, ví dụ

float fresnel = schlick( L, H, 1.0002926 /*air*/, 1.5191 /*other material*/ );
vec3 color = mix( diffuseContrib, specularContrib, fresnel );

Trong bài báo, tác giả nói rằng cách tiếp cận này không chính xác - vì về cơ bản, nó chỉ làm tối màu cơ bản bất cứ khi nào L song song hoặc gần như song song với H - và thay vì tính toán một chỉ số dựa trên các chỉ số khúc xạ, bạn nên xử lý đặc điểm tô màu chính nó như là 0,2 và có xấp xỉ schlick của bạn tính toán một vec3, như thế này:

vec3 schlick( in vec3 v0, in vec3 v1, in vec3 spec )
{
    return spec + ( vec3( 1.0 ) - spec ) * pow( dot( v0, v1 ), 5 );
}

Điều này dẫn đến màu sắc đặc trưng sẽ chuyển sang màu trắng ở các góc nhìn.

Bây giờ câu hỏi của tôi là, làm thế nào tôi sẽ giới thiệu một thành phần khuếch tán vào đây? Ở 90 °, phần đóng góp đặc biệt có màu trắng hoàn toàn, điều này có nghĩa là tất cả ánh sáng tới được phản xạ, do đó không thể có sự đóng góp lan tỏa. Đối với các góc tới <90 °, tôi có thể nhân toàn bộ phần khuếch tán với (vec3 (1) - schlick), tức là tỷ lệ ánh sáng không bị phản xạ không?

vec3 diffuseContrib = max( dot( N, L ), 0.0 ) * kDiffuse * ( vec3( 1.0 ) - schlick( L, H, kSpec ) );

Hay tôi cần một cách tiếp cận hoàn toàn khác?


2
Bạn đã bao giờ giải quyết điều này? Tôi đang có vấn đề chính xác này ngay bây giờ.

1
Tôi cũng muốn một câu trả lời cho điều đó. Lagarde cũng đã đề xuất một phép trừ tương tự về màu sắc cơ bản (cuối cùng anh ta "không sử dụng") nhưng tất cả điều này có vẻ rất tùy tiện.
v.oddou

Câu trả lời:


1

Câu trả lời ngắn gọn:

Nó có vẻ đủ tốt?

  • Có - Giữ nó.

  • Không - Fiddle với nó một số chi tiết.

Câu trả lời dài:

Để tạo bóng dựa trên vật lý thực tế chính xác đòi hỏi nhiều sức mạnh GPU hơn mức có thể, bạn sẽ luôn phải dùng đến việc giả mạo mọi thứ vì lý do đơn giản là máy tính không thể mô phỏng toàn bộ vũ trụ, thậm chí không phải toàn bộ phổ ánh sáng khả kiến.

Đó là "thung lũng kỳ lạ" của bóng râm.

Không chỉ do ánh sáng xung quanh và sự che khuất mà ví dụ môi trường bên ngoài cả ban ngày và ánh trăng có một lượng ánh sáng phổ UV rất lớn, một chút trong số đó bị chuyển trở lại phổ khả kiến ​​bởi các vật liệu khác nhau, chủ yếu là các vật liệu hữu cơ. Các loại ánh sáng ống huỳnh quang khác nhau và HID cũng phát ra một lượng ánh sáng tia cực tím tốt.

Hiệu quả là rất nhỏ nhưng nhờ nhiều năm tiến hóa, bộ não xử lý theo bản năng vì điều này có nghĩa là sự khác biệt giữa một bữa ăn ngon và có thể là một cái chết kéo dài đến nỗi nếu một cái gì đó hơi bị tắt khỏi não của chúng ta sẽ phát ra âm thanh "có gì đó không ổn" .

Phong cách nghệ thuật hoạt hình, phi thực tế và gần như thực tế nhưng có chủ ý ngoài lề (ví dụ: Halo) tránh vấn đề này.

Một vấn đề khác là không có hai người có cùng sự hiện diện của thụ thể RYGBL cũng như đường cong phản ứng trong khi màn hình hoàn toàn là RGB và do đó không thể tái tạo hoàn hảo hình ảnh cho tất cả mọi người. (Đỏ, Vàng, Xanh lục, Xanh lam và Luma, xem Tetrachromacy - http://en.wikipedia.org/wiki/Tetrachromacy )

Cho dù bạn làm việc chăm chỉ đến đâu, sẽ có "điều gì đó không ổn" với nó và có thể cải thiện, ít nhất là cho một ai đó ở đâu đó.

Và đây là một lý do tại sao có rất nhiều mô hình bóng.

Bởi vì tất cả điều này, một nghệ sĩ giỏi luôn kết thúc gian lận mức độ phản ứng ánh sáng và ánh sáng trên môi trường ở một mức độ nào đó để đạt được kết quả "đủ tốt" (không bao giờ hoàn hảo), chỉ cần cho họ quyền truy cập vào các cài đặt và gian lận theo cách của họ để làm hài lòng kết quả.


Có quá nhiều nghiên cứu trong lĩnh vực này để đưa ra một câu trả lời không như vậy.
Tara

@Tara, chào mừng bạn đến với Stack Exchange. Tôi chắc chắn rằng với tất cả "quá nhiều nghiên cứu trong lĩnh vực này", bạn sẽ dành thời gian để viết một câu trả lời không "không trả lời" thích hợp và đóng góp cho cộng đồng thay vì chỉ nhận xét một dòng. Có một nút nhỏ trên trang này có nội dung "Thêm câu trả lời khác" nếu bạn có thể tìm thấy nó. Có thể cần một chút nghiên cứu để tìm thấy nó nhưng nó ở đó.
Stephane Hockenhull

Wow, làm thế nào thụ động-tích cực. Tôi đã không nói rằng tôi biết rõ hơn. Tôi nói rằng tôi biết có rất nhiều nghiên cứu ngoài kia đang cố gắng giải quyết vấn đề này bằng cách không chỉ "làm bất cứ điều gì" và tiếp tục nghiên cứu về bộ não con người và cái chết.
Tara

Tôi vẫn không thấy một câu trả lời mới nào ngoài năm 2014 "không trả lời" đó và bình luận một dòng, không mang tính xây dựng, tích cực được đăng 5 năm sau. Bạn được chào đón 100% để thực hiện tất cả các nghiên cứu đó (trong đó bạn đã cung cấp không có liên kết nào cho đến nay, chỉ là một nhận xét một dòng) hoàn toàn có thể áp dụng cho các công cụ trò chơi thời gian thực và dành thời gian để tóm tắt nó thành một câu trả lời thích hợp.
Stephane Hockenhull

Tôi khỏe cảm ơn. Tôi đã đánh giá thấp câu hỏi và thêm nhận xét ban đầu của mình để giải thích lý do tại sao tôi làm như vậy, bởi vì mọi người không thích những câu hỏi không giải thích được.
Tara
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.