Ox00 Surface Shader Syntax
Three commonly used output data formats:
//Standard output structure of surface shaders is this:
struct SurfaceOutput
{
< p style="background: #e7e6e6"> fixed3 Albedo; // diffuse color
fixed3 Normal; // tangent space normal, if written
fixed3 Emission;
half Specular; // specular power in 0..1 range
fixed Gloss; // specular intensity
fixed Alpha; // alpha for transparencies
};
//Unity 5 and above, support physically based lighting models.
struct SurfaceOutputStandard
{
fixed3 Albedo; // base (diffuse or specular ) color
fixed3 Normal; // tangent space normal, if written
half3 Emission;
half Metallic; // 0=non-metal, 1=metal
half Smoothness; // 0=rough, 1=smooth
half Occlusion; // occlusion (default 1)
fixed Alpha; // alpha for transparencies
};
//specular highlight output< /span>
struct SurfaceOutputStandardSpecular
{ p>
fixed3 Albedo; // diffuse color
fixed3 Specular; // specular color
fixed3 Normal; // tangent space normal, if written
< span style="font-family:宋体; font-size:12pt"> half3 Emission;
half Smoothness; // 0=rough, 1=smooth
half Occlusion; // occlusion (default 1)
fixed Alpha; // alpha for transparencies
};
?
0x01 Surface Shader compile directives
Surface shader is coded in CGPROGRAM…ENDCG block,
- must be in the Subshader block but not in the pass, Surface shader compile itself into multiple Passage.
- You must use the #pragma surface surfaceFunction lightModel [optionalparams] command to indicate that this is a surface shader.
Split #pragma surface surfaceFunction lightModel [optionalparams]
Required parameters: p>
surfaceFunction |
format void surf (Input IN, inout SurfaceOutput o), Input custom structure often must include texture coordinates and other independent variables |
||||||
lightModel |
|
Input parameter texture coordinates in surfaceFunction must be prefixed with uv or uv2
struct Input
{ < /span>
????float2 uv_MainTex;
????floatX other variables;
}
Other variables |
Description |
float3 viewDir |
View direction In order to calculate time difference, edge lighting and other effects, Input needs to include the view direction span> |
float4 color |
The color value of each vertex |
float4 screenPos |
The screen space position, in order to obtain the reflection effect |
float3 worldPos |
world coordinate space |
float3 worldRefl |
world space reflection vector, surface shader cannot write o.Normal parameters |
float3 worldNormal |
world space normal vector, surface shader cannot write o.Normal parameter< /span> |
float3 worldRefl;INTERNAL_DATA < /td> | < p>The world coordinate reflection vector, the surface shader must write the o.Normal parameter. To obtain the reflection vector based on the pixel-by-pixel normal map, please use WorldReflectionVector(IN,o.Normal) |
float3 worldNormal;INTERNAL_DATA |
world coordinate normal vector, surface shader must Write the o.Normal parameter. To obtain the reflection vector based on the pixel-by-pixel normal map, please use WorldReflectionVector(IN,o.Normal) |
Optional parameters: optionalparams
Transparency and alpha testing Usealpha and alphatest command |
|
|||||||||||||||||||||||||||
Custom modifier functions are used to calculate and change the input vertex data, or change The final calculated fragment color |
|
|||||||||||||||||||||||||||
Shadows and Tessellation |
|
|||||||||||||||||||||||||||
Code generation options Adjust the generated shader Code options to make the shader smaller and faster to load |
|
|||||||||||||||||||||||||||
Miscellaneous options 各种其他选项 |
|
?
表面着色器的工作原理
0x02 Surface Shader Light Model
Lighting.cginc
UnityLambertLight |
基于非物理的漫反射 |
LightingLambert |
//..待补充 |
LightingLambert_Deferred |
//.. |
LightingLambert_PrePass |
//.. |
UnityBlinnPhongLight |
基于非物理的镜面高光 |
LightingBlinnPhong |
//.. |
LightingBlinnPhong_Deferred |
//.. |
LightingBlinnPhong_PrePass |
//.. |
LightingLambert_GI |
//.. |
LightingBlinnPhong_GI |
//.. |
?
half4 Lighting
half4 Lighting
half4 Lighting
half4 Lighting
half4 Lighting
自定义光照函数:
?
0x03 Example
surfaceFunction |
格式void surf (Input IN, inout SurfaceOutput o),Input自定义结构常必须包含纹理坐标和其他自需变量 |
||||||
lightModel |
|
Standard lighting
|
使用SurfaceOutputStandard
|
StandardSpecular lighting
|
使用SurfaceOutputStandardSpecular
|
Lambert and BlinnPhong
|
不支持基于物理照明,低端设备用 |
其他变量 |
说明 |
float3 viewDir |
视图方向为了计算时差、边缘光照等效果,Input需要包含视图方向< /p> |
float4 color |
每个顶点颜色值 |
float4 screenPos |
屏幕空间位置,为了获得反射效果 |
float3 worldPos |
世界坐标空间 |
float3 worldRefl |
世界空间反射向量,surface shader不能写入o.Normal参数 |
float3 worldNormal |
世界空间法向量,surface shader不能写入o.Normal参数 |
float3 worldRefl;INTERNAL_DATA |
世界坐标反射向量,surface shader必须写入o.Normal参数。基于逐像素法线贴图获得反射向量,请使用WorldReflectionVector(IN,o.Normal) |
float3 worldNormal;INTERNAL_DATA |
世界坐标法线向量,surface shader必须写入o.Normal参数。基于逐像素法线贴图获得反射向量,请使用WorldReflectionVector(IN,o.Normal) |
Transparency and alpha testing 使用alpha and alphatest指令 |
|
|||||||||||||||||||||||||||
Custom modifier functions用于计算更改输入的顶点数据,或更改最终计算的片元色 |
|
|||||||||||||||||||||||||||
Shadows and Tessellation 阴影和网格细分 |
|
|||||||||||||||||||||||||||
Code generation options 调整生成着色器代码选项,使得shader更小加载更快 |
|
|||||||||||||||||||||||||||
Miscellaneous options 各种其他选项 |
|
alpha |
alpha:auto |
exclude_path:deferred, |
exclude_path:forward, |
exclude_path:prepass |
UnityLambertLight |
基于非物理的漫反射 |
LightingLambert |
//..待补充 |
LightingLambert_Deferred |
//.. |
LightingLambert_PrePass |
//.. |
UnityBlinnPhongLight |
基于非物理的镜面高光 |
LightingBlinnPhong |
//.. |
LightingBlinnPhong_Deferred |
//.. |
LightingBlinnPhong_PrePass |
//.. |
LightingLambert_GI |
//.. |
LightingBlinnPhong_GI |
//.. |