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

本文介绍了如何在Unity中利用基于空间的边缘检测算法、退化四边形和CommandBuffer进行卡通描边渲染。通过遍历模型找出退化四边形,使用ComputeBuffer和CommandBuffer在顶点着色器中进行处理,实现模型描边效果。文章提供了详细步骤和代码示例。
摘要由CSDN通过智能技术生成

目录

前言

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

二、退化四边形

三、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.AddCommandBufferLight.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 System.Collections.Generic;
using UnityEngine;

[CreateAssetMenu(fileName = "DegradedRectanglesData", menuName = "Degraded Rectangles")]
public class De
  • 9
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 21
    评论
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值