描边shader的实现有很多种,顶点外扩是其中之一。顶点外扩的原理是用2个Pass 渲染物体2次

第一遍:描边,顶点沿法线方向外拓后用黑色渲染。外扩这一步的实现是在投影空间,也就是2D的,根绝法线的x和y值进行外扩,因为是沿着法线方向外扩,所以法线越和摄像机方向相同,也就是越接近面向摄像机的顶点,顶点的位置变化的越小,当法线和摄像机方向相同时,不会有任何变化。

第一遍渲染后,实际的图像如下:

第二遍:正常渲染物体,与第一遍渲染的混合在一起

优点:
(1)效果最好。
(2)适用范围广。
缺点:
(1)对效率有一定影响。因为有2个Pass,所以DrawCall为正常的2倍

(2)对于法线过度不均匀的模型,比如立方体,轮廓会有缝隙。

上边的立方体例子我是特意把描边的外扩值调到很大,便于理解。由第一遍渲染后的图和第二遍渲染后的图的对比,很容易理解这个方法的原理。其实就是通过法线来把边缘进行位移,如果不是边缘,则不位移,比如立方体的正面。在第二次渲染后,会覆盖同位置的像素,因为边缘已经外扩,像素的位置已经不是原来的位置,因此不会被覆盖,而像位于立方体正面的像素,则会被第二次渲染时覆盖,最后就混合成了带黑边的效果图。

