Stylized Highlights for Cartoon Rendering and Animation

该论文的目的主要是用来渲染卡通风格的高光。复现参考自【NPR】非真实感渲染实验室

符号:
:=:=:= 表示定义为

核心思想

整篇论文的主要思想是通过控制半程向量 H\mathbf{H}H 来控制高光的大小范围形状位置
使用的光照模型是 Blinn-Phong 模型。

这里我们主要关注高光部分,其高光部分的公式如下:
Φs(p)=ks(N,H)n(1)\Phi_s(\mathbf{p})=k_s(\mathbf{N}, \mathbf{H})^n \tag{1} Φs​(p)=ks​(N,H)n(1)
解释一下:

  • p\mathbf{p}p 表示当前的着色点
  • ksk_sks​ 表示高光反射系数,直白一点就是高光反射的颜色
  • N\mathbf{N}N 表示当前着色点的法线向量
  • H\mathbf{H}H 表示观察方向和光源的入射方向向量的和并做归一化
  • nnn 则用来控制高光反射的面积大小

回到该论文中,现在假设 ks,n=1k_s,n=1ks​,n=1 。 然后设置高光的面积,需要了解一下,卡通中的高光不会像现实那样过度很平滑,而是结束的很突兀。
Hε:={p∈S∣Φs(p)>1−ε}(2)\mathbf{H}_{\varepsilon}:=\{\mathbf{p} \in \mathbf{S} | \Phi_s(\mathbf{p})>1-\varepsilon\} \tag{2} Hε​:={p∈S∣Φs​(p)>1−ε}(2)
如何理解这个公式呢?实际上这个就是控制高光的范围,比如我计算得到当前着色点的高光值 Φs(p)\Phi_s(\mathbf{p})Φs​(p) ,但是其小于我给点的阈值 1−ε1 - \varepsilon1−ε,那么我就直接赋值为 000 ,就不要这一块的高光值了。

那么我们现在再重新设置一下高光部分的计算模型:
Φ(p,N,H):=(N(p),H(p))(3)\Phi(\mathbf{p, N, H}):=(\mathbf{N_{(p)}}, \mathbf{H_{(p)}}) \tag{3} Φ(p,N,H):=(N(p)​,H(p)​)(3)
由于之前已经设置 ks,n=1k_s,n=1ks​,n=1 了,所以在公式中就不需要再额外用符号表达了。
那么 式(2) 也就相应跟着改变如下:
H∗[ε]:={p∈S∣Φ(p,N,H)>1−ε}(4)\mathbf{H^*}[\varepsilon]:=\{\mathbf{p} \in \mathbf{S} | \Phi(\mathbf{p, N, H}) >1-\varepsilon\} \tag{4} H∗[ε]:={p∈S∣Φ(p,N,H)>1−ε}(4)

从上式可以看出,光照模型主要是和法线和半程向量相关,本文主要就是去控制半程向量的大小,方向等等来控制高光。

控制

Translation(平移)

这里主要是在切线空间下进行变换,本文定义的平移主要是在 du\mathbf{du}du 和 dv\mathbf{dv}dv 上操作。
变换过程如下:
H′:=H+αdu+βdv,t(H):=H′/∥H∥\mathbf{H}' := \mathbf{H} + \alpha\mathbf{du}+\beta\mathbf{dv},\\ t(\mathbf{H}):=\mathbf{H}' / \|\mathbf{H}\| H′:=H+αdu+βdv,t(H):=H′/∥H∥

t(H)t(\mathbf{H})t(H) 就是我们最终得到的平移变换后的半程向量。

刚开始看的时候,脑子没有代入到三维空间中去,仍然以 2d 的空间去思考,就在想为啥,因为即使更改了 两个轴,也就相当于移动了半程向量,但是与法线的夹角应该没变啊,后来自己画了一下图,才想起来这是在三维空间中,头大!!!

可以看到,假设这是一个切平面,其中蓝色向量表示 zzz 轴, 绿色向量表示 yyy 轴,红色向量表示 xxx 轴。
在切平面中法线向量就是 zzz 轴。
现在我们设置紫色向量为原始半程向量。
现在的橙色向量是在紫色向量的 dx\mathbf{dx}dx dy\mathbf{dy}dy 分量上减少并做了归一化,而黑色向量则是增加并做了归一化。
为了方便比较,下图是未作归一化的向量在三维空间中的显示。

