在很多游戏中,都会让出现模型边缘发光的效果,本文就用表面着色器实现一个简单的边缘发光的效果 。
首先我们需要一个最简单的漫反射表面着色器:
Shader "Custom/TestUV" {Properties {_MainTex ("Albedo (RGB)", 2D) = "white" {}}SubShader {Tags { "RenderType"="Opaque"}LOD 200CGPROGRAM#pragma surface surf Lambertsampler2D _MainTex;struct Input {float2 uv_MainTex;};void surf (Input IN, inout SurfaceOutput o) {fixed4 c = tex2D (_MainTex, IN.uv_MainTex);o.Albedo = c.rgb;o.Alpha = c.a;}ENDCG}FallBack "Diffuse"}
里增加:
_RimColor("Rim Color", Color) = (1,1,1,1)_RimPower("Rim Power", Range(0.5,8.0)) = 3.0
里增加:
float4 _RimColor;float _RimPower;
一个是边缘发光的颜色,一个是幂 。
Input结构里添加视图向量:
float3 viewDir;
修改surf方法:
void surf (Input IN, inout SurfaceOutput o) {fixed4 c = tex2D (_MainTex, IN.uv_MainTex);o.Albedo = c.rgb;o.Alpha = c.a;half rim = 1.0 - abs(dot (normalize(IN.viewDir), o.Normal));o.Emission = _RimColor.rgb * pow(rim, _RimPower);}
重点是第四行,首先计算视图向量与法线向量的点积 。我们知道点积值在[-1,1]之间,1表示法线与视图同向平行,0表示法线与视图垂直,-1表示法线与视图同向平行 。当法线与视图垂直的时候也就意味着像素点平行于视图向量,也就是边缘位置 。所以我们取点积的绝对值并用反转,获得rim 。rim越大越靠近边缘 。
然后根据rim值为像素添加自发光即可 。
效果:
文章插图
【十三Shader山下边缘发光】
文章插图
- 二十八 Shader山下 切空间
- 四 Shader山下法线贴图
- 八 Shader山下片段着色器
- 解密明成祖迁都北京后唯一没葬入十三陵的皇帝
- 二十七 Shader山下平面阴影
- 秦始皇死后三十三个子女竟都遭到了灭顶之灾
- 朱元璋死后,十三个城门抬棺材,到底为了什么
- 河南省产粮大县的“十三金刚”中,都有哪些县上榜,谁是第一名? 历史河南之最
- 西安作为十三朝古都,为什么唐朝之后就再也没成为过首都了?
- 朱元璋下葬十三个城门同时出棺材的历史传说