Depth Of Field(DOF) DX9

简介: 在以前学习的各项技术中,DXSDK均标示那些案例为中等难度。而这次学习的Depth Of Field确实高等难度,本想着这次可能会学很久,结果看完这个sample的Doc之后,发现使用的技术很简单,才花了一天时间就学完了(如果自己能更仔细估计能更快),真不清楚DX是按哪个标准划分难度级别的。

在以前学习的各项技术中,DXSDK均标示那些案例为中等难度。而这次学习的Depth Of Field确实高等难度,本想着这次可能会学很久,结果看完这个sample的Doc之后,发现使用的技术很简单,才花了一天时间就学完了(如果自己能更仔细估计能更快),真不清楚DX是按哪个标准划分难度级别的。闲话少说,进入正题。

 

Depth Of Field中文我觉得可以翻译为视野范围。更准确的说就是视野中能清晰辨别物体的范围或者深度。其实我们人的眼睛看东西也是这样的,在我们视线聚焦的地方物体时最清楚的,而旁边的物体是不怎么清楚。这种效果可以采用DOF技术来实现。实现DOF的技术有很多,在《Real-Time Rendering》中介绍了三,四种,今天要讲是其中一种,被其称为Backward Mapping。

 

今天的这个技术主要可以分为两部分:

  1. 设定视空间内的一个平面为聚焦平面,接近这个平面的物体会更清楚。然后求出每个点到这个平面的距离,距离越大这个点需要被模糊化更厉害,反之亦然。
  2. 根据每个点的模糊化程度,在指定的模糊图案中采点,并根据这些点的颜色值进行加权求平均,决定最后的颜色。

我们主要讲解一下两个部分的重点难点:

  1. 如何定义一个平面?根据平面公式,平面定义需要一个法向量和一个到原点的有符号垂直距离。所以平面可以用一个4维向量表示,前3个表示法向量,最后一个表示到原点的有符号垂直距离。特别注意到原点的有符号垂直距离,因为我们经常会只想着距离,而忘了其是有符号。如果想设置一个在视空间中z=3的平面,法向量假设是(0,0,1),那么最后一个w因为是-3,而不是3.我就在这里吃了亏,不过确让基本功更扎实了。
  2. 求点到平面的距离。其实很简单,我们只需要将点变换到视空间,然后用此时的坐标和刚才介绍平面4维向量做点积就可以了,得到的就是到该平面的有符号距离。如果点在平面法向量所指的那侧,那么有符号距离是正的。反之,则是负。为什么做点积就可以得到呢?这就是向量之间点积的几何含义。不清楚的话,需要自己搜集资料好好巩固一下。
  3. 模糊图案是怎么回事呢?就是我们设定一系列偏移点,这些点主要是让我们要处理的点去访问其相邻的点,用这些相邻的点进行权重相加求平均得出最后该点颜色。这些相邻点组成的图案就是模糊图案。这个案例中采用的是2个六边形,一个小的一个大,且两个放置得相互垂直。

其实这个案例中还提供另外一种方法就是将模糊图案直接记录到top-level四边形的纹理坐标中,那样可以支持更低级的ps版本。

这个案例比较简单,我暂时能想到重要的地方就这几处了。

相关文章
|
2月前
GEE错误——Layer error: Image.connectedPixelCount: Segment size calculation on floating point bands is n
GEE错误——Layer error: Image.connectedPixelCount: Segment size calculation on floating point bands is n
31 0
|
12月前
|
算法 数据可视化 Python
鞍点Saddle Point Locator
鞍点Saddle Point Locator
93 0
|
算法
LeetCode 363. Max Sum of Rect No Larger Than K
给定一个非空二维矩阵 matrix 和一个整数 k,找到这个矩阵内部不大于 k 的最大矩形和。
76 0
LeetCode 363. Max Sum of Rect No Larger Than K
|
Android开发
|
Python
“cosine_distance“ “KMeansClusterer“ is not defined
“cosine_distance“ “KMeansClusterer“ is not defined
72 0