可以看出,减少分量上的值会导致半程向量与法线向量的夹角越来越小,成正比关系,而 式(3) 主要是计算两者夹角的余弦值,也就是与 式(3) 成反比。

用白话来说,通过更改半程向量分量上的值,可以使得着色点本来高光值很低甚至没有的不断变大,而本来很大的也可以变得很小,使其在不同位置有着重定义的高光显示。

Rotation(旋转)

旋转变换其实和平移变换同属于一个概念:仿射变换,所以操作和坐标变换的概念也差不多,文中并未列出公式,但实际上用旋转矩阵去左乘即可,左乘顺序分别是绕 xxx 轴旋转的矩阵,后面依次是绕 y,zy,zy,z 轴的旋转矩阵。
H′:=(cos⁡(radz)sin⁡(radz)0−sin⁡(radz)cos⁡(radz)0001)(cos⁡(rady)0−sin⁡(rady)010sin⁡(radx)0cos⁡(radx))(1000cos⁡(radx)sin⁡(radx)0−sin⁡(radx)cos⁡(radx))H,\mathbf{H}' := \begin{pmatrix} \cos(\mathrm{rad}_z) & \sin(\mathrm{rad}_z) & 0 \\ -\sin(\mathrm{rad}_z) & \cos(\mathrm{rad}_z) & 0\\ 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} \cos(\mathrm{rad}_y) & 0 & -\sin(\mathrm{rad}_y) \\ 0 & 1 & 0 \\ \sin(\mathrm{rad}_x) & 0 & \cos(\mathrm{rad}_x) \end{pmatrix} \begin{pmatrix} 1 & 0 & 0 \\ 0 & \cos(\mathrm{rad}_x) & \sin(\mathrm{rad}_x) \\ 0 & -\sin(\mathrm{rad}_x) & \cos(\mathrm{rad}_x) \end{pmatrix} \mathbf{H},\\ H′:=⎝⎛​cos(radz​)−sin(radz​)0​sin(radz​)cos(radz​)0​001​⎠⎞​⎝⎛​cos(rady​)0sin(radx​)​010​−sin(rady​)0cos(radx​)​⎠⎞​⎝⎛​100​0cos(radx​)−sin(radx​)​0sin(radx​)cos(radx​)​⎠⎞​H,

r(H):=H′/∥H∥r(\mathbf{H}):=\mathbf{H}' / \|\mathbf{H}\| r(H):=H′/∥H∥

Scale(放缩)

同样还是改变其不同分量上的缩放比例。
公式如下:
H′′:=H−δ(H,du)du,s(H):=H′′/∥H′′∥\mathbf{H}'':=\mathbf{H} - \delta(\mathbf{H},\mathbf{du})\mathbf{du},\\ s(\mathbf{H}) := \mathbf{H}'' / \|\mathbf{H}''\| H′′:=H−δ(H,du)du,s(H):=H′′/∥H′′∥
其中 δ(0<δ<1.0)\delta(0 < \delta<1.0)δ(0<δ<1.0) 是放缩系数。
上面的式子是从这里推过来的,论文中开始的考虑如下:
H′′=H+δ(N−H,du)du\mathbf{H}'' = \mathbf{H} + \delta(\mathbf{N-H},\mathbf{du})\mathbf{du}H′′=H+δ(N−H,du)du
该式能通过 δ\deltaδ 来控制半程向量靠近还是远离法线向量,并且仔细观察你会发现,当 H=N\mathbf{H=N}H=N 时, δ\deltaδ 其实就没作用了,这里主要是想说明越是靠近法线向量,其实受到 δ\deltaδ 的影响就越小,也就是我们主要通过 δ\deltaδ 控制高光的边缘区域,使其扩大,或者是缩小。
推导如下:
H′′=H+δ(N−H,du)du=H+δ(N,du)du−δ(H,du)du=H−δ(H,du)du\begin{aligned} \mathbf{H}'' &= \mathbf{H} + \delta(\mathbf{N-H},\mathbf{du})\mathbf{du} \\ &= \mathbf{H} + \delta(\mathbf{N},\mathbf{du})\mathbf{du} - \delta(\mathbf{H},\mathbf{du})\mathbf{du} \\ &=\mathbf{H} - \delta(\mathbf{H},\mathbf{du})\mathbf{du} \end{aligned} H′′​=H+δ(N−H,du)du=H+δ(N,du)du−δ(H,du)du=H−δ(H,du)du​

