卡通渲染代码注解

阅读: 评论:0

卡通渲染代码注解

卡通渲染代码注解

//渲染轮廓线(描边)
//五种方法: 
//1 基于观察角度和表面法线。即视角方向和表面法线点乘结果判断(接近0,表示面接近垂直与视角)。 
//2 过程式几何。两个Pass:第一个Pass渲染背面并且让轮廓可见(顶点外扩);第二个Pass正常渲染正面。适应于大多数表面平滑的模型,不适合立方体等平整模型。 
//3 基于图像处理。前面两种边缘检测就是了:直接用算子判断和使用深度和法线纹理。但如果一些深度和法线变化很小的无法检测出来,如桌子上一张纸。 
//4 基于轮廓边。检测方法:相邻两个三角是否一个面向视角,另一个背向视角,就是边。即 (n0·v > 0) ≠ (n1·v > 0)。 缺点是轮廓是逐帧单独提取的,帧与帧之间会出现跳跃性。 
//5 混合上述方法。首先找到轮廓线(方法4),把模型和轮廓边渲染到纹理中,再使用图像处理识别轮廓线(方法3),在图像空间进行风格化渲染。
Shader"ShaderBook/14/CarToon"{Properties {_Color ("Color Tint", Color) = (1, 1, 1, 1)_MainTex ("Main Tex", 2D) = "white" {}_Ramp ("Ramp Texture", 2D) = "white" {}_Outline ("Outline", Range(0, 1)) = 0.1_OutlineColor ("Outline Color", Color) = (0, 0, 0, 1)_Specular ("Specular", Color) = (1, 1, 1, 1)_SpecularScale ("Specular Scale", Range(0, 0.1)) = 0.01_Gloss("Gloss",Range(0,40)) = 0.1_ThreShold("_ThreShold",Range(0.8,1)) = 0.8}SubShader{Tags{"RenderType"="Opaque" "Queue"="Geometry"}//第一个pass画背面pass{//默认转化为大写Name "OUTLINE"Cull FrontCGPROGRAM#pragma vertex   vert#pragma fragment frag#include &#inc"float    _Outline;float4    _OutlineColor;struct v2f{float4 pos: SV_POSITION;};v2f vert(appdata_base v){v2f o;// 顶点和法线变换到视图空间下,让描边可以在观察空间达到最好的效果float4 pos = float4(UnityObjectToViewPos(),1.0f);//变换到试图空间,并处理模型缩放导致的法线不同float3 normal = mul((float3x3)UNITY_MATRIX_IT_MV, v.normal);// 视图空间下,背面扁平化,//没有法线贴图时,默认的bump就是(0.5,0.5,0.5,0.5)normal.z = -0.5;normal = normalize(normal);pos = pos + float4(normal, 0) * _Outline;//转化到裁剪空间o.pos = mul(UNITY_MATRIX_P,pos);return o;}float4 frag(v2f i) :SV_Target {return float4(_b,1);}ENDCG}//第二个pass画前面pass {Tags { "LightMode"="ForwardBase" }Cull BackCGPROGRAM#pragma vertex vert#pragma fragment frag#pragma multi_compile_fwdbase#include &#inc"#include &#inc"//include shadow #include &#inc"//include variable#include &#inc"fixed4      _Color;sampler2D   _MainTex;float4      _MainTex_ST;sampler2D   _Ramp;fixed4      _Specular;fixed       _SpecularScale;float       _Gloss;float       _ThreShold;struct v2f{float4 pos :POSITION;float2 uv  :TEXCOORD0;float3 worldNormal:TEXCOORD1;float3 worldPos:TEXCOORD2;SHADOW_COORDS(3)};v2f vert(appdata_tan v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.uv  = TRANSFORM_rd,_MainTex);o.worldNormal = al);o.worldPos = mul(unity_ObjectToWorld,v.vertex).xyz;TRANSFER_SHADOW(o);return o;}float4 frag(v2f i) : SV_TARGET{fixed3 worldNormal = normalize(i.worldNormal);fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));fixed3 worldViewDir = normalize(UnityWorldSpaceViewDir(i.worldPos));fixed3 worldHalfDir = normalize(worldLightDir + worldViewDir);fixed4 c = tex2D (_MainTex, i.uv);fixed3 albedo = c.rgb * _b;fixed3 ambient = UNITY_ * albedo;//计算光照衰减UNITY_LIGHT_ATTENUATION(atten, i, i.worldPos);fixed halfLambert  = 0.5 * dot(worldNormal, worldLightDir) + 0.5;halfLambert = halfLambert * atten;fixed3 diffuse = _b * albedo * tex2D(_Ramp,float2(halfLambert,halfLambert)).rgb;fixed blinnSpec = dot(worldNormal, worldHalfDir);//blinnSpec =  step(_ThreShold,blinnSpec);//fixed3 specular =  _b * _b * pow(saturate(blinnSpec), _Gloss);//fwdith抗锯齿处理fixed  w = fwidth(blinnSpec) * 2.0;                                                          //为了让_SpecularScale为0时,完全消除高光fixed3 specular = _b * lerp(0, 1, smoothstep(-w, w, blinnSpec + _SpecularScale - 1)) * step(0.0001, _SpecularScale);return fixed4(ambient + diffuse + specular, 1.0);}ENDCG}}//绘制阴影Fallback "Diffuse"
}

本文发布于:2024-01-29 08:46:23,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170648918614092.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