为啥 ZBuffer要映射到0到1

简而言之,深度信息可以用来绘制物体的遮挡关系。计算阴影时,最简单的方法是对每一个光源建立一个shadow map来记录该光源能够照射到的像素,其实也就是把光源当成相机视点计算深度信息。收集了所有光源的shadow map后,在绘制时就可以知道各像素能被哪些光照到了。这些应该是OpenGL自带的最基础的渲染算法,事实上目前工业界与学术界运用比较广的是光线追踪。它能用来渲染极具真实感的场景。
■网友
【为啥 ZBuffer要映射到0到1】 这个信息用来保证前后不穿插...引擎绘制物体的顺序的时候不能保证在近处的物体A一定比在远处的物体B晚绘制,所以解决办法是绘制的时候比较+写入深度信息,如果当前像素的深度比我要绘制的近 那就不绘制了。。。
ps. 对半透明物体之类的会有另外处理
第二个问题你搞混了概念,像素位置要看在哪个空间的,而且这个信息是v2f的时候产生的

■网友
将坐标单位化(标准化)是为了便于处理!在图形学里面都会将3D空间中的数据转化到NDC(标准设备坐标系)中来进行处理,这样在处理的时候就不需要考虑你的屏幕有多大,你设定的视域体的范围啊这类因素,方便做一些比如裁剪之类的工作!
■网友
1.zbuffer用来记录屏幕每个像素的远近值,这个值是在归一化的裁剪空间中的坐标,用以比较来判断前后遮挡关系2.关于阴影,就是以光的视角去看去渲染场景,根据这时的前后遮挡来决定是不是阴影区,这时得到的是临时深度值,1中的是屏幕缓存。我们一般会将该临时值写入到RenderTexture供后续绘制时提取阴影信息3.关于用相对值而不是直接距离相机的z值。如1中讲到最终的深度值是在裁剪空间,因为最终渲染效果可能是多个相机从多个视角去渲染最后叠加出来的画面,跨越了相机。就比如阴影效果,先以光的视角渲染一遍,接着才以相机的视角渲染一遍。
■网友
1、假定摄像机前有A、B两个物体,A在前B在后(A比较靠近摄像机,部分挡住B)。先绘制B再绘制A的话,是不需要深度信息的。但是如果反过来,先绘制A再绘制B就需要深度信息来仲裁像素是否能写入颜色缓冲区。所以说如果需要绘制的物体是经过排序的,可以不依赖深度信息来绘制就能得到正确效果。(这里没考虑物体相交、半透明物体的情况)依赖深度信息进行绘制可以保证任何顺序绘制的结果的正确性。2、确实需要两块深度缓冲区。
■网友
想象一下,你要绘制三个物体。他们的先手顺序是不确定的。 但你绘制的时候可能都是一个顺序。 这时光栅化之后你怎么确定哪些像素在前哪些像素在后呢?因为光栅化到一个平面只需要xy的信息。所以需要同时计算Z来进行像素的前后的比较(不考虑透明物体)。计算阴影需要知道这个像素对应的实际世界坐标点是不是收到了光源的照射了。 光源产生的深度图和你的摄像机正常渲染产生的Zbuffer 是两个不同位置的产生的Zbuffer。有了光源的深度图, 只要把像素所代表的世界坐标转化到光源的本地坐标XL, YL, ZL,然后以XL, YL为坐标取出光源的深度图(一般叫做ShadowMap)中的Zshadow。对比Zshadow和ZL就可以知道当前像素是否受光照还是在阴影中。 另外z值在延迟渲染中也有很重要的作用,可以结合屏幕坐标结算处世界坐标。节省延迟渲染需要的通道。 当然Z的用法还有很多。学习了近一年的图形学,求指正。


    推荐阅读