由于 N=[0,0,1]\mathbf{N}=[0,0,1]N=[0,0,1] ,所以在 du\mathbf{du}du 分量上是0,自然在式中就消去了。

注意,文中多次提到的 du,dv\mathbf{du}, \mathbf{dv}du,dv 实际上就是 dx,dy\mathbf{dx}, \mathbf{dy}dx,dy

Split(分裂)

该操作的思想主要是使靠近法线的半程向量远离法线向量。
公式如下:
H∨:=H−γ1sgn[H,du]du−γ2sgn[H,dv]dv,spl(H):=H∨/∥H∨∥\mathbf{H}^{\vee}:=\mathbf{H} - \gamma _1\mathrm{sgn}[\mathbf{H},\mathbf{du}]\mathbf{du} - \gamma _2\mathrm{sgn}[\mathbf{H},\mathbf{dv}]\mathbf{dv},\\ spl(\mathbf{H}) := \mathbf{H}^{\vee} / \|\mathbf{H}^{\vee}\| H∨:=H−γ1​sgn[H,du]du−γ2​sgn[H,dv]dv,spl(H):=H∨/∥H∨∥

其中 sgn(x)={1,x≥0−1,x<0\mathrm{sgn}(x) = \begin{cases} 1, &x\geq 0 \\ -1, &x< 0 \\ \end{cases}sgn(x)={1,−1,​x≥0x<0​

从式中可以看出,当 H=N\mathbf{H = N}H=N 时, H∨:=H−γ1du−γ2dv\mathbf{H}^{\vee}:=\mathbf{H} - \gamma _1\mathbf{du} - \gamma _2\mathbf{dv}H∨:=H−γ1​du−γ2​dv ,你想,本来 H=N\mathbf{H = N}H=N, 夹角为 000 ,现在由于分量上的值减少,导致夹角反而会增大,结果就是高光值变小,而根据 式(4) 我们可以知道,高光值小于某个阈值时我们是不取的,也就是说本来靠近法线向量的半程向量由于该操作反而远离,进而导致高光值变小,低于设定的阈值,最终反而高光值为 000 了。

Squaring(矩形化)

该操作主要是使高亮区域的形状更加趋于方形。
公式定义如下:
θ:=min⁡(cos⁡−1(H,du),cos⁡−1(H,dv)),sqrnorm:=sin⁡(2θ)n,H∧:=H−σ×sqrnorm((H,du)du+(H,dv)dv),sqr(H):=H∧/∥H∧∥\begin{aligned} &\theta:=\min(\cos^{-1}(\mathbf{H,du}),\cos^{-1}(\mathbf{H,dv})), \\ &\mathrm{sqrnorm} := \sin(2\theta)^n, \\ & \mathbf{H}^{\wedge}:=\mathbf{H} - \sigma\times \mathrm{sqrnorm}( (\mathbf{H},\mathbf{du})\mathbf{du} + (\mathbf{H},\mathbf{dv})\mathbf{dv}), \\ & sqr(\mathbf{H}) := \mathbf{H}^{\wedge} / \|\mathbf{H}^{\wedge}\| \end{aligned} ​θ:=min(cos−1(H,du),cos−1(H,dv)),sqrnorm:=sin(2θ)n,H∧:=H−σ×sqrnorm((H,du)du+(H,dv)dv),sqr(H):=H∧/∥H∧∥​

其中 nnn 和 σ(0.0<σ<1.0)\sigma(0.0 < \sigma < 1.0)σ(0.0<σ<1.0) 由自己设定。

这个理解起来就稍微复杂一下了,这里个人也只能凭感觉说,主要控制距离法线向量远的半程向量,会使得稍远一点的半程向量靠近法线向量一些,而不那么远的可能没啥变换,甚至会变得更远一点。这里属于强行解释

非真实感渲染(NPR)论文理解及其复现(Unity) - 《Stylized Highlights for Cartoon Rendering and Animation》相关推荐

  1. 3D图形学(9):非真实感渲染(NPR)

    内容引自<Real Time Rendering 3rd> 非真实感渲染 Non-Photorealistic Rendering 与传统的追求照片真实感的真实感渲染不同,非真实感渲染(N ...

  2. [OpenGL] 非真实感渲染(NPR)的几种效果demo(水墨画/漫画/铅笔画)

    这个程序是我在过年期间,用走亲戚的间隙写的基于OpenGL的shader toy program.总共实现了:草图.水墨画.漫画等等几种不同的渲染特效.程序使用的技术是简单的Shader以及Rende ...

  3. 【NPR】非真实感渲染实验室

    写在前面 前几天在知乎看到一个问题--关于非实感图形学或者风格化渲染有哪些好的书或者paper,我刚好接触过一些就去里面回答了一下.答完以后突然想在Unity里搞一个这样的集锦,把一些简单的NPR论文 ...

  4. 第14章 非真实感渲染

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接: https://blog.csdn.net/e295166319/article/ ...

  5. Real-Time Rendering——Chapter 15Non-Photorealistic Rendering非真实感渲染15.1 Toon Shading15.1卡通阴影

    "Using a term like 'nonlinear science' is like referring to the bulk of zoology as 'the study o ...

  6. UnityShader学习——非真实感渲染

    文章目录 什么是非真实感渲染 卡通风格 1.渲染轮廓线 2.添加高光 素描风格 什么是非真实感渲染 尽管游戏渲染一般都是以照相写实主义(photorealism)作为主要目标,但也有许多游戏使用了非真 ...

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

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

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

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

  9. 《Real-Time Rendering 4th Edition》全文翻译 - 第15章 非真实感渲染(下)15.3 ~ 15.5

    连更两篇,冲鸭! 业余翻译,若有不周到之处,还请多多指教! 实时渲染(第四版)Real-Time Rendering (Fourth Edition) 第15章 非真实感渲染  Chapter 15  ...

最新文章

  1. YII 测试环境搭建
  2. 折腾Java设计模式之建造者模式
  3. X11: Linux跨网络运行XWindow程序
  4. cnn stride and padding_Tensorflow学习笔记- 模型建立与训练篇(CNN)
  5. PolarDB-X 2.0 全局 Binlog 和备份恢复能力解读
  6. 用杰克逊流式传输大型JSON文件– RxJava常见问题解答
  7. 读c语言深度剖析 -- 单引号与双引号、逻辑运算符、位运算符、花括号
  8. WP7 App性能优化(12):检测应用程序性能(Ⅴ)
  9. Springboot——quartz简单配置和使用
  10. 凤凰项目:一个IT运维的传奇故事--阅读心得
  11. 【思考】windows补丁提权的疑问
  12. 静态分析Android程序
  13. 游戏排行榜实现mysql_游戏中百万用户排行设计与实现
  14. 【转载】网络基础-华山论剑
  15. 为什么白素贞能生文曲星转世许仕林? 和她的另一个身份有关
  16. 论文写作-如何提高英语论文写作水平
  17. 热式气体质量流量计检定规程_最佳实践:热式质量流量计实际标定的安全性和准确性...
  18. java开发中常用的算法_总结一下项目开发过程中常用的到的一些加密算法。
  19. RF自动化-RIDE(跑自动化注意事项)和(配置环境注意事项)
  20. 基于ssm应届毕业生在线职位管理平台

热门文章

  1. 计算机图形学之光线跟踪算法的研究与实现2017年我的优秀毕业论文
  2. html5 多点触控 缩放,WebBrowser禁用触摸缩放
  3. html表格标题的垂直对齐方式
  4. 网心科技马婷:探寻边缘计算的“诗和远方”
  5. 路由交换技术实战七 FR 网络中配置 OSPF( 完成版 )
  6. 什么是长连接和短连接,他们的定义区别及应用场景?
  7. 0基础实现微信推送天气,生日等(女朋友快乐眼)
  8. 大学学计算机需不需要提前预习,大学怎么预习啊?
  9. navicat 表合并查询_数据库两个表合并命令
  10. 24部经典电影的24句话