Analyse inversée de l'effet de rendu du jeu Unity-shader


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

image-20220721163816269

Tester l'adresse git du shader :[email protected]:yangxuan0261/tdmj_shader.git

La principale chose à regarder est le traitement des pièces suivantes

  1. Vers la partie lumière/rétroéclairage
  2. accident vasculaire cérébral
  3. 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

comme

Vous pouvez voir que le rendu du corps de la carte est séparé du trait


2. AVC

comme

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.

image-20220721165110995


3. Ombre

fds


Je suppose que tu aimes

Origine blog.csdn.net/yangxuan0261/article/details/125946318
conseillé
Classement