Foundations of 3D Computer Graphics_Chapter11_Depth
11.1 Visibility
In then physical world,if object A is in the front of object B,then the light from object B will be blocked by object A before reaching the camera.and it will not appear in the image(for example, the blue hexagon of figure 10.2).In the computer graphics,we need to model this computationally.
在物理世界,A在B的前面,来自B的光在到达相机之前会被会被B遮挡。
B不会出现图像上,在计算机图形学中,我们需要模拟这个计算过程。
有很多中方法可以确保对相机可见的物体出现在图像中。一种思想是根据三角形面片的深度进行排序,然后按照从后往前的方式进行绘制。这个方法的思想是在最前面的面片会遮挡后边的面片,从而产生正确的渲染结果。但是,这种所谓的画家方法同样也有一些难点,例如,一个唱场景中可能包含交叉的面片。也可能包含非交叉的面片。
另外一个非常常用的方法是光线投射,我们会计算场景的每个点,与投射光线最近的交点的点会被进行到下一级的渲染,这个方法会在20章进行讨论。
在基于光栅化的渲染引擎中,比如Opengl, 我们使用某种称作Z-buffer的机制进行可见性计算。在这个方法中,
三角形可以以任何顺序进行绘制。在帧缓存中,每个像素不仅存储着颜色信息,同时也存储着深度信息。当一个像素将要进行绘制时,首先与帧缓存的已经存在的深度进行比较,如果更小,则更新颜色及深度缓存,否则,放弃。
该方法能够较好的解决交叉三角形情况
其它的一些可见性计算,例如阴影贴图,光线追踪。
可见性计算时非常重要的,可以提前删除一些不可见的物体或者面片,减少绘制的计算量。
11.2 Basic Mathematical Model
这一部分主要完成投影矩阵的第三行的计算,其实在正常的投影矩阵计算是,应该包含该部分。
在OpenGL 中我们是使用z-buffer进行可见性计算,为了使用z-buffer,我们需要一个深度值,为了得到,
对于每一个在视空间的点,我们定义一个()在裁剪空间的的坐标。我们打算把Zn与深度缓存中的值做比较。
首先可以确认,Zn的值确实可以用作深度对比,
同时,我们来考虑把视坐标点通过投影矩阵转换到NDC的过程。通常情况下,这种变换既不是线性变换也不是仿射变换,我称之为3D投影变换,
下边的几段内容到11.3 不知道在讲什么
11.3 部分主要在将如何求解投影矩阵的两个参数,可是没看到推导过程,感觉是作者直接给你的结论,