3D 渲染管线导论 读书笔记

来源:互联网 发布:广州数控车床仿真软件 编辑:程序博客网 时间:2024/05/21 07:46

最近细细读了Dave Salvator的文章,把其中一些内容整理如下:

不是所有的渲染系统都具有共同的目标,offline渲染系统为了得到精确、逼真的结果,real-time渲染系统必须保证固定的帧率以保证动画的平滑流畅。

总之就是渲染质量与速度trade-off.
3D pipeline 实际就是从三角面片描述的模型到屏幕上的像素的3D图形处理过程。
3D 图形渲染是一门避免被发现的欺骗艺术。
精心使用各种技巧来减少场景中的视觉细节来获得高性能,但同时又不能让用户发现这些简化。例如尽可能早的做场景剔除,避免在看不见的场景上浪费系统资源。


Overview Diagram
1. Application/Scene
2. Geometry
3. Triangle Setup
4. Rasterization/Rendering
Application中的工作通常是由应用程序完成的,因此有些人认为他并不是3D管线中的一部分,另外三个部分是由3D API完成,主流的有SGI的OpenGL,Microsoft的D3D,Pixar的Renderman。


下面首先关于3D管线不同阶段用到的5种不同的空间坐标系:
Model Space:每个模型自己的坐标系
World Space:整个3D世界中统一的坐标系
View Space(Camera Space):当系统使用了某个设置的相机后,相机坐标系原点便被设置到了相机的位置点,并且看向Z轴也就是场景的方向。Culling,Back-face Culling,lighting操作都是在该空间中完成的
Clip Space:类似于View Space,只是相当于将View Frustrum压缩成了Unit Cube,主要通过一个特别的变量’w’进行Perspective操作实现坐标空间压缩。
Screen Space:2D屏幕坐标系,除了x、y还同时保留了z、w坐标,用于z-buffering及最终的back-face culling。注意从屏幕坐标到像素的操作叫做光栅化(rasterization)


下面深入介绍3D Pipeline每一个阶段中所完成的具体的工作:
Application/Scene:
Scene/Geometry database traversal
Movement of objects, and aiming and movement of view camera
Animated movement of object models
Description of the contents of the 3D world
Object Visibility Check including possible Occlusion Culling
Select Level of Detail
3D应用程序本身其实就是3D管线的开始阶段。首先完成视角的设定;每一帧的渲染都需要对Scene/Geometry 数据库进行遍历,找出使用的物体。Geometry database中存放的是所有用到的geometric primitive,Scene database存放的则是所有用到物体(模型)
其中的Occlusion Culling主要测试场景中是否存在Object完全被遮挡,这是将其剔除可以避免其进入管线,很大的提高了性能;Object Visibility Check主要测试物体是否完全位于View Frustrum的外部,将其尽早剔除作用如上。
设置不同精细级别模型也在该阶段完成。


Geometry:
Transform (rotation, translation, scaling)
Transform from Model Space to World Space
Transform from World Space to View Space
View Projection ?
Trivial Accept/Reject Culling
Back-Face Culling
Lighting
Perspective Divide - Transform from View Space to Clip Space
Clipping
Transform from Clip Space to Screen Space
变换矩阵中的第四个维度表示缩放因子w,初始设置为1,在clip space中的perspective projection计算与rasterization阶段的perspective-correct interpolation中使用
Trivial Culling剔除主要检测三角形的三个点是否完全位于view frustrum的外部,如果是则通过检验将其抛弃,如果部分相交则留在clipping阶段处理。
Back-Face Culling主要对背向camera方向的面片进行剔除,对于存在半透明面片的情况需要application进行额外的处理,同时该过程也可以在screen space中完成,由于已被投影到了二维空间可以通过cross produce得到一个近似的normal vector。
实时系统中通常使用的是简化的光照模型,模拟真实的光线交互行为的代价是非常高的(如raytracing, radiosity),shading在rasterization完成后进行。
将x,y,z通通除以w,w代表当前顶点到camera position的距离,实现到Clip空间的转化,具体的Clipping实际完成的是将Trivial Culling操作无法处理所遗留下来的部分culling的物体进行进一步的裁剪,具体操作是与Clip Space的边进行求交,对裁剪后的部分需要进行重三角划分以保证面元是三角形。
最终的到屏幕空间的变换只需要将x,y坐标乘以相对应的屏幕像素的宽度与高度即可。


