Trong nhiều trò chơi, có phần tùy chỉnh nhân vật mà bạn có thể tạo nhân vật của riêng mình. Tôi luôn thích biết làm thế nào tôi có thể tạo ra một cái gì đó giống như nó.
Ngay cả game cũ cũng có tính năng này? nhưng bằng cách nào ?
Để thực hiện Nó tôi cần phân tách chính xác để liên kết giữa các giá trị và kích thước bộ phận khuôn mặt. Vì vậy, trước tiên tôi đã tạo nhiều bản đồ chiều cao dựa trên các bộ phận trên khuôn mặt để sửa đổi bởi trình tạo bóng đỉnh và hoạt động chính xác nhưng phương pháp này không tối ưu. Tôi có thể thực hiện nó chỉ bằng một kết cấu không?
sau đó tôi đã thử bằng cách sử dụng kết cấu ánh xạ đầy màu sắc để phát hiện các phần trên khuôn mặt, nhưng tôi gặp vấn đề khi nhận các giá trị màu từ kết cấu ánh xạ Trong mã shader của tôi.
kết cấu bản đồ:
Vấn đề của tôi là shader đỉnh của tôi không phù hợp với kết cấu ánh xạ của tôi. Ví dụ: Nếu tôi thay đổi _NoseLength
các phần khác sẽ thay đổi. Làm thế nào tôi có thể nói với shader vertex phần nào là mũi, trán, môi, má, ... lập bản đồ.
Đây là Mã Shader của tôi:
Shader "Custom/Extrude" {
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
_ModTex ("Vertex Modify", 2D) = "white" {}
_NoseLength ("NoseLength ", Range(-0.05,0.01)) = 1.0
_LipSize ("LipSize ", Range(-0.05,0.01)) = 1.0
_CheekBones ("CheekBones ", Range(-0.05,0.01)) = 1.0
_ForeHead ("ForeHead ", Range(-0.05,0.01)) = 1.0
_EyeSize("EyeSize", Range(-0.05,0.01)) = 1.0
}
SubShader {
Tags { "RenderType"="Opaque" "Queue" = "Transparent"}
Cull off
CGPROGRAM
#pragma surface surf Lambert vertex:vert
#pragma target 3.0
sampler2D _MainTex;
sampler2D _ModTex;
uniform fixed _NoseLength;
uniform fixed _LipSize;
uniform fixed _CheekBones;
uniform fixed _ForeHead;
uniform fixed _EyeSize;
struct Input {
float2 uv_MainTex;
};
void vert(inout appdata_full v) {
float4 lipSize = tex2Dlod(_ModTex, float4(v.texcoord.xy, 0, 0)).g;//Green
float4 nose = tex2Dlod(_ModTex, float4(v.texcoord.xy, 0, 0)).b; //Blue
float4 eye = tex2Dlod(_ModTex, float4(v.texcoord.xy, 0, 0)).r; // Red
float2 cheek = tex2Dlod(_ModTex, float4(v.texcoord.xy, 0, 0)).rg; // Yellow
float2 forehead = tex2Dlod(_ModTex, float4(v.texcoord.xy, 0, 0)).rb; // Purple
v.vertex.y += _LipSize * lipSize;
v.vertex.y += _NoseLength * nose;
v.vertex.y += _EyeSize * eye;
v.vertex.y += _CheekBones * cheek;
v.vertex.y += _ForeHead * forehead ;
}
void surf (Input IN, inout SurfaceOutput o) {
half4 c = tex2D (_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}