- Link download project: https://github.com/ThachTung/hair-01
- UV của mesh: ít chồng uv lên nhau, có thể trải uv từ trái qua phải hoặc trên xuống dưới đều được. Material của Unreal Engine có hỗ trợ parameter để mình tinh chỉnh linh hoạt hơn ở chỗ này.
- Version của Unreal Engine: dự án này được thực hiện trên UE 4.27.
Original idea and work: https://www.youtube.com/watch?v=IO5bjLuUE2E
Node graph của material trong Unreal Engine
Đầu tiên là phần input cơ bản. Ở khu vực này sẽ bao gồm các parameter để tinh chỉnh
scale, angle của texture và có một parameter để nhận texture đầu vào cho phần tóc. Texture này sẽ được dùng để tạo ra các sợi tóc ở bước tiếp theo.
Kế tiếp là bước tính toán mask cho phần sợi tóc. Texture và UV ở bước đầu tiên sẽ được dùng ở đây.
Từ một base texture, mình sẽ có hai sample để kết hợp với nhau, tạo nên 1 phiên bản mới, tránh việc nhìn thấy pattern lặp lại quá nhiều ở base texture. Hai hình bên dưới là hai phiên bản khác nhau sau khi tinh chỉnh parameter offset và contrast của texture sample.
Tiếp đến là phần mask gradient cho tóc, phần này sẽ giúp tạo ra hiệu ứng mờ dần ở phần đuôi tóc, tránh việc nhìn thấy phần đuôi tóc bị cứng hoặc quá đều màu. Phần mask này là một dải gradient đen trắng được apply lên UV từ trái qua phải hoặc trên xuống dưới. Parameter Base Gradient Axis Invert được dùng tương tự như lệnh Invert (Ctrl + I) trong Photoshop, để có thể linh hoạt hơn trong việc sử dụng dải gradient này.
Mask của sợi tóc và mask gradient sẽ được kết hợp với nhau để tạo ra mask cuối cùng cho phần sợi tóc. Mask này sẽ được dùng để tint màu. Hai hình bên dưới là hai phiên bản khác nhau sau khi tinh chỉnh parameter liên quan.
Kế đến là phần mask cho "fake anitrosopy". Các tính toán cũng tương tự với phần mask gradient, nhưng có thêm phần tính toán offset UV với hướng vector Z (trục thẳng đứng) của camera.
Hai hình bên dưới là ví dụ về vùng hiển thị của "fake anitrosopy" mask khi thay đổi góc nhìn của camera
Tiếp đến là phần tính toán mask cho sợi tóc ở trong vùng "fake anitrosopy". Cách tính toán cũng tương tự với phần mask cho sợi tóc ở trên. Sau đó, phần mask đã được tính toán được dùng để kết hợp với phần mask "fake anitrosopy".
Hình bên dưới là kết quả cuối cùng ở bước này.
Bước cuối cùng, các mask được kết hợp với nhau và định ra phần màu hiển thị của tóc. Cũng như là roughness, metallic, specular và normal. Ở bước này, normal sẽ được generate ra từ phần mask của sợi tóc, nên sẽ không có normal map texture đầu vào. Cách generate normal map cũng khá đơn giản, mình sẽ dùng phần mask của sợi tóc để tạo ra "height map", sau đó dùng node NormalFromHeight để tạo ra normal map.
Một ví dụ khác khi mình thay đổi tấm texture đầu vào. Lưu ý, texture nên có dạng seamless, để tránh tình trạng có seam như sample bên dưới.