Published

25 December 2013

Tags

Contents

图形学大作业奋战了将近一个月,算是告一段落了,虽然还有很多想写的特性,但是落下了一堆功课得赶紧补了。

参考了不少文章,最后效果还凑活,没有网上一些图片精致,从zsyzgu同学翻译的文章4那参考了不少,这位同学今年参加了智能体,很是欣慰~

下面是大作业的文档,放上来凑数

1. 基本信息

1.1. 作业内容

实现光线跟踪以及网格简化。

1.2. 测试设备

  • 系统 : Windows 8
  • CPU : I5-3230M 2.60GHz
  • GPU : GT 750M

1.3. 实现内容及特性

  • 边压缩的网格简化,下图从左到右依次为 100、300、500、700、900个三角形

  • 支持 .obj 格式以及 .mtl 材质格式读入, 支持 UV 贴图, 支持法相平滑插值和位置插值,下图为对比效果图。

  • SAH-KDTree 加速

    图中为968个三角形的模型,关闭阴影和抗锯齿,单线程耗时90ms,多线程耗时 40ms.

    KdTree 网格划分情况,绿色为叶节点,红色为中间节点。

  • OpenCL 显卡加速,KDTree遍历代码以及RayTrace递归过程 改非递归重写, 非递归KDTree部分参考自论文3。 因为从CPU传参数到GPU需要一定时间,所以使用较为复杂的场景,并且开启阴影和三个光源,效果如下图:

    其中 CPU 单线程运算耗时5970ms, 多线程耗时为2698ms,OpenCL GPU耗时830ms

  • 快速抗锯齿

    下左图为未抗锯齿抗锯齿,右图为抗锯齿

  • 软阴影以及BRDF

  • 红蓝3D

2. 实现原理

2.1. 网格简化

已有一个三角网格,每次选一条最短的边然后将这条边所连的两个点合并,并删除重边。

两个点合并以后产生一个新的点,这个点由这两个点的坐标以及这两个点的法向量二次插值计算得来,插值方法如下:

Xa Xb : a, b 的坐标
Fa Fb : a, b 的点法向量,由这个点附近的面的法向量插值得来
Normal(x) : 将 x 归一化
X = (a + b)/2 + Normal(Fa + Fb) * dot((Xa - Xb), Fa - Fb) / 4

这样可以得到 C1 连续的顶点,如图所示

2.2. 光线跟踪

2.2.1. SAH-KDTree

和普通 KDTree 不一样的是, SAH-KDTree 通过一个函数加权计算划分点。 具体参考论文1.

2.2.2. 软阴影

自然生活中,阴影的边缘多半是模糊的,这是因为光源并非点光源而是面光源,那么如何计算面光源,解析计算难度很大,有一个粗暴的方法是在这个面光源上随机取一个点, 然后把它当做点光源,这个方法显然太粗暴,于是乎可以将这个面划分成更多小面,比如4*4个小面,然后每个小面单独做在加权起来,如下图所示, 参考自网站2

2.2.3. 蒙特卡洛光线跟踪

蒙特卡洛光线跟踪可以对一些BRDF模型进行计算, 其思想和生成软阴影的方法有些类似, 参考自网站2

2.2.4. 红蓝3D

这个挺简单的,就是在两只不同的眼睛生成两张不同的图片,然后在合并起来。 合并算法就是对于一个像素,红色分量取左眼的图片,蓝绿色色分量取右眼的图片。

2.2.5. 快速抗锯齿

对于一张锯齿严重的图,抗锯齿是必须的,为什么会有锯齿的出现, 这是因为每个像素发射一条射线不足以描述这一个像素的颜色,为了采样这个像素的颜色,我们可以多发射几条射线。

但是对于一张图,并不是所有像素都有重新采样的需求,比如我们可以对图像的边缘进行采样,有方法是,如果这个像素和附近的像素打到了不同的三角形上,那么对这个点进行采样,参考自网站2, 如图:

对于一些特别精细的模型这个采样方法可能还不够高效,我们再计算下这个图像的梯度:

然后同时满足第一个条件和梯度大于阈值时才对这个点进行采样,如下图:

3. 实现过程

2013.12.4

  • 三角形求交,使用纯色进行着色

2013.12.5

  • Lambert着色,phong着色

2013.12.6

  • 使用极坐标分段三角片模拟球
  • 插值法向量,对模型做平滑处理平滑
  • 阴影的计算

2013.12.7

  • 可读取 obj 文件进行渲染
  • 代码重构
  • 实现反射与折射

2013.12.8

  • 实现 sah-kdtree 建树
  • kdtree 线框图用于对kdtree进行分析

2013.12.10

  • 实现 kdtree 加速光线跟踪

2013.12.13

  • CPU 多线程实现
  • 实现快速抗锯齿

2013.12.14

  • 支持 obj 以及 mtl 材质文件
  • 支持阴影色,实现“假”焦散效果

2013.12.15

  • 支持了纹理,支持 UV 贴图

2013.12.20

  • 实现了非递归 kdtree 的遍历
  • 通过位置插值来计算更加精确的阴影

2013.12.21

  • 实现 OpenCL 的移植, 比CPU多线程有5倍的提速

2013.12.22

  • 实现显卡抗锯齿
  • 光源衰减,让光源按照距离的平方项的倒数衰减
  • 啤酒瓶定理和菲涅尔项更好的渲染折射以及反射

2013.12.23

  • 实现面光源,软阴影
  • 蒙特卡洛光线跟踪计算BRDF
  • 循环队列广搜光线跟踪
  • 红蓝3D

2013.12.25

  • 网格简化

4. 参考文献

以下链接对我帮助很大,特此感谢~



blog comments powered by Disqus