UnityShader base effect -Surface Shader

Ox00 Surface Shader Syntax

Three common output data format:

//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 or later, support for 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 light output

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 encoded within the block,

  • Must not block the Subshader inside pass, Surface shader themselves compiled into a plurality of channels .
  • Must #pragma surface surfaceFunction lightModel [optionalparams] command to indicate that this is a surface shader.

Split #pragma surface surfaceFunction lightModel [optionalparams]

Necessary parameters:

surfaceFunction

Format void surf (Input IN, inout SurfaceOutput o), Input structures must often contain custom texture coordinates and other variables required from

lightModel

Standard lighting

使用SurfaceOutputStandard

StandardSpecular lighting

使用SurfaceOutputStandardSpecular

Lambert and BlinnPhong

It does not support the physical lighting, low-end equipment

Input parameters surfaceFunction the texture coordinates must be prefixed with uv or uv2

struct Input

{

    float2 uv_MainTex;

    floatX other variables;

}

Other variables

Explanation

float3 viewDir

To calculate the direction of view of the time difference, the edge lighting and other effects, Input need to include view direction

float4 color

Each vertex color values

float4 screenPos

Screen space positions, in order to obtain the reflection effect

float3 worldPos

World space

float3 worldRefl

World Space reflection vector, surface shader parameters can not be written 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

Guess you like

Origin www.cnblogs.com/baolong-chen/p/11621189.html