介绍

经常会发现有些 Unity 游戏的 Shader 效果做得很棒,如果想要查看是如何实现的,就需要对其进行反编译。但是使用解压工具解出的 Shader 并不能直接使用,它是 Unity 编译出的中间语言,想要放在 Unity 里直接使用需要将其反编译为 CG Shader。

环境

  • AssetStudio v0.13.x

Unity 版本不限,只有可以解压 AssetBundle 资源即可。

方法

对比资料

由于 Unity 生成 Shader 的中间语言并没有官方的详细资料,因此需要自行制造对比资料。

  1. 前往 Unity - Download Archive 下载指定 Unity 版本的 Built in Shaders
  2. 然后新建 Unity 工程,将所有 .shader 文件设置 AssetBundleName,再构建 AssetBundle。
  3. 使用 Asset Studio 解压这些 AssetBundle,并将解压出的文件与 Built in Shaders 放在同一个目录下。
  4. 使用如 Visual Studio Code 之类的文本编译器打开目录,然后根据需要就可以进行全局文本搜索了。
  5. 这样就可以看到同一个 Shader 在编译前后不同的样子,可以用于学习。

参考信息

中间语言 CG语言
highp float
mediump half
lowp fixed
highp mat3 float3x3
mediump float half
lowp vec4 fixed4

To access different vertex data, you need to declare the vertex structure yourself, or add input parameters to the vertex shader. Vertex data is identified by Cg/HLSL semantics, and must be from the following list:

  • POSITION is the vertex position, typically a float3 or float4.
  • NORMAL is the vertex normal, typically a float3.
  • TEXCOORD0 is the first UV coordinate, typically float2, float3 or float4.
  • TEXCOORD1, TEXCOORD2 and TEXCOORD3 are the 2nd, 3rd and 4th UV coordinates, respectively.
  • TANGENT is the tangent vector (used for normal mapping), typically a float4.
  • COLOR is the per-vertex color, typically a float4.

Unity - Manual : Providing vertex data to vertex programs


  • attribute 表示是 struct appdata 用于输入数据
  • uniform 表示是常量,放在 Shader 外面用于索引纹理、变量等等。
  • * 乘法操作在 CG Shader 中是以 mul 方法体现的。
  • mix 操作一般对应于 lerp,参考 What is the correct way to mix colours in a surface shader? - Unity Answers
  • xlEffectColorEffectColor 变量表示 EffectColor 这个变量被代码中被重新赋值了。

结论

经过实际测试,可以成功反编译 Unity 游戏中的 Shader 并导入到 Unity 中使用。

由于在编写 Shader 时会使用条件编译,加入很多宏,因此使用 Asset Studio 解压出的 Shader 也有很多不同宏定义的版本,需要根据实际情况决定反编译哪些。