Shader "Study/3_OutLine"
{Properties{_MainTex("Texture", 2D) = "white"{}_LineSize("OutlineSize", range(0, 0.1)) = 0.02_LineColor("LineColor", Color) = (0,0,0,1)}SubShader{Pass{Tags{ "LightMode" = "Always" }// 先绘制这个纯色的顶点,然后在下一个pass绘制对象//这里不存在前后面,关闭裁剪前后面,也不需要深度缓存Cull Off // 关闭剔除,模型前后都会显示ZWrite Off // 系统默认是开的,要关闭。关闭深度缓存,后渲染的物体会根据ZTest的结果将自己渲染输出写入ZTest Always  // 深度测试[一直显示],被其他物体挡住后,此pass绘制的颜色会显示出来CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"float _LineSize;float4 _LineColor;struct v2f{float4 pos:SV_POSITION;float4 color : COLOR;};v2f vert(appdata_full v){v2f o;// 获取模型的最终的投影坐标o.pos = mul(UNITY_MATRIX_MVP, v.vertex);// UNITY_MATRIX_IT_MV为【模型坐标-世界坐标-摄像机坐标】【专门针对法线的变换】// 法线乘以MV,将模型空间 转换 视图空间float3 norm = mul((float3x3)UNITY_MATRIX_IT_MV, v.normal);// 转换 视图空间 到 投影空间 【3D转2D】float2 offset = TransformViewToProjection(norm.xy);// 得到的offset,模型被挤的非常大,然后乘以倍率o.pos.xy += offset * _LineSize;o.color = _LineColor;return o;}float4 frag(v2f i) : COLOR{return i.color;}ENDCG}Pass{// 直接使用顶点和片段shader显示物体CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"sampler2D _MainTex;float4 _MainTex_ST;struct v2f {float4 pos:SV_POSITION;float2 uv : TEXCOORD0;// 纹理,相对自身的坐标轴,float2是一个平面};v2f vert(appdata_full v){v2f o;o.pos = mul(UNITY_MATRIX_MVP, v.vertex);o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);return o;}float4 frag(v2f i) : COLOR{float4 texCol = tex2D(_MainTex, i.uv);return texCol;}ENDCG}}
}

附上工程连接:http://download.csdn.net/detail/yinfourever/9565336

3.顶点外扩方法实现的描边shader相关推荐

  1. Unity Shader 卡通渲染 (五):仿日式赛璐珞风格 Shader(顶点外扩描边)

    上一篇传送门: https://blog.csdn.net/qq_27534999/article/details/101080649 一.赛璐璐风格简介 有些人可能会问,什么是赛璐珞风格? 赛璐珞是 ...

  2. 图形/多段线内缩外扩思路

    图形/多段线内缩外扩思路 前言 我在网上找了很多关于多边形内缩外扩的资料,也测试了一些算法库,如Clipper,boost::geometry::buffer,其实都可以得到不错的结果. Clippe ...

  3. 非自交多边形的轮廓内缩外扩算法

    文章目录 1. 项目介绍 2. 算法步骤 2.1 内缩点的生成 2.2 无效内缩线段的处理 2.3 全局无效环的处理 3. 使用方法及结果演示 3.1 使用方法 3.2 结果演示 4. 不足之处 5. ...

  4. uniapp 分享缩略图过大怎么办_女性胸外扩怎么办|3步带你完成改变

    无论是大胸还是小波,大多数女性都会有胸部外扩的现象,不同的年龄层次的女生中间也会出现这样的现象. 其实胸外扩现象的出现是由多种原因导致的,比如:睡眠姿势不正确.乳房发育异常,穿戴不适合的胸罩.哺乳等这 ...

  5. java连接stk外部接口_SLWSTK无线开发工具上的外扩串口如何使用(虚拟串口/VCOM)...

    标题:   SLWSTK无线开发工具上的外扩串口如何使用(虚拟串口/VCOM) 关键词:ZigBee, 串口,VCOM,虚拟串口,外扩串口,EFR32, PCB4001,  EFR32MG13P732 ...

  6. STM32H743开发板移植micropython并外扩32M的SQPI flash和32M的SDRAM

    文章目录 一.搭建编译环境 二.修改源码 1.复制源码 2.修改源码 2.1修改mpconfigboard.h文件 2.2修改stm32h7xx_hal_conf.h文件 2.3修改pins.csv文 ...

  7. AVR单片机Atmega128外扩RAM

      由于AVR系列单片机采用的是内部外部RAM统一编址,ATmega128工作在非ATmega 103模式时具有4k+256B的包括寄存器文件(通用工作寄存器).I/O寄存器.扩展I/O寄存器和内部S ...

  8. DSP实现外扩SRAM

    问题描述:DSP在物理上将程序空间和数据空间整合成4M*16位的空间,但是在其上实现FFT算法时,运算数据量太大,内部RAM不够,这时需要通过外扩SRAM的方法来实现. 注意: 在nonBIOS情况下 ...

  9. 多边形或轮廓等距离外扩或收缩

    参考:多边形或轮廓等距离外扩或收缩_hjk61314的博客-CSDN博客_多边形外扩 1. 需求 已知:给定一个简单多边形,多边形按照顺时针或者逆时针的数组排列, 求:内部等距离缩小或者外部放大的多边 ...

最新文章

  1. Codeforces 864 A Fair Game 水题
  2. UNIX再学习 -- 可重入函数和 SIGCHLD 语义
  3. leetcode 509. 斐波那契数(dfs)
  4. 吴恩达机器学习(十)支持向量机(SVM)
  5. android 点击通知栏打开activity,Android实现点击通知栏后,先启动应用再打开目标Activity...
  6. 自由职业者的八大挑战
  7. Supervisor的安装与使用
  8. OpenGL编程指南 示例笔记(2)--独立地移动光源
  9. 自考《离散数学》题型总结
  10. 06MyBatis Plus
  11. python 捕捉键盘操作
  12. 计算机端口号65536,65536端口能不能用
  13. java不死神兔总数_Java基础知识强化之IO流笔记13:递归之不死神兔问题(斐波那契数列)...
  14. 如何实现跨行跨地区转账实时到帐而且免手续费?
  15. 别让你20多岁的活法,毁掉你30岁后的人生
  16. P4编程环境安装(ubuntu16.04,p4c+bmv2+mininet+PI+tutorial)
  17. 记u盘内文件变为.lnk处理方法
  18. 2018-9-3-vue的tabs表单代码的思考
  19. 免费文档翻译软件电脑版软件
  20. chromium编译与支持H264编码支持

热门文章

  1. 内部收益率irr_国寿鑫耀东方年金险,内部收益率IRR测算
  2. struts2和hibernate的简单新闻发布系统_企业做不好新闻软文营销,原因都在这里!...
  3. java resp req_java request和response区别
  4. 计算机操作系统课后题答案第三章,计算机操作系统教程习题与实验指导(第3版)...
  5. leetcode 滴滴_一个菜逼程序媛的求职历程(秋招已拿阿里、网易、滴滴等校招offer)...
  6. python plotly 弹出子图_python – 在plotly中添加组条形图作为子图
  7. python探测端口_python检测远程服务器tcp端口的方法
  8. 【图像超分辨率】RS Image SR Based on Visual Saliency Analysis
  9. Linux桌面自动挂载,ubuntu分区自动挂载
  10. oracle中变量前加冒号_ORACLE 变量的定义和使用