续上一篇《三维茶壶与景深》
本次改用disc pattern, disc与jitter稍有不同。两者指的都是摄像机偏差的范围,但是形状不同。因此渲染出来的虚化效果也稍有不同。要了解具体原理,请参考 http://screamyguy.net/DepthOfField/
jittered
disc
为了指定渲染轮数所使用的disc pattern,写了下面的函数,
#define DISK_SIZE 256 jitter_point disk[DISK_SIZE]; void init_disk() { int i; for(i=0; i<DISK_SIZE; i++){ disk[i].x = (double)(rand()%1000 - 500)/1000; disk[i].y = (double)(rand()%1000 - 500)/1000; if(disk[i].x*disk[i].x + disk[i].y*disk[i].y > .5*.5){ --i; continue; } } }
生成每个点的范围在(-.5, +.5)之间,而且为了保证是disc形状,判断忽略半径大于.5的点。
下面开始测试不同次数的渲染产生的不同效果。
首先从2轮开始测试渲染效果,
看不出是虚化效果,但像近视眼。
8轮渲染,
66轮渲染,
512轮渲染,接近完美!
接着,玩一下1000轮渲染效果,同时切换不同的景深。
1000轮渲染在我core i3处理器上,耗时10秒左右。
这张截图比较大,点击图片可以放大查看效果!
更浅的景深,增强背景虚化效果,
继续加强虚化,
继续加强,同时跟上一篇《三维茶壶与景深》的66轮渲染进行对比,
怎么样?是不是相差挺远的?1000轮的渲染,质量有了很大的提高。
再看看,焦点转移到第二个茶壶上,
如果是制作动画片需要这种特效,我想渲染的次数可能不止1000次那么少,而且还是超高清的分辨率。
当然,CPU干这种图形特效显然比GPU差的远了。
等考完试,有时间再接触一下GLSL吧。现在手头一堆东西要忙。。。
附本文代码:
我来看看几点了
板凳
感觉左右浮动比较大,而上下浮动不大,难道我眼花了?
久违的FB神牛!!!
如果渲染次数足够多,平均下来,左右偏移跟上下偏移的绝对值的平均值,大小应该是差不多的!