目录
Fragment像素如何差值各种数据(顶点颜色、UV、Z-Buffer)
灯光、摄像机的坐标空间
假设某一个灯光、摄像机原始的坐标空间为(u、v、w),经过平移矩阵和旋转矩阵相乘后,这个灯光或摄像机的坐标空间为(u' ,v' ,w')。此时因为只有平移和旋转,所以u' ,v' ,w' 还是单位向量。此时有一个顶点A(x,y,z),则A顶点在灯光或摄像机坐标空间的位置(x' ,y' ,z')=(u' ,v' ,w')(x,y,z)= u' x + v’y + w'z 。u'x=|u'||x|cosa,又因u'是单位向量,所以u'x=|x|cosa,即x在向量u'上的投影
面法线、顶点法线和像素法线的确定
面法线:可由面的两条边叉乘,得到的向量就是面的法向量
顶点法线: 一个顶点会被几个不同的面占用,所以顶点法线可由面法线求和再平均得到
像素法线:由顶点法线差值得到
光栅化
判断屏幕上任一点像素是否在三角形内,可通过三条边与顶点到P点的向量依次做叉积,如果叉积结果为同方向向量,则像素在三角形内。
//实际中不需要遍历所有像素,只要计算三角形的AABB包围盒包含的像素就可以 for ( int x = 0; x < xmax; ++X) for ( int y = 0; y < ymax; ++y) image[x][y] = inside(tri, x+0.5, y+0.5); //+0.5代表像素中心点
Fragment像素如何差值各种数据(顶点颜色、UV、Z-Buffer)
Fragment像素可根据自身二维位置坐标算出自身在三角形内的重心坐标系数,然后使用这个系数乘以三角形三个顶点的各种数据(例如UV,顶点颜色,法线等),从而得到自身的差值。
注意:由于经过投影后三角形的形状可能会改变,此时如果是计算和三维相关的数据(例如深度)的差值,使用三角形顶点二维坐标计算的重心坐标系数是不准确的。这是应该将该Fragment像素和三角形顶点由屏幕坐标转换为世界空间坐标,然后求该Fragment像素的重心坐标系数,然后使用该系数乘以三个顶点的深度值,得到深度差值,最后返回该Fragment像素的深度值
Texture采样
Fragment像素根据UV值可以去采样texture,会遇到texture精度过高或者过低的情况
(1)Texture Magnification
当Pixel精度 > texel时,对texture采样会出现锯齿,此时,可以在texture上找到Pixel(下图中红点)周围的texel进行Bilinear Interpolation(此方法也可以用于恢复低分辨texture到高分辨率)
(2)Mipmap
针对texel精度高于Fragment像素精度这种情况,会出现摩尔纹,可使用mipmap避免
即当三角形很小时,光栅化后所分配的Fragment pixel很少,而此三角形UV对应的texel数量很多,造成采样不足。此时可根据相邻两个pixel中心之间所占texel个数(或距离)来选择所要采样的mipmap层数