Triangle Setup:
Back-Face Culling (or can be done in View Space before lighting)
Slop/Delta Calculation
Scane-Line Conversion
一些人认为该阶段也可以作为rasterization阶段的一部分。或者可以将这部分作为rasterization。Rasterization与Rendering是两个很容易混淆的过程,首先Rasterization指的是从二维或三维向量表示到x-y坐标表示的过程,而Rendering指的是从3D场景表示到最终的屏幕空间像素的变换过程,是更加广泛的概念,所以可以认为Rasterization其实是scane-line convertion。
通过计算每个三角形每条边的slop即delta x/delta y可以使用DDA算法将边转化为一个个像素点成为span,另外,在这一过程中,颜色、深度信息、纹理坐标也通过插值计算到三角形边上的每一个像素点上


Rendering/Rasterization:
Shading
Texturing
Fog
Alpha Opacity Tests and Blending
Shadows
Anti-Aliasing
Z-Buffering
Displaying


Shading主要是通过定点的颜色值来计算三角形内部每一个像素点的颜色值,Flat Shading取三个顶点颜色的平均值确定所有内部像素点的颜色值,Gouraud Shading取三个顶点的颜色值在三角形的三个边上进行插值,然后再根据边上的颜色值沿扫描线方向对内部的点进行颜色插值计算,Phong Shading类似于Gouraud Shading,但是他插值的是顶点所设置的法线,最终通过法线计算光照值。另外一种更新的技术称作Dot Product Texture Blending(DOT3),类似于Phong Shading其将interpolated normal记录在一个normal map中。
Programmable Shader从DX8种开始实现,最一开始提供了128个assemble语言的命令,主要包括vertex shader和pixel shader两部分:
Vertex Shader:
Procedural Geometry Deformation(海洋。。)
Range-based or Radial Fog effect
Camera-Lens Effect
Pixel Shaders:
Per-pixel Reflection
Per-Pixel lighting 
Procedural textures


Texture通常有以下几种作用:light map, gloss map, shadow map, bump map, environment map。关于texture的操作主要分成以下五步:
1、 计算像素所在的物体空间的位置
2、 使用Projecter函数计算出对应的纹理坐标(u, v)(三角形内插值过程)
3、 使用Corresponder函数找到纹理值(纹理空间插值过程)
4、 使用值变换函数(已有颜色值与纹理值的计算,一般使用乘法,2X,4X混合)
5、 赋值
由于采样率的问题(Nyquist Theory)纹理映射中通常会出现两种问题,第一、如果目标区域大于对应的纹理区域,出现斑块现象;而反之,当view移动时,会出现pixel popping现象。
Texture Sampling的几种方式:
1、 Point Sampling(无法改变artifact)
2、 Bilinear Filtering(基本解决artifact,图像模糊化,效率限制)
3、 Trilinear MIP-Map(higher quality)
4、 Anisotropic filtering(Take more samples:16)
5、 Antialiasing


Fog:
主要为场景添加一定的氛围,通常有per-vertex fog(如同光照计算),per-pixel fog(效果很好,效率限制),range-based fog。
通过设置fog可以增强场景中的透视效果,另外可以使culling的过渡更加的平滑


Alpha Opacity Test and Blending:
主要为了提供出玻璃、水面的效果,每个顶点设置有一个alpha值,就算时需要进行depth-based order。


Shadows:
渲染阴影能够很好的增加场景的真实感,虽然在real-time系统中绘制逼真的阴影难度很大,但是聊胜于无,形成阴影有三个条件:light source, occlude, receiver。阴影分为umbra和penumbra,生成阴影的方法很多,主要介绍projected shadows和shadow volumes(使用stencil buffer)。
Projected Shadow主要思想是将occluder投影到receiver上,但只适用于receiver是平面的情况,否则会出想异常;将occluder投影到纹理再映射到receiver上可以提高效率;同时可以利用设置多个satellite光源一个中心光源来实现软影效果,当然效率会受到一定程度的影响。
Shadow Volume 主要思想是对光源绘制一个额外的frustum,并且与view frustum相交,位于该相交区域内部的面片皆为阴影区域,可以通过Z-Buffer和Stencil buffer共同实现。


Antialiasing:
Aliasing问题是由于采样率不足造成的,理论上使用更大的屏幕分辨率及可能解决。而实际上通过Full-Scene Antialiasing技术来解决,


Z-Buffering
最初始的算法,当通过CPU实现深度检测的时候,通常采用(Painter’s Algorithm)该算法必须保证模型从后向前的次序,当出现重叠时会有问题。使用GPU中的Z-bufering可以很好的解决这个问题,但是他同样存在一些意外情况:首先由于z-buffering的位数限制,表示场景的范围有一定的限制(例如表示室外广阔的场景);另外,由于perspective divide带来了screen space的非线性的特点(例如近视点的精度较高,而远视点的精度较低)。
解决精确度一致性可以通过设置near clipping plane和far clipping plane实现。
ATI公司的三种Z-buffering技术:Z Compression,Hierarchical Z和Fast Z
原创粉丝点击