Unity3D 卡通描边之控制线条粗细

一、前言

之前我发表过一篇Unity3D 卡通渲染 基于退化四边形的实时描边,最重要的实时描边已经实现了,本文接下来要完善一下它。

在之前的实时描边中,使用了几何着色器中的LineStream来进行绘制线条的,这样绘制线条是无法脱离底层特性来在所有平台上通用式地控制线条的粗细,这就需要我们再做文章。

二、原理

关于图形学中如何控制线条粗细这个问题,其实早就有人做了研究,文章在这

借用该文章的一张图

原理看图就一目了然,在裁剪空间中,e0和e1是线条的2个顶点,之后依次计算出二维向量ext和n,在通过这2个向量计算出4个点,再用这4个点绘制出2个三角形即可拼出这个四边形。

本文在此基础上做了一点调整,如下图所示。

简单来说就是以线的2点为中线,来绘制四边形,而不是作为四边形的一条边,因为2个点的位置顺序在本文中的几何着色器中获取到的是无序的,可能是e1误被当初e0,也可能e0被误当成e1,如果要让它们变得有序那会变得复杂,而以此为中线绘制四边形,那么就会变得很简单。接下来只要计算出四边形的4个点,再由几何着色器分裂出2个三角形,即可得到此四边形。

n和ext在unity3D的Shader中是这样计算的:

float PctExtend = 0.01;
float2 ext = PctExtend * (e1.xy - e0.xy);
float2 v = normalize(float3(e1.xy - e0.xy, 0)).xy;
float2 n = float2(-v.y, v.x) * 线条宽度;

从上述代码可以看出,宽度是在n的计算中控制的,我们可以把这个参数提取出来,让使用者随意调整。

三、编码

以前的代码写得比较乱,为了方便就不再整理了,编码略复杂,请自行整理。

这里附上源码

四、运行

效果还不错,性能做不评价,unity3d貌似内部做了优化,帧数不知为啥时高时低。

Enjoy It,本文到此结束,谢谢!

原文地址:https://www.cnblogs.com/lht666/p/12013323.html

时间: 2024-10-18 14:51:32

Unity3D 卡通描边之控制线条粗细的相关文章

echarts设置线条粗细

series: [ { name:"buy", type:'line', data:[], itemStyle: { normal: { color: '#6cb041', lineStyle:{ width:3//设置线条粗细 } } } } ] 可查看资料:http://echarts.baidu.com/echarts2/doc/example/themeDesigner.html

绘制线条粗细 以及 绘制变化的坐标

  <!DOCTYPE html>   <html>   <head lang="en">   <meta charset="UTF-8">   <title></title>   </head>   <body>   <canvas id="mycas" width="400" height="400"&

Unity3D第三人称摄像机控制脚本

好久没有敲Blog该.感谢您的留言.注意.私人信件和其他支持,但我似乎没有办法继续自己曾经写了一篇博客系列,因为我在网上找到有关unity3D太少的内容,U3D相关的文章!.. 第三人称视角 第三人称视角是什么?非常easy,CS就是一种第一人称视角游戏,玩家没有办法看到自己的角色形象,仅仅能观察除开自己之外的游戏内容.第三人称视角那么就明显是可以看到玩家所控制的角色的一种视角. 并且大部分游戏的镜头不能固定不动,肯定是要尾随猪脚.能看到猪脚,可是保持一定的高度和距离,这种视角才是最好的. U3

unity3d小小白之代码控制物体通过键盘输入移动

我通过键盘wsad来控制物体运动,代码如下: 这里说明一下我的代码. 这里面的back,forward,right,left 都是以你要控制移动的物体的自身坐标移动的. 我的代码是左右移动是在Z轴上,上下移动是X轴上,按理来讲,按下a,物体应该是Vector.left 而不是Vector.right.这是因为我在放物体的时候将物体绕Y轴旋转了180° ,如果我还按照按下a对应left,那么我按下a会向右走.因此我就调成按下a向右走了. 至于判断条件里的数字,是这样得到的:把你要移动的物体移到Ga

Unity3D 使用脚本来控制 UI 的 Image 显示的图片。

记录一下这个问题. 原文地址:http://tieba.baidu.com/p/3561719701 object obj = Resources.Load(资源名, typeof(Sprite)); Sprite sp = obj as Sprite; img.sprite = sp;

LATEX 中修改表格线条粗细hline

可以使用booktabs宏包 \usepackage{booktabs} 然后使用\toprule, \midrule and \bottomrule 参考:http://tex.stackexchange.com/questions/156122/booktabs-what-is-the-difference-between-toprule-and-hline

WPF4文字模糊不清晰、边框线条粗细不一致的解决方法

软件测试过程中发现在一台1600*900的分辨率电脑上文字模糊,甚至某些个文字出现压缩扭曲 经过实践,发现按下面方法能解决一点问题: 在窗口或控件上设置字体属性就可以了(红色标注部分),如下: <UserControl x:Class="..."             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"             xmlns:x="http

Photoshop简单图文操作

1. 如果图片是.gif格式 打开右侧显示索引,无法第图片操作.这时需要转换:方法:打开photoshop – 图像 – 模式 – RGB颜色(也可选择其他)2. 编辑图片插入形状 方法:右侧编辑栏 – 自定义多边形工具 – 选择要插入的图形 上边编辑栏 ①有三个选项供选择(形状,路径,像 素) ②填充--选择要填充的颜色 ③描边--如果需要给图形描边可以选择颜色.大小.样式 ④点右侧图层编辑区 右 键混合选项 可以设置混合模式 透明度3. 合并图片方法:新建画布-设置好尺寸 ①种方法:打开编辑

Unity Shader 卡通渲染 基于退化四边形的实时描边

一.边缘检测算法 3D模型描边有两种方式,一种是基于图像,即在所有3D模型渲染完成一张图片后,对这张图片进行边缘检测,最后得出描边效果.一种是基于空间,即针对3D模型的三角面三个顶点构成的线条做边缘检测(注:和基于图像的边缘检测的检测方式是不同的,但都叫边缘检测).在本文中使用的是基于空间的3D模型的描边. 空间的3D模型的描边的边是有类型的,大致总结有4种:轮廓边.边界边.折缝边.材质边.其中前3种是本文认为卡通渲染所必须有的. 图1 空间中的边分类 来自文献[1] 轮廓边的检测根据定义就是,