shader实例(四)物体描边【自发光】

经过一段时间的慢慢学习,感觉着色器真的非常神奇。

上一篇的描边是通过获取模型的顶点信息,根据法线来扩大模型,然后关闭深度缓存来给原模型模拟一个描边的效果。

下面是通过模型的自发光再根据初中的数学知识实现我们想要的描边效果。

首先看示意图:


1。【思路】:面向摄像机的物体,它的表面法线【normal】和视角向量【viewDir】的【夹角】越靠近边缘就越大。那么就可以根据这个夹角进行处理,夹角越大,那么发射光越强,就可以实现我们想要的效果。

2。【选择shader】:在这里因为是处理表面的各个点,所以使用surface shader比较方便。

3。要使用的参数【点到摄像机的向量viewDir】,法线向量【normal】,

求点积dot【返回两个向量夹角的余弦值,归一,如果方向一样值1,方向相反值-1,垂直值为0,所以在摄像机看到的范围内,越靠近边缘,这个值越小,所以用dot的结果就可以作为衰减系数】

代码如下:

Shader "Custom/OutLine_2" {
 Properties {
  _MainTex ("Base (RGB)", 2D) = "white" {}
  _BumpMap ("Bumpmap", 2D) = "bump" {} 
  _RimColor("Rim Color", Color) = (0.26,0.19, 0.13, 0.0)
  _RimPower("Rim Power", Range(0.5, 8.0)) = 3.0
 }
 SubShader {
  Tags { "RenderType"="Opaque" }
  LOD 200
  
  CGPROGRAM
  #pragma surface surf Lambert
  
  sampler2D _MainTex;
  sampler2D _BumpMap; 
  float4 _RimColor;
  float _RimPower;

  struct Input {
   float2 uv_MainTex; 
   float2 uv_BumpMap; 
   float3 viewDir; 
  };

  void surf (Input IN, inout SurfaceOutput o) {
   half4 c = tex2D (_MainTex, IN.uv_MainTex);
   o.Albedo = c.rgb;
   o.Alpha = c.a;
   //获取法线值【UnpackNormal是unity自带的标准解压法线用的】
   o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap)); 
   // viewDir点到相机的向量归一 与 该点的法线 求点乘。得出余弦值【0-1】,如果两条线平行方向一样值1,相反-1,垂直0
   // 所以越靠近越靠近边缘,值越小,saturate相当于mathf.clamp(value,0,1)
   // 如果1-这个值,越靠近边缘,rim值越大,自发光就越强
           half rim = 1.0 - saturate(dot (normalize(IN.viewDir), o.Normal)); 
           // pow是求幂函数,所以rim越大,效果越明显
           o.Emission = _RimColor.rgb * pow (rim, _RimPower); 
  }
  ENDCG
 }
 FallBack "Diffuse"
}

你好!要在Shader Graph中实现物体描边效果,可以尝试以下步骤: 1. 创建一个新的Shader Graph。 2. 添加一个Unlit Master节点作为主节点。 3. 添加一个Sprite节点,并将其连接到Unlit Master节点的Albedo输入。 4. 在Shader Graph中创建一个新的Sub Graph。 5. 在Sub Graph中创建一个Custom Function节点,命名为"Outline"。 6. 将Custom Function节点连接到Sub Graph的输出节点。 7. 在Custom Function节点中,添加一个Input节点,命名为"Alpha",用于控制描边的强度。 8. 添加一个Sample Texture 2D节点,用于采样纹理。 9. 将Sample Texture 2D节点的输出连接到Custom Function节点的输出。 10. 添加一个Sample Gradient节点,用于采样渐变纹理。 11. 将Sample Gradient节点的输出连接到Custom Function节点的输出。 12. 在Custom Function节点中,使用Alpha输入和采样的纹理和渐变纹理来计算描边效果。 13. 返回到主Shader Graph,将Sub Graph节点连接到Unlit Master节点的Alpha输入。 14. 在主Shader Graph中创建一个Multiply节点,并将其连接到Sub Graph节点的输出。 15. 将Multiply节点的另一个输入连接到Unlit Master节点的Alpha输入。 16. 将Multiply节点的输出连接到Unlit Master节点的Alpha输入。 这样,你就可以在Shader Graph中实现物体描边效果。你可以根据需要调整描边的强度和样式,例如修改渐变纹理或自定义描边的计算方式。希望对你有帮助!如果有任何问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值