titre : unity-shader-reverse analyse des effets de rendu du jeu
catégories : Unity3d-Shader
tags : [unity, shader, glsl, reverse]
date : 2022-07-18 18:59:06
commentaires : false
mathjax : true
toc : true
Analyse inversée de l'effet de rendu du jeu
Préquelle
C'est tout pour copier les effets d'autres personnes, en utilisant un logiciel tel que Snapdragon Profiler pour capturer une certaine image rendue par les jeux d'autres personnes, et la restaurer dans le code de shader du moteur correspondant via l'ingénierie inverse glsl.
Il doit y avoir une comparaison lors de la restauration, par exemple, pour restaurer un jeu créé par l'unité, vous pouvez d'abord écrire des shaders, l'emballer et utiliser snapdragon pour voir quel type de glsl la fonction du shader unity rend finalement lors du rendu, puis face à celui qu'il faut renverser Le jeu repousse au shader de l'unité.
Inverse de diverses fonctions
normaliser la normalisation
// normalize(_WorldSpaceLightPos0.xyz)
u_xlat0.x = dot(_WorldSpaceLightPos0.xyz, _WorldSpaceLightPos0.xyz);
u_xlat0.x = inversesqrt(u_xlat0.x);
u_xlat0.xyz = u_xlat0.xxx * _WorldSpaceLightPos0.xyz;
UnityObjectToWorldNormal
// UnityObjectToWorldNormal(v.normal)
u_xlat1.x = dot(in_NORMAL0.xyz, unity_Builtins0Array[u_xlati0 / 8].hlslcc_mtx4x4unity_WorldToObjectArray[0].xyz);
u_xlat1.y = dot(in_NORMAL0.xyz, unity_Builtins0Array[u_xlati0 / 8].hlslcc_mtx4x4unity_WorldToObjectArray[1].xyz);
u_xlat1.z = dot(in_NORMAL0.xyz, unity_Builtins0Array[u_xlati0 / 8].hlslcc_mtx4x4unity_WorldToObjectArray[2].xyz);
u_xlat0.x = dot(u_xlat1.xyz, u_xlat1.xyz);
u_xlat0.x = inversesqrt(u_xlat0.x);
u_xlat0.xyz = u_xlat0.xxx * u_xlat1.xyz;
UnityObjectToClipPos
// UnityObjectToClipPos(v.vertex);
u_xlat1 = in_POSITION0.yyyy * unity_Builtins0Array[u_xlati0 / 8].hlslcc_mtx4x4unity_ObjectToWorldArray[1];
u_xlat1 = unity_Builtins0Array[u_xlati0 / 8].hlslcc_mtx4x4unity_ObjectToWorldArray[0] * in_POSITION0.xxxx + u_xlat1;
u_xlat1 = unity_Builtins0Array[u_xlati0 / 8].hlslcc_mtx4x4unity_ObjectToWorldArray[2] * in_POSITION0.zzzz + u_xlat1;
u_xlat1 = u_xlat1 + unity_Builtins0Array[u_xlati0 / 8].hlslcc_mtx4x4unity_ObjectToWorldArray[3];
u_xlat2 = u_xlat1.yyyy * hlslcc_mtx4x4unity_MatrixVP[1];
u_xlat2 = hlslcc_mtx4x4unity_MatrixVP[0] * u_xlat1.xxxx + u_xlat2;
u_xlat2 = hlslcc_mtx4x4unity_MatrixVP[2] * u_xlat1.zzzz + u_xlat2;
u_xlat1 = hlslcc_mtx4x4unity_MatrixVP[3] * u_xlat1.wwww + u_xlat2;
gl_Position = u_xlat1;
saturer
// saturate
#ifdef UNITY_ADRENO_ES3
u_xlat0.x = min(max(u_xlat0.x, 0.0), 1.0);
#else
u_xlat0.x = clamp(u_xlat0.x, 0.0, 1.0);
#endif
comparaison de taille
// bool a = b < c.x;
#ifdef UNITY_ADRENO_ES3
u_xlatb1 = !!(u_xlat16_14<u_xlat16_0.x);
#else
u_xlatb1 = u_xlat16_14<u_xlat16_0.x;
#endif
variable
lecture intensive
flotteur moyen uniforme -> demi (moyen intensif)
entrée sortie
in mediump vec4 in_POSITION0;
in mediump vec3 in_NORMAL0;
in mediump vec2 in_TEXCOORD0;
// 对应 unity
struct appdata_t {
half4 vertex : POSITION;
half3 normal : NORMAL;
half2 texcoord : TEXCOORD0;
};
sortir
out mediump vec2 vs_TEXCOORD0;
out mediump vec3 vs_TEXCOORD1;
// 对应 unity
struct v2f {
half4 vertex : SV_POSITION; // unity 必要的属性
half2 texcoord : TEXCOORD0;
half3 tex02 : TEXCOORD1;
};
uniforme
uniform vec4 _WorldSpaceLightPos0; // unity 内置的世界空间下的 灯光位置
uniform mediump vec4 _Tint;
uniform mediump vec4 _ColorLight;
uniform mediump vec4 _ColorUnlight;
uniform mediump float _SplitThreshold;
// 对应 unity
_Tint("Tint", Color) = (1,1,1,1)
_ColorLight("ColorLight", Color) = (1,1,0,1)
_ColorUnlight("ColorUnlight", Color) = (0,0,0,1)
_SplitThreshold("SplitThreshold", float) = 1
half4 _Tint;
half4 _ColorLight;
half4 _ColorUnlight;
half _SplitThreshold;
Exemple 01 - Âme d'oiseau
Diagramme de la carte à jouer de la salle
Tester l'adresse git du shader :[email protected]:yangxuan0261/tdmj_shader.git
La principale chose à regarder est le traitement des pièces suivantes
- Vers la partie lumière/rétroéclairage
- accident vasculaire cérébral
- ombre
1. Découvrez d'abord le rendu du corps de la carte
Modifiez directement la valeur fs rgb à une certaine valeur, il est facile de trouver le lot de rendu du corps de la carte
Vous pouvez voir que le rendu du corps de la carte est séparé du trait
2. AVC
Agrandissez le corps de la carte, supprimez le recto lorsque le shader le traite et ne restituez que le verso. En raison de la relation de profondeur, il est bloqué par le corps normal de la carte et l'effet de trait apparaît.
Et tous les modèles agrandis des cartes peuvent également être traités en un seul lot.