UnityShader之OutLine
2017-06-19 16:17
225 查看
算法很简单,主要需要不同观察角度看上去线的宽度一样,需要转换到观察空间进行操作,空间变换请看我上一篇博客。
需要两个pass,一个画线,一个填充
效果:
需要两个pass,一个画线,一个填充
Shader "Custom/Outline" { Properties { _OutlineVal("Outline value", Range(0., 2.)) = 1. //描线的宽度 _OutlineCol("Outline color", color) = (1., 1., 1., 1.) } SubShader { Tags{ "Queue" = "Geometry" "RenderType" = "Opaque" } Pass { Cull Front CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct v2f { float4 pos : SV_POSITION; }; float _OutlineVal; v2f vert(appdata_base v) { v2f o; o.pos = mul(UNITY_MATRIX_MV, v.vertex); //注意这里只换算到观察空间,还没有到裁剪空间 float3 normal = mul((float3x3) UNITY_MATRIX_IT_MV, v.normal); //上一篇博客说过,法线的变换需要用到UNITY_MATRIX_IT_MV o.pos.xy += _OutlineVal*normal.xy; //观察空间里xy方向始终和最终屏幕方向相同,这保证了描线始终面向我们,边缘朝外偏移一点点 o.pos = mul(UNITY_MATRIX_P, o.pos); //最终需要把坐标从观察空间变换到裁剪空间 return o; } fixed4 _OutlineCol; fixed4 frag(v2f i) : SV_Target{ return _OutlineCol; } ENDCG } Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" float4 vert(appdata_base v) : SV_POSITION { return mul(UNITY_MATRIX_MVP, v.vertex); } fixed4 frag(float4 i : VPOS) : SV_Target { return fixed4(1,1,0,1); } ENDCG } } }
效果:
相关文章推荐
- [Unity插件][Shader资源]Outline2D3D物体描边插件2D图片模糊灰度变色水滴特效插件
- unity shader Offset Factor, Units详解
- 用unity surface shader 重新渲染dota2 模型
- [UnityShader3]彩光效果
- Unity Optimizing Shader Load Time
- Unity Shader入门精要笔记(九):Unity 的基础光照——漫反射的实现
- UnityShader初级篇——透明度混合
- Unity跑酷扭曲shader
- Unity 全局雾效Shader:基于摄像机距离的雾效渲染
- [置顶] 神临的Unity shader 学习之法线贴图(三)
- Unity Shader入门精要学习笔记 - 第6章 开始 Unity 中的基础光照
- Unity-Shader之法线贴图使用注意事项
- Unity ShaderLab 学习笔记(一)
- {Unity} Shader初步
- 【Unity&2.5D&Shader】2.5D阴影资料总览
- Unity中的CG编写Shader系列(Blend)
- unity, imageEffect的最后一步blit所用的shader,应该关闭zwrite和ztest
- 【Unity Shader】手游中高光效果的几种实现方法
- Unity3D for VR 学习(9): Unity Shader 光照模型 (illumination model)