7.13 SurfaceShader

凹凸

//法线

Shader"Custom/MyCustomSufaceShader2"{

Properties{

_MainTex("主纹理",2D)="white"{}

_NormalMap("法线纹理",2D)="white"{}

}

SubShader{

Tags{"RenderType"="Opaque"}

LOD200

CGPROGRAM

//PhysicallybasedStandardlightingmodel,andenableshadowsonalllighttypes

#pragmasurfacesurfStandardfullforwardshadows

//Useshadermodel3.0target,togetnicerlookinglighting

#pragmatarget3.0

sampler2D_MainTex;

sampler2D_NormalMap;

structInput {

float2uv_MainTex;

float2uv_NormalMap;

};

voidsurf (Input IN,inoutSurfaceOutputStandard o) {

o.Albedo=tex2D(_MainTex,IN.uv_MainTex).rgb;

float4uv_n=tex2D(_NormalMap , IN.uv_NormalMap);

o.Normal=UnpackNormal(uv_n);

}

ENDCG

}

FallBack"Diffuse"

}

透明

Shader"Custom/MyCustomSufaceShader"{

Properties{

_Alpha("Alpha",Range(0,1))=1

}

SubShader{

Tags{"RenderType"="Transparent"}

LOD200

CGPROGRAM

//PhysicallybasedStandardlightingmodel,andenableshadowsonalllighttypes

#pragmasurfacesurfStandardfullforwardshadowsalpha

//Useshadermodel3.0target,togetnicerlookinglighting

#pragmatarget3.0

structInput{

float4_clolor:COLOR;

};

half_Alpha;

voidsurf(Input _in,inoutSurfaceOutputStandard  o){

o.Albedo=(0.5,0.5,0.5);

o.Alpha=_Alpha;

}

ENDCG

}

FallBack"Diffuse"

}

边缘发光

//RimShader

Shader"Custom/MyCustomSufaceShader3"{

Properties{

_MainTex("主纹理",2D)="white"{}

_NormalMap("法线纹理",2D)="white"{}

_RimColor("边缘光的颜色",Color)=(1,1,1,1)//白色

_RimPower("边缘光的强度",float)=1

}

SubShader{

Tags{"RenderType"="Opaque"}

LOD200

CGPROGRAM

//PhysicallybasedStandardlightingmodel,andenableshadowsonalllighttypes

#pragmasurfacesurfStandardfullforwardshadows

//Useshadermodel3.0target,togetnicerlookinglighting

#pragmatarget3.0

sampler2D_MainTex;

sampler2D_NormalMap;

fixed4_RimColor;

half_RimPower;

structInput {

float2uv_MainTex;

float2uv_NormalMap;

fixed3viewDir;

};

voidsurf (Input IN,inoutSurfaceOutputStandard o) {

o.Albedo=tex2D(_MainTex,IN.uv_MainTex).rgb;

float4uv_n=tex2D(_NormalMap , IN.uv_NormalMap);

o.Normal=UnpackNormal(uv_n);

float3dotV=dot(normalize(IN.viewDir),o.Normal);

floattemp=saturate(dotV);

floatrim=1-temp;

o.Emission=_RimColor*pow(rim,_RimPower);

}

ENDCG

}

FallBack"Diffuse"

}

* "Queue"标签。定义渲染顺序。预制的值为

* "Background"。值为1000。比如用于天空盒。

* "Geometry"。值为2000。大部分物体在这个队列。不透明的物体也在这里。这个队列内部的物体的渲染顺序会有进一步的优化(应该是从近到远,early-z test可以剔除不需经过FS处理的片元)。其他队列的物体都是按空间位置的从远到近进行渲染。

* "AlphaTest"。值为2450。已进行AlphaTest的物体在这个队列。

* "Transparent"。值为3000。透明物体。

* "Overlay"。值为4000。比如镜头光晕。

* 用户可以定义任意值,比如"Queue"="Geometry+10”

* "RenderType"标签。Unity可以运行时替换符合特定RenderType的所有Shader。Camera.RenderWithShader或Camera.SetReplacementShader配合使用。Unity内置的RenderType包括:

* "Opaque":绝大部分不透明的物体都使用这个;

* "Transparent":绝大部分透明的物体、包括粒子特效都使用这个;

* "Background":天空盒都使用这个;

* "Overlay":GUI、镜头光晕都使用这个;

* 用户也可以定义任意自己的RenderType这个标签所取的值。

* 应注意,Camera.RenderWithShader或Camera.SetReplacementShader不要求标签只能是RenderType,RenderType只是Unity内部用于Replace的一个标签而已,你也可以自定义自己全新的标签用于Replace。

比如,你为自己的ShaderA.SubShaderA1(会被Unity选取到的SubShader,常为Shader文件中的第一个SubShader)增加Tag为"Distort"="On",然后将"Distort"作为参数replacementTag传给函数。此时,作为replacementShader实参的ShaderB.SubShaderB1中若有也有一模一样的"Distort"="On",则此SubShaderB1将代替SubShaderA1用于本次渲染。

* 具体可参考Rendering with Replaced Shaders


float3 viewDir 包含了视角的观察方向,主要用于计算视差效应(Parallax effects ),边缘光照,等等。

float4 COLOR 包含了经过内插值(interpolated )的每个顶点的颜色值。

float4 screenPos 包含了用于反射效果的屏幕坐标系的位置信息。例如,在Unity专业版的WetStreet shader中使用了它。

float3 worldPos 包含了世界坐标系中的位置。

float3 worldRefl 包含了世界坐标系中的反射向量,如果Surface Shader没有重写o.Normal。参考Reflect-Diffuse shader。

float3 worldNormal 包含了世界坐标系中的法线向量,如果Surface Shader没有重写o.Normal。

float3 worldRefl;

INTERNAL_DATA 包含了世界坐标系的反射向量,如果Surface Shader重写了o.Normal。为了得到基于逐像素的法线贴图的反射向量,请使用WorldReflectionVector (IN,o.Normal) 。参考Reflect-Bumped shader。

float3 worldNormal;

INTERNAL_DATA 包含了世界坐标系的发现向量,如果Surface Shader重写了o.Normal。为了得到基于逐像素的法线贴图的法线向量,请使用WorldNormalVector (IN,o.Normal) 。参考Reflect-Bumped shader。

你可能感兴趣的:(7.13 SurfaceShader)