卡通渲染的方法之一:基于色调的着色技术(tone-based shading)。P288

实现中,我们往往会使用 漫反射系数 对一张一维纹理进行采样,以控制漫反射的色调 。(7.3节中用渐变纹理实现过这种效果)

卡通风格的高光往往是一块分界明显的纯色区域。

除了光照模型不同外,卡通风格通常还需要在物体边缘部分绘制轮廓,本节使用基于模型的描边方法。


14.1.1渲染轮廓线

在实时渲染中,轮廓线的渲染是应用非常广泛的一种效果,在《Real Time Rendering,3rd》一书中,作者把这些方法分成了5种类型:

  1. 基于观察角度和表面法线的轮廓渲染:适应视角方向和表面法线的点乘结果来得到轮廓线的信息。这种方法简单快捷,可以在一个Pass中就得到渲染结果,但局限性很大,很多模型渲染出来的描边效果都不尽如人意。
  2. 过程式几何轮廓线渲染:核心是使用两个Pass渲染,第一个渲染背面的面片,并使用某些技术让他的轮廓可见,第二个Pass再正常渲染正面的面片。这种方法的优点在于快速有效,并适应于绝大多数表面平滑的模型,但缺点是不适合类似立方体这样平的模型。          (本节使用这种,第一个Pass使用轮廓线颜色渲染整个背面的面片,并在视角空间下把模型顶点沿着法线方向向外扩张一段距离,以此来让背面的轮廓可见
    viewPos = viewPos + viewNormal*_Outline;

    但是,如果直接使用顶点法线进行扩展,对于一些内凹的模型,就可能发生背面面片遮挡正面面片的情况。为了尽可能防止出现这样的情况,在扩展背面顶点之前,我们首先对顶点法线的Z分量进行处理,使他们等于一个值,然后把法线归一化后再对顶点进行扩张,这样的好处在于,扩展后的背面更加扁平化,从而降低了遮挡正面面片的可能性

    viewNormal.z=-0.5;
    viewPos=normalize(viewNormal);
    viewPos=viewPos+viewNormal*_Outline;
    

  3. 基于图像处理的轮廓线渲染:边缘检测方法就属于这种类型,优点在于可以适用于任何类型的模型。但也有自身的局限所在,一些深度和法线变化很微小的轮廓无法被检出来,如桌子上的纸。
  4. 基于轮廓边检测的轮廓线渲染:上面提到的方法中一个最大的问题就是无法控制轮廓的风格,想渲染出如水墨风格的轮廓线,为此,需要检测出精准的轮廓边,然后直接渲染他们,检测一条边是否是轮廓边的的公式很简单,只需要检查和这条边相邻的两个三角形是否满足下面的条件:   其中,n0和n1分别表示两个相邻的三角形面片的法向,v是从视角到该边上任意顶点的方向。上诉公式的本质在于检查两个相邻的三角面片是否是一个朝正面,一个朝背面。我们可以在几何着色器(Geometry Sahder)的帮助下实现上面的检测过程,当然,这种方法的缺点除了实现相对复杂外,还有动画连贯性的问题,也就是说由于是逐帧单独提取轮廓,所以在帧与帧之间会出现跳跃性。
  5. 混合上述的几种渲染:例如,首先找到精准的 轮廓边,把模型和轮廓边渲染到纹理中,再使用图像处理的方法识别出轮廓线,并在图像空间下进行风格化渲染。

14.1.2 添加高光

对于卡通渲染的高光反射光照模式,需要计算normal和halfDir的点乘结果,把该值和一个阀值进行比较,如果小于阀值,则高光反射系数为0,否则1。

float spec=dot(worldNormal,worldHalfDir);
spec=step(threshold,spec);

CG 的Step函数:(参考值,待比较值)如果第二个大于第一个则返回一。

但是,这种磁暴的判断方法会在高光区域的边界造成锯齿。原因在于高光区域的边缘不是平滑渐变的,而是由0突变到1,想进行抗锯齿处理可以在很小的一块区域内,进行平滑处理

float spec=dot(worldNormal,worldHalfDir);
spec=lerp(0,1,smoothstep(-w,w,spec-threshold));

CG 的smoothstep函数:w是一个很小的值,当spec-threshould小于-w时返回0,大于w时返回1否则在0到1之间进行插值。

这样的效果是可以在[-w,w]区间内,即高光区域的边界处得到一个从0到1平滑变化的spec值,从而实现抗锯齿的目的。

像素之间的近似导数值用 CG的 fwidth 函数来得到。

卡通风格的渲染【Unity Shader入门精要14.1】相关推荐

  1. Unity Shader入门精要学习笔记 - 第14章 非真实感渲染

    Unity Shader入门精要学习笔记 - 第14章 非真实感渲染 本系列为UnityShader入门精要读书笔记总结, 原作者博客链接:http://blog.csdn.net/candycat1 ...

  2. Unity Shader入门精要学习笔记 - 第14章非真实感渲染

    转载自 冯乐乐的 <Unity Shader 入门精要> 尽管游戏渲染一般都是以照相写实主义作为主要目标,但也有许多游戏使用了非真实感渲染(NPR)的方法来渲染游戏画面.非真实感渲染的一个 ...

  3. Unity Shader入门精要学习笔记 - 第7章 基础纹理

    转自 冯乐乐的 <Unity Shader 入门精要> 纹理最初的目的就是使用一张图片来控制模型的外观.使用纹理映射技术,我们可以把一张图"黏"在模型表面,逐纹素地控制 ...

  4. Unity Shader入门精要第七章 基础纹理渐变纹理

    Unity系列文章目录 文章目录 Unity系列文章目录 前言 一.渐变纹理是什么 参考 前言 尽管在一开始,我们在渲染中使用纹理是为了定义一个物体的颜色,但后来人们发现,纹理 其实可以用于存储任何表 ...

  5. 【备份】《Unity Shader入门精要》配图

    说明:本页面是书籍<Unity Shader入门精要>的随书彩图集锦,包含了书中所有的插图,使用时可通过图片编号进行搜索.  作者:冯乐乐  邮箱:lelefeng1992@gmail.c ...

  6. 【备忘】《Unity Shader入门精要》随书彩色插图

    转载来源:http://www.manew.com/blog-194008-42590.html <Unity Shader入门精要>随书彩色插图 <Unity Shader入门精要 ...

  7. 《Unity Shader入门精要》随书彩色插图

    说明:本页面是书籍<Unity Shader入门精要>的随书彩图集锦,包含了书中所有的插图,使用时可通过图片编号进行搜索.  作者:冯乐乐  邮箱:lelefeng1992@gmail.c ...

  8. unity Shader 入门精要 EX

    unity Shader 入门精要: 1.shader概念 2.shader分类(顶点Shader.像素Shader) 3.Shader编程语言 4.Unity Shader 4.1概述 4.2分类( ...

  9. Unity Shader入门精要--第4 章 学习Shader 所需的数学基础

    Unity系列文章目录 文章目录 Unity系列文章目录 前言 4.1 背景:农场游戏 4.2 笛卡儿坐标系 4.2.2 三维笛卡儿坐标系 4.2.3 左手坐标系和右手坐标系 4.2.4 Unity ...

最新文章

  1. 论文里常出现的可扩展性(Scalability)是什么意思呢?
  2. python难学嘛-python语言难学吗
  3. Unity发布WebGl注意事项
  4. 黑色幽默:“新知青”电影《走着瞧》首映
  5. Linux在U盘安装python的过程详解
  6. ApacheCN C/C++ 译文集(二) 20211204 更新
  7. [[UIScreen mainScreen] bounds] 返回的屏幕尺寸不对
  8. iphone新旧手机数据传输已取消_iPhone 手机支付宝自动扣费?取消服务提示“无法解约”?...
  9. 抖音txt表白html,抖音vbs表白代码的技巧分享
  10. 冒泡排序(Bubble Sort)详解与代码
  11. win10初始化mysql出现失败怎么办_win10初始化电脑出现问题未进行任何更改怎么办...
  12. [转载]AI教师正来势汹汹,教师饭碗堪优
  13. 计算机控制原理中雷达天线,相控阵雷达工作原理
  14. 【飞飞CMS二次开发实录】开篇:安装与运行
  15. 计算机显示器外壳怎么防水,电脑显示器怎么拆开外壳
  16. 蓝带 拱桥 区别_蓝带
  17. 人工智能之自动驾驶系列(一):概要
  18. 「带队伍」的关键是什么?
  19. Web开发入门不得不看
  20. 阿里妈妈内容营销团队并入优酷 向樊路远汇报

热门文章

  1. nodejs安装及命令
  2. [SAP - HCM] PA-PD Training From Spain Expert
  3. C#微信公众号支付接口对接
  4. 什么是mysql的索引_什么是索引?mysql目前索引有哪些?
  5. 复习JAVA高级部分
  6. 老河口职业技术学校网络综合布线实训室竣工
  7. 武义机器人_骄傲武义学子在第35届金华市青少年科技创新大赛中荣获佳绩
  8. 深度解析:为什么说持续交付将统治IT运维?
  9. 2020安徽省程序设计大赛_收集圣物
  10. Excel导入长数据末尾变000