unity shader 着色器实例 代码+注释 【阴影分层换色】

阴影分层

将颜色按4个指定区域区分

Shader "Custom/testS"
{Properties{//定义主色以及三级阴影颜色_Color ("Color", Color) = (1,1,1,1)_ShadowColor1 ("Shadow Color1", Color) = (1,1,1,1)_ShadowColor2 ("Shadow Color2", Color) = (1,1,1,1)_ShadowColor3 ("Shadow Color3", Color) = (1,1,1,1)}SubShader{Tags { "RenderType"="Opaque"}LOD 200Pass{Cull BackCGPROGRAM#pragma vertex vert#pragma fragment frag#include "Lighting.cginc"#include "UnityCG.cginc"#include "AutoLight.cginc" #pragma target 3.0fixed4 _Color;fixed4 _ShadowColor1;fixed4 _ShadowColor2;fixed4 _ShadowColor3;struct a2v {//顶点位置,法线与贴图float4 vertex:POSITION;float3 normal:NORMAL;float2 texcoord:TEXCOORD0;};struct v2f{//传给片元数据float4 pos:SV_POSITION;float2 uv:TEXCOORD0;float3 normal:TEXCOORD3;float3 worldNormal:TEXCOORD1;float3 worldPos:TEXCOORD2;fixed4 color:COLOR;};v2f vert(a2v v){//创建v2f数据 ov2f o;                    //获取顶点的裁剪坐标o.pos = UnityObjectToClipPos(v.vertex);//将模型顶点坐标转换为裁剪坐标 //顶点法线 * 世界转模型法线  获取世界法线?//获取单位法线向量,并将向量在模型坐标转化为模型位置o.normal   = mul(v.normal,(float3x3)unity_WorldToObject);//获取世界法线向量o.worldNormal   = mul(v.normal,(float3x3)unity_ObjectToWorld);//获取世界顶点o.worldPos = mul(unity_ObjectToWorld,v.vertex).xyz;  o.color = _Color;     return o;                } bool InRange(float minv, float maxv, float value){if(value < maxv && value > minv)return true;return false;    }fixed4 frag(v2f i) : COLOR{//获取法线方向float3 normalDir = normalize(i.normal);//灯光方向float3 lightDir = normalize(_WorldSpaceLightPos0.xyz);//漫反射float3 diffuse = _LightColor0.rgb * max(dot(normalDir,lightDir),0) * _Color;//获取环境光float3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;//最终颜色float4 g = float4(diffuse + ambient , 1);//统一色彩float v1 = 1;float v2 = 1.5;float v3 = 2;
// g = floor(g * 5)/5; 梯度if(InRange(0.0,v1,g)){g = _ShadowColor1;}if(InRange(v1,v2,g)){g = _ShadowColor2;}if(InRange(v2,v3,g)){g = _ShadowColor3;}return g;             }  ENDCG} }FallBack "Diffuse"
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部