Unity Shader 反编译
文章目录
介绍
经常会发现有些 Unity 游戏的 Shader 效果做得很棒,如果想要查看是如何实现的,就需要对其进行反编译。但是使用解压工具解出的 Shader 并不能直接使用,它是 Unity 编译出的中间语言,想要放在 Unity 里直接使用需要将其反编译为 CG Shader。
环境
- AssetStudio v0.13.x
Unity 版本不限,只有可以解压 AssetBundle 资源即可。
方法
对比资料
由于 Unity 生成 Shader 的中间语言并没有官方的详细资料,因此需要自行制造对比资料。
- 前往 Unity - Download Archive 下载指定 Unity 版本的
Built in Shaders
。 - 然后新建 Unity 工程,将所有
.shader
文件设置 AssetBundleName,再构建 AssetBundle。 - 使用 Asset Studio 解压这些 AssetBundle,并将解压出的文件与
Built in Shaders
放在同一个目录下。 - 使用如 Visual Studio Code 之类的文本编译器打开目录,然后根据需要就可以进行全局文本搜索了。
- 这样就可以看到同一个 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 AnswersxlEffectColorEffectColor
变量表示EffectColor
这个变量被代码中被重新赋值了。
结论
经过实际测试,可以成功反编译 Unity 游戏中的 Shader 并导入到 Unity 中使用。
由于在编写 Shader 时会使用条件编译,加入很多宏,因此使用 Asset Studio 解压出的 Shader 也有很多不同宏定义的版本,需要根据实际情况决定反编译哪些。