In vielen Spielen gibt es einen Abschnitt als benutzerdefinierten Charakter, in dem Sie Ihren eigenen Charakter erstellen können. Ich liebe es immer zu wissen, wie ich so etwas erstellen kann.
Auch altes Spiel haben diese Funktion? aber wie ?
Für die Implementierung benötige ich eine genaue Trennung für die Kommunikation zwischen Werten und Größe der Gesichtsteile. Also habe ich zuerst mehrere Höhenkarten basierend auf Gesichtsteilen erstellt, um sie mit dem Vertex-Shader zu ändern und korrekt zu arbeiten, aber diese Methode ist nicht optimal. Kann ich sie nur mit einer Textur implementieren?
Dann habe ich versucht, eine farbenfrohe Mapping-Textur zum Erkennen von Gesichtsteilen zu verwenden, aber ich habe Probleme, Farbwerte aus der Mapping-Textur in meinem Shader-Code zu erhalten.
Mapping-Textur:
Mein Problem ist, dass mein Scheitelpunkt-Shader nicht mit meiner Mapping-Textur übereinstimmt. Wenn ich zum Beispiel _NoseLength
andere Teile ändere, ändert sich dies . Wie kann ich dem Scheitelpunkt-Shader sagen, welcher Teil Nase, Stirn, Lippe, Wange, ... ist? Kartierung.
Hier ist mein Shader-Code:
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"
}
quelle