虽然都快2020了,但是项目用的是2018版本,最近要改下材质,所以分析一下18版的HDRP Standard。
暂时不考虑多层材质和曲面细分,并且项目用的是Forward管线,也暂时不分析Deffered。
Forward
直接引用的Library
先简单看看shader中直接引用的库。
Common
开头介绍了一些library编写的惯例:
- 变量后缀
- WS: world space
- RWS: Camera-Relative world space
- VS: view space
- OS: object space
- CS: Homogenous clip spaces
- TS: tangent space
- TXS: texture space
- 向量,向量总是指向外侧(为光照做准备),大写字母表示已经归一化(如果不是会加前缀un),如下:
- V: View vector
- L: Light vector
- N: Normal vector
- H: Half vector
- 用input/output作为结构体的变量名。
- 不要使用“in”,只使用“out”和“inout”。声明“out”的参数要放在最后。也不要使用“inline”,没什么作用。
- 所有的uniform都要用cb传,原因是在computer shader中需要保证cb在各个kernels一致,如果是global namespace就会自动优化没有用到的uniform。
- 需要在C#和hlsl共享结构体的定义,由于hlsl会在float4上对齐,有些变量需要填充。也因此都用float4来避免这种问题,比如不要用SetGlobalFloatArray或者SetComputeFloatParams函数,传递float数组时先转换成float4数组,并在hlsl里做下列的操作转换回float数组。
uniform float4 packedArray[3];
static float unpackedArray[12] = (float[12])packedArray;
然后是一些跨平台的工作。
最后定义了一些常用函数,有一点类似原UnityCG的功能。
Wind
风相关的属性和函数。
FragInputs
申明了varying/interpolator的结构体。附带Debug代码。
ShaderPass.cs
定义每种Pass为0 - n,是自动生成的。
LitProperties
定义属性。
ShaderVariables
定义了HDRP的属性。附带一些相关函数。
Lighting
光照、阴影、采样、区域光及IBL