UnityShader基础效果-Surface Shader
Posted baolong-chen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UnityShader基础效果-Surface Shader相关的知识,希望对你有一定的参考价值。
Ox00 Surface Shader Syntax
常用的三种输出数据格式:
//Standard output structure of surface shaders is this:
struct SurfaceOutput
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版本以上, 支持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
;
//镜面高光输出
struct SurfaceOutputStandardSpecular
fixed3 Albedo; // diffuse color
fixed3 Specular; // specular color
fixed3 Normal; // tangent space normal, if written
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编码在CGPROGRAM...ENDCG块内,
- 必须在Subshader块内而不能在pass内部,Surface shader将自己编译成多个通道.
- 必须使用#pragma surface surfaceFunction lightModel [optionalparams] 指令来表明这是surface shader.
拆分#pragma surface surfaceFunction lightModel [optionalparams]
必要参数:
surfaceFunction | 格式void surf (Input IN, inout SurfaceOutput o),Input自定义结构常必须包含纹理坐标和其他自需变量 | ||||||
lightModel |
|
surfaceFunction 中Input参数纹理坐标必须带uv或uv2前缀
struct Input
????float2 uv_MainTex;
????floatX 其他变量;
其他变量 | 说明 |
float3 viewDir | 视图方向为了计算时差、边缘光照等效果,Input需要包含视图方向 |
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) |
可选参数:optionalparams
Transparency and alpha testing 使用alpha and alphatest指令 |
| |||||||||||||||||||||||||||
Custom modifier functions用于计算更改输入的顶点数据,或更改最终计算的片元色 |
| |||||||||||||||||||||||||||
Shadows and Tessellation 阴影和网格细分 |
| |||||||||||||||||||||||||||
Code generation options 调整生成着色器代码选项,使得shader更小加载更快 |
| |||||||||||||||||||||||||||
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<Name> (SurfaceOutput s, UnityGI gi);forward path,不依赖视图方向
half4 Lighting<Name> (SurfaceOutput s, half3 viewDir, UnityGI gi); forward path,依赖视图方向
half4 Lighting<Name>_Deferred (SurfaceOutput s, UnityGI gi, out half4 outDiffuseOcclusion, out half4 outSpecSmoothness, out half4 outNormal); deferred lighting paths
half4 Lighting<Name>_PrePass (SurfaceOutput s, half4 light); Use this in light prepass (legacy deferred) lighting paths. in light prepass (legacy deferred) lighting paths
half4 Lighting<Name>_GI (SurfaceOutput s, UnityGIInput data, inout UnityGI gi);自定义GI解析光照贴图和探针数据
自定义光照函数:
?
0x03 Example
以上是关于UnityShader基础效果-Surface Shader的主要内容,如果未能解决你的问题,请参考以下文章
着色器编程_unity中的基础纹理,使用Unity Shader实现基础纹理的渲染效果
着色器编程_unity中的基础纹理,使用Unity Shader实现基础纹理的渲染效果