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

Standard lighting

使用SurfaceOutputStandard

StandardSpecular lighting

使用SurfaceOutputStandardSpecular

Lambert and BlinnPhong

不支持基于物理照明,低端设备用

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指令

 

alpha

alpha:auto

fade-transparency或premultiplied transparency

alpha:blend

混合

alpha:fade

淡出

alpha:premul

预乘(使半透明表面保留适当的镜面反射)

alphatest:VariableName

基于给定变量值执行cutout

keepalpha

始终在alpha channel写入1.0

decal:add

叠加在表面上,并执行叠加混合

decal:blend

Alpha混合

Custom modifier functions用于计算更改输入的顶点数据,或更改最终计算的片元色

vertex:VertexFunction

修改计算per-vertex data

finalcolor:ColorFunction

 

finalgbuffer:ColorFunction

在deferred path生效

finalprepass:ColorFunction

在forward path生效。base path

Shadows and Tessellation 阴影和网格细分

addshadow

 

fullforwardshadows

在forward path下,除了支持默认的一个方向光阴影,还可支持点光和聚光阴影

tessellate:TessFunction

//待详细补充

Code generation options

调整生成着色器代码选项,使得shader更小加载更快

 

exclude_path:deferred,

exclude_path:forward,

exclude_path:prepass

不给指定的渲染路径生成passes

noshadow

关闭接受所有阴影

noambient

不使用环境光和探头

novertexlights

在forward path下禁用探头和逐顶点光照

nolightmap

关闭所有光照贴图

nodynlightmap

禁用运行时动态GI

nodirlightmap

不支持方向光光照贴图

nofog

禁用所有内置fog

nometa

不生成meta pass(提取光照贴图和GI信息用)

noforwardadd

禁用forward path中additive pass,支持一个完整的方向光和所有逐顶点/SH计算的光

nolppv

不再支持Light Probe Proxy Volume组件

noshadowmask

禁用阴影遮罩

Miscellaneous options 各种其他选项

softvegetation

only be rendered Soft Vegetation

interpolateview

在顶点着色器中计算视图方向并进行插值;而不是在像素着色器中计算它。这可以使像素着色更快,但会消耗更多的纹理插值器。

halfasview

传递半角向量而不是视图向量到光照函数。半角向量将被逐顶点计算和标准化。这更快,但不完全正确。

approxview

被遗弃了。用interpolateview

dualforward

基本不用(官方内置shader没搜到)

dithercrossfade

使表面着色器支持抖动效果。然后,您可以将这个着色器应用到GameObjects中,这些GameObjects使用为交叉淡入过渡模式配置的LOD组组件。

 

表面着色器的工作原理

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

猜你喜欢

转载自www.cnblogs.com/baolong-chen/p/11621189.html