Khúc xạ mắt Parallax


7

Tôi đang cố gắng thực hiện hiệu ứng khúc xạ Parallax được giải thích bởi Jorge Jimenez trong bài trình bày này: http://www.iryoku.com/doads/Next-Generation-Character-Rendering-v6.pptx và tôi đang gặp một số khó khăn. Dưới đây là một ảnh chụp màn hình của phần thú vị.

màn

Nhưng tài liệu này thiếu một chút giải thích, đặc biệt là phần thứ hai với khúc xạ vật lý .

Đây là những gì tôi đã đạt được cho đến thời điểm này.
Đây là hiệu ứng khúc xạ Parallax đơn giản và, như bạn có thể nhận thấy trong ảnh chụp màn hình, có một trục trặc nhỏ ở góc gặm cỏ trong mống mắt khi giá trị Parallax Scale quá cao.

Điều này được gây ra bởi tính toán thị sai nhưng có một số thủ thuật để tránh hoặc giảm thiểu vấn đề như vậy?

Hiện tại tôi không muốn đi sâu hơn với ánh xạ thị sai, vì vậy tôi không muốn sử dụng Ánh xạ Parallax hoặc Ánh xạ phân loại Parallax.

con mắt

Đây là mã. Không có gì thực sự đặc biệt.

// height value comes from a texture
float2 offset = height * viewDir;
offset.y = -offset.y;
texcoord -= ParallaxScale * offset;
// Next there is the texture sampling with the texcoord value

Tôi cũng có một câu hỏi khác về phần khúc xạ dựa trên vật lý không thực sự được giải thích rõ ràng và tôi thiếu cách tính một số giá trị như refractedW, frontNormalWhoặc heightW. Nếu bất cứ ai có thể cung cấp một số giải thích về những giá trị đó.

Cảm ơn rất nhiều.

Câu trả lời:


0

Đây là cách tôi tính toán vectơ khúc xạ theo định luật Snell.

float cosine = dot(viewDir, worldNormal);
float sine = sqrt(1 - cosine * cosine);

float sine2 = (_IOR * sine);
float cosine2 = sqrt(1 - sine2 * sine2);

float3 x = -worldNormal;
float3 y = normalize(cross(cross(viewDir, worldNormal), worldNormal));
float3 refractedW = x * cosine2 + y * sine2;

Điều này được tích hợp với Khúc xạ dựa trên vật lý và nó cho kết quả thú vị nhưng tôi vẫn không biết làm thế nào để thoát khỏi vấn đề tỷ lệ thị sai cao xuất hiện ở góc độ chăn thả ...

Bất cứ ý tưởng làm thế nào để có được giàn khoan đó?


Cũng có thể có một số cách để tối ưu hóa các tính toán về luật của Snell, mọi lời khuyên cũng được hoan nghênh về điều đó.
MaT

0

Khi tôi làm việc với Unity, tôi đã tìm thấy một cách thú vị để tính toán bù thị sai bên trong động cơ. Nó không dựa trên vật lý nhưng nó cho kết quả tốt hơn so với khúc xạ thị sai cổ điển.

float2 ParallaxOffset(half h, half height, half3 viewDir)
{
    h = h * height - height / 2.0;
    float3 v = normalize(viewDir);
    v.z += 0.42;
    return h * (v.xy / v.z);
}
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.