Real-Time Rendering(4):基于图像的绘制Image-Based Effects
提要
用多边形来描述3D场景中的物体是最简单的一种方法了,但也有它的局限,有的时候基于图像的渲染(Image-bases rendering),有些场合IBR会更受用一些,它是基于图像数据的渲染。用图像来表示一个物体很大的好处就是效率非常的高,因为只需要处理图像中锁含有的像素就可以了。
很多物体,比如云彩和毛发,很难用多边形来表示。但用半透明的图片就可以很容易做到。
渲染谱 The Rendering Spectrum
渲染的目的是在屏幕中呈现物体,如何去做是我们的选择,方法不只有一种,但目的总是让渲染结果接近真实(非真实性渲染除外)。
多边形的表达方式可以从不同的视口来观察物体,当camera移动的时候,多边形模型不需要做变换,为了改善效果,当Camera靠近时可以用一个高精度的模型来表示,当视口远离场景时,我们用更简单的方式来渲染场景,用图片来代替多边形可以带来渲染速度的大提升,例如下图《皇牌空战》中的地面建筑。
下图是一渲染谱,表示渲染技术的变化.
固定视角的渲染 Fixed-View Effects
在复杂的模型和场景中,渲染整个场景会非常的耗时。限制视角的移动是一种好的加速方式,一种获得最大渲染速度的方式就是将视口的位置和朝向固定不动。
比如在下面的场景中:牧场中有围栏,还有一批马,牧场和围栏只需要渲染一次,然后颜色和z-buffer都存储起来,每一帧,多有要做的都仅仅是渲染小马了,注意小马是不能渲染影子的,因为背景是不能更改的,要么就是预计算出小马影子的区域,然后在每次渲染中更新。
对于固定视口的渲染,只需要渲染一帧或者几帧存在buffer中,然后在其它帧中只要拿出来复用就可以了。
在CAD设计软件中,通常用户在进行一些操作的时候,模型是静态的,视角也是固定的,渲染完一帧之后就可以停止对场景的渲染,当用户进行对模型的操作之后或者改变视口的时候,再重新渲染,更新buffer,然后复用。
有一种和 static scence相关的技术是golden thread或者adaptive refinement渲染。思想是:当视口和场景不变化的时候,渲染的效果会越来越精细,场景中的物体也会更加真实,当场景中物体或者视口发生改变的时候,精细的图像就没了。比如在ray tracing算法中,渲染出最终的场景会非常费时,当场景复杂的时候更是如此,当场景全部渲染完全再呈现的画用户需要等待很久,可以渲染到一定程度就将画面出现出来,然后在刷新。有很多refinement的方法,比如用一个buffer在记录抗锯齿的结果,然后不断刷新。另一个方法是用 per-pixel shading 在后台渲染,渲染好之后再用淡入淡出来替换掉原图。
这种思想还用到了交互式的数字电影制作中:导演选择和场景和摄像机角度,然后用图形工作站进行渲染。
天空盒 Skybox
离你很远的山,你向前靠近1M和向前靠近100m,山的样子是基本不变的。
天空盒的实现方式有Sphere mapping cube mapping。
Cube mapping是最常见的,环境贴图贴在一个正方体上,这个正方体要足够大,能够包住其他物体,因为是在假设的条件下,物体离盒子很近的时候也ok。天空盒的贴图中只包含一些距离很远的物体,比如太阳,云彩,山脉...
一个下载skybox贴图的网站:http://www.custommapmakers.org/skyboxes.php
作为天空盒的贴图,分辨率一定要足够大,有一个公式:
fov为视角域。
精灵和图层 Sprite and Layer
一种基于最简单的渲染图院的方法就是渲染spirite. spirit 就是在屏幕中晃来晃去的东西,比图2D游戏中你控制的英雄。spirit可以用带透明度的图片来表示,精灵动画的就是通过播放一个图片序列来表示。 angry bird的中小鸟就是spirit。
同时还可以用spirit来表示空间感。比如一个正对摄像机的spirit,通过改变spirit的尺寸,可以造成近大远小的感觉,还可以用一组spirit来表示一个物体,View改变时,改变他们的尺寸和相对位置也能造成一定的空间感,但当物体很大或者很复杂的时候,效果就会很假,如果还要考虑光照和阴影就更难了。
纯粹的IBR都很依赖于高速的,高质量的图形变换、滤镜和合成。
公告版 Billboarding
根据视角来调整贴图多边形的朝向称为公告板技术,这种技术包含了alpha贴图和动画,能够用来表示没有硬边的物体,比如草,植物,火,烟雾..
使用这种技术的时候需要为公告板构建一个空间坐标系,方法如下:
1.在平面内任意找两个不平行的单位向量,x,y;
2.叉乘 x * y = n,单位化n得到垂直于面的法向量;
3.令x,y中任一一个固定为u,叉乘 u * n = v,单位化v得到第三个向量;
4.u , v, n就组成了billboarding的空间坐标系。
下图是用billbording建模的一棵树。
HDR High Dynamic Range
HDR是一种表达超过了显示器所能表现的亮度范围的图像映射技术。高动态范围技术能够很好地再现现实生活中丰富的亮度级别,产生逼真的效果。HDR已成为目前游戏应用不可或缺的一部分。通常,显示器能够显示R、G、B分量在[0,255]之间的像素值。而256个不同的亮度级别显然不能表示自然界中光线的亮度情况。比如,太阳的亮度可能是一个白炽灯亮度的几千倍,是一个被白炽灯照亮的桌面的亮度的几十万倍,这远远超出了显示器的亮度表示能力。如何在有限的亮度范围内显示如此宽广的亮度范围,正是HDR技术所要解决的问题。
将一个宽广的亮度范围映射到纸张或屏幕能表示的亮度范围类似于照相机的曝光功能。人眼也有类似的功能。通过照相机的光圈,可以控制进入感光器的光线数量,感光器得到的明暗程度经过一定的处理,就可以得到令人信服的照片。照相机是一个典型的从高动态范围映射到低动态范围的例子。如果我们能够在一定程度上模拟照相机的工作原理,就可以在屏幕上显示高动态范围的图像。对于人眼或镜头,过亮的光线射入时会产生光晕效果,这一点也可以通过一些方法模拟。动态曝光控制和光晕效果结合起来,就构成了一个经典的高动态范围渲染器。
景深 Depth of field
景深的效果在计算机图形学中被应用广泛,电影,游戏里面经常会利用景深特效来强调画面重点。相应的,已经有了很多成熟的算法在不同的渲染方法上,光栅化可以很高效的实现景深的算法。
动态模糊 Motion Blur
一种实现的方法称为 Pixel Motion Blur(一下简称PMB),根本原理是这样的:
1、用图像的两个通道创建速度图记录像素点的视口速度;
2、根据速度图进行pp的blur处理。