Unity Shader 卡通渲染 模型描边之退化四边形 您所在的位置:网站首页 unity描边算法 Unity Shader 卡通渲染 模型描边之退化四边形

Unity Shader 卡通渲染 模型描边之退化四边形

2024-06-27 00:42| 来源: 网络整理| 查看: 265

目录

前言

一、基于空间的边缘检测算法

二、退化四边形

三、Unity中的CommandBuffer和ComputeBuffer

四、构成描边的简单实例

五、模型描边的实现

前言

之前写了一篇《Unity Shader 卡通渲染 实时模型动画描边的研究》,因为对unity3d的渲染工具不太熟悉,用了一种又较笨、又不太现实的方法进行边缘检测,写得也不是很好。最近在搜索无意间搜到一篇文章了CommandBuffer.DrawProcedural examples,发现unity3d可以自定义渲染指令。简单的探究后,发现它可以让着色器使用自定义数据缓冲(ComputeBuffer)来绘制图形。

 

一、基于空间的边缘检测算法

在《Unity Shader 卡通渲染 实时模型动画描边的研究》中提到的算法是基于空间几何的边缘检测算法。模型上一条边(构成三角面的边)是否要描绘出来由以下情况决定:

很容易得出:是否要绘制边需要它的相邻三角面信息,那么最少也要4个顶点。在《Unity Shader 卡通渲染 实时模型动画描边的研究》描述到了一种基于GPU的算法,把4个顶点作为顶点着色器的输入并绘制,这样就可以在顶点着色器运行。然而,文中并没有使用这个算法,可能当时文中使用的引擎不支持?

在Unity中是支持这种做法的,提供的工具是CommandBuffer和ComputeBuffer。

 

二、退化四边形

把复杂对象A当做简单对象B来简化运算,有一个形象的名字叫作“退化对象A”。这里是把四边形当做顶点来简化运算,所以这个(包含了4个顶点数据)四边形就叫“退化四边形”。因此退化四边形即可叫边,可叫2个三角面,也可叫4个顶点。

 

三、Unity中的CommandBuffer和ComputeBuffer

在动手前先来简单介绍下需要使用的工具类。

ComputeBuffer是GPU数据缓冲区,主要用于计算着色器(ComputeShader),可通过Material.SetBuffer在任意材质上使用。

CommandBuffer是一系列需要执行的图形指令,主要作用是扩展Unity3d渲染管线,可在Graphics.ExecuteCommandBuffer,Camera.AddCommandBuffer,Light.AddCommandBuffer上执行。

CommandBuffer有一个DrawProcedural绘制过程几何的方法,这个方法给顶点着色器的参数是SV_VertexID和SV_InstanceID,而不再是顶点数据。其中SV_VertexID代表的是索引号,这个索引号应该和通过Material.SetBuffer传入的某些ComputeBuffer一一对应。

在这里这些ComputeBuffer就是我们退化四边形的数据(4个顶点数据),一般的还会传入顶点ComputeBuffer、顶点法线ComputeBuffer等,或者其他任何你想要的数据。

 

四、构成描边的简单实例

完整的描边实现步骤并非一步到位,而是由各个简单的实例测试后拼接起来。

实例1:遍历模型找出所有退化四边形并保存起来。

退化四边形和三角面索引一样,模型建成后顶点的索引都不会改变,因此可保存,并且要求没有重复退化四边形(为了提高性能)。因此创建一个继承了ScriptableObject的DegradedRectangles类来完成这个实例。

下面给出DegradedRectangles.cs部分代码

using System.Collections; using Syst


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有