非真实感渲染(NPR)论文理解及其复现(Unity) - 《Stylized Highlights for Cartoon Rendering and Animation》
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)0sin(radz)cos(radz)0001⎠⎞⎝⎛cos(rady)0sin(radx)010−sin(rady)0cos(radx)⎠⎞⎝⎛1000cos(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−γ1sgn[H,du]du−γ2sgn[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−γ1du−γ2dv ,你想,本来 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) 由自己设定。
这个理解起来就稍微复杂一下了,这里个人也只能凭感觉说,主要控制距离法线向量远的半程向量,会使得稍远一点的半程向量靠近法线向量一些,而不那么远的可能没啥变换,甚至会变得更远一点。这里属于强行解释
内容引自<Real Time Rendering 3rd> 非真实感渲染 Non-Photorealistic Rendering 与传统的追求照片真实感的真实感渲染不同,非真实感渲染(N ... 这个程序是我在过年期间,用走亲戚的间隙写的基于OpenGL的shader toy program.总共实现了:草图.水墨画.漫画等等几种不同的渲染特效.程序使用的技术是简单的Shader以及Rende ... 写在前面 前几天在知乎看到一个问题--关于非实感图形学或者风格化渲染有哪些好的书或者paper,我刚好接触过一些就去里面回答了一下.答完以后突然想在Unity里搞一个这样的集锦,把一些简单的NPR论文 ... 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接: https://blog.csdn.net/e295166319/article/ ... "Using a term like 'nonlinear science' is like referring to the bulk of zoology as 'the study o ... 文章目录 什么是非真实感渲染 卡通风格 1.渲染轮廓线 2.添加高光 素描风格 什么是非真实感渲染 尽管游戏渲染一般都是以照相写实主义(photorealism)作为主要目标,但也有许多游戏使用了非真 ... Unity Shader入门精要学习笔记 - 第14章 非真实感渲染 本系列为UnityShader入门精要读书笔记总结, 原作者博客链接:http://blog.csdn.net/candycat1 ... 转载自 冯乐乐的 <Unity Shader 入门精要> 尽管游戏渲染一般都是以照相写实主义作为主要目标,但也有许多游戏使用了非真实感渲染(NPR)的方法来渲染游戏画面.非真实感渲染的一个 ... 连更两篇,冲鸭! 业余翻译,若有不周到之处,还请多多指教! 实时渲染(第四版)Real-Time Rendering (Fourth Edition) 第15章 非真实感渲染 Chapter 15 ...非真实感渲染(NPR)论文理解及其复现(Unity) - 《Stylized Highlights for Cartoon Rendering and Animation》相关推荐
最新文章
热门文章