原来平时玩的glsl和hlsl都是基于gpu寄存器和指令集之上的虚拟机里跑的,而这些寄存器和指令集的不同,也决定了shader的版本不同。
而我们平时的数据,是这一的一个方向。从硬盘disk中读取到Memory中,也就是我们平时说的内存,这时候,显卡有2种办法得到这些数据,一种是直接从memory中传入到常量寄存器中,还有一种就是先从cpuMemory到GpuMemory也就是从内存到现存,然后再从现存到gpuCaches最后到了Gpu寄存器。
这里还要顺便说下zbuffer,我们都知道zbuffer是视点到每个像素的距离,范围是0-1,但z值并非真正的笛卡尔坐标系中的距离,其实是一种相对度量。然后查到是这个公式:
Z=(1<<n)*((a*z+b)/z) a=f/(f-n) b=(f*n)/(n-f)
这里的f是视点到远截面的距离,n是视点到近截面的距离,z是视点到顶点的空间距离,n表示精度。
也就是说,z的值不一定是线性变化的。比如在透视投影时候,z就不是。同一图元内部点的事均匀分布的。因为在光栅化的时候,并不是对每个像素的信息都是已知的。而是已知部分,对其余部分进行插值计算的。单并不是每次的线性插值计算,都可以计算出准确的值,比如有种情况就是与视点非垂直或平行,这样的话,越远的点,差异越明显,所以有时候我们在游戏中看到一些面片纠结在一起,就是这个原因引起的。
为了避免这种情况的发生。设置近截面和远截面的时候,我们要尽量让两者的倍数差小于1k,其实,解决这个问题最直接的办法还是提高近截面到视点的距离。如果你不需要显示近处的物体的话这确实是个不错的办法。一般我们的显卡支持z值的精度是16位,24位,32位这几个,而这个精度越大,也就越能缓解两个非常相近的面随机遮挡的问题。