UnityShader基础案例(一)物体积雪效果

阅读: 评论:0

UnityShader基础案例(一)物体积雪效果

UnityShader基础案例(一)物体积雪效果

        实现原理没什么好说的,和世界向上方向的向量做一次点积,超过一定值就打上白色。基于基础系列中的法线纹理,并做了一些小改动。

Shader "Custom/Rock"
{Properties{_Color("Color",Color)=(1,1,1,1)_MainTex("基础纹理",2D)="white"{}_NormalTex("法线纹理",2D)="bump"{}_BumpScale("凹凸缩放",float)=1.0_SnowLevel("积雪程度",float)=1.0_SnowColor("积雪颜色",Color)=(1,1,1,1)_SnowDir("积雪方向",Vector)=(0,1,0)}SubShader{Pass{Tags{"LightMode"="ForwardBase"}CGPROGRAM#pragma vertex vert#pragma fragment frag#include &#inc"#include &#inc"fixed4 _Color;sampler2D _MainTex;float4 _MainTex_ST;sampler2D _NormalTex;float4 _NormalTex_ST;half _BumpScale;fixed _SnowLevel;fixed4 _SnowColor;half4 _SnowDir;struct a2v{float4 vertex:POSITION;float3 normal:NORMAL;float4 tangent:TANGENT;float4 texcoord:TEXCOORD0;};struct v2f{float4 vertex:SV_POSITION;                                                                                  //我们需要将切线空间到世界空间的变换矩阵传递到片元着色器//由于片元着色器最大只支持float4大小的插值寄存器,因此我们将矩阵分成3行4列//最后一列用于存储世界坐标,实际计算并不会参与float4 matrix_TangentToObject0:TEXCOORD0;float4 matrix_TangentToObject1:TEXCOORD1;float4 matrix_TangentToObject2:TEXCOORD2;float4 uv:TEXCOORD3;};v2f vert(a2v v){v2f o;o.vertex=UnityObjectToClipPos(v.vertex);float3 worldPos=UnityObjectToWorldDir(v.vertex);float3 worldNormal=al);float3 worldTangent=UnityObjectToWorldDir(v.tangent);//副切线由法线和切线的叉积得到,w用于表示副切线的方向float3 worldBinormal=cross(worldNormal,worldTangent)*v.tangent.w;//根据线性代数的知识,我们知道从切线空间到世界空间的变换矩阵由切线空间的三个坐标轴按列构成//这三个坐标轴必须是在世界坐标下的表示o.matrix_TangentToObject0=float4(worldTangent.x,worldBinormal.x,worldNormal.x,worldPos.x);o.matrix_TangentToObject1=float4(worldTangent.y,worldBinormal.y,worldNormal.y,worldPos.y);o.matrix_TangentToObject2=float4(worldTangent.z,worldBinormal.z,worldNormal.z,worldPos.z);//o.tangentLightDir=mul(rotation,ObjSpaceLightDir(v.vertex));//o.tangentViewDir=mul(rotation,ObjSpaceViewDir(v.vertex));=TRANSFORM_rd,_MainTex);o.uv.zw=TRANSFORM_rd,_NormalTex);return o;}fixed4 frag(v2f i):SV_Target{half4 rawNormal=tex2D(_NormalTex,i.uv.zw);//用于光照法线half3 tangentNormal=UnpackNormal(rawNormal);//用于积雪法线half3 tangentNormal1=*=_BumpScale;tangentNormal.z=sqrt(1.0-saturate(,)));*=_SnowLevel;tangentNormal1.z=sqrt(1.0-saturate(,)));half3 worldNormal=normalize(half3(dot(i.,tangentNormal),dot(i.,tangentNormal),dot(i.,tangentNormal)));half3 worldNormal1=normalize(half3(dot(i.,tangentNormal1),dot(i.,tangentNormal1),dot(i.,tangentNormal1)));                             //纹理采样fixed3 texResult=tex2D(_MainTex,)*_Color;fixed3 ambient=UNITY_b;fixed3 diffuse=_LightColor0*texResult*saturate(dot(normalize(_WorldSpaceLightPos0),worldNormal));fixed3 color=diffuse+ambient;//离下雪方向越大,积雪效果约淡half difference=dot(worldNormal1 , _);//-_SnowArea;difference=saturate(difference);color=difference*_b+(1-difference)*color;    //difference=saturate(difference);//边缘颜色渐变return fixed4(color,1.0);}ENDCG}}
}

效果仅供参考,实现方式有多种,效果也各不相同

                                                 模型原样,素材是网上随便找的:

看有博客说的是全局积雪什么的,用深度纹理什么的,看不懂,感觉Shader也是一个大坑。。。

本文发布于:2024-03-09 05:37:54,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/1710187325134761.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:积雪   物体   案例   效果   基础
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23