Posts Tagged ‘万恶的数学’
好久没玩PSP编程,昨天这学期的图形学结课,昨晚也把最后的作业submit了,于是这学期也就差不多结束了。虽然课时不多,但是图形学课的作业设计得确实不错,首先实现了完整的图形渲染流水线(矩阵变换->相机变换->透视映射变换->三角形光栅化与纹理映射),然后做了一些简单的光线追踪算法(反射、硬阴影与折射)。我打算把这学期在PC上实现的这些算法应用到PSP上面,这样就相当于做一个最简单的3D图形引擎了,以后可以在这个基础上再做扩展。
上次简单研究了下SDK自带的GU函数库,现在不打算用了,既然有了VRAM的指针,那干脆就从最底层开始玩吧!而且,为了提高编程效率,我决定在C的基础上加入C++的代码,不然光是C不支持运算符重载这一点就会让向量和矩阵运算痛苦万分的。另外不得不说的是,PSP编程不能直接使用C函数库,于是连sin、cos这种函数都浮云了,需要自己实现,sigh。
Barycentric Coordinates算法,即“重心坐标系插值算法”,本质是通过计算2D空间中任意一点到三角形三边的相对距离,来确定点是否在三角形内部。这个算法比起常见的扫描线插值算法,编程更容易(不需要判断三角形类型),而且具有更高的精确度(避免了计算斜率时带来的误差)。Barycentric Coordinates算法不但可以判断像素点是否需要绘制,而且可以直接插值计算出需要绘制的像素点的颜色或纹理映射坐标。不过,我不知道计算量是否要比扫描线插值算法大,希望有感兴趣的朋友能比较一下。
本文首先简单讲一下算法的原理,然后给出代码实现。
在3D渲染管线的透视变换(prospective transformation)中,远近裁剪面的取值不同,会对变换的结果造成一定的影响,主要体现在变换后z值的密度上。这次图形学作业有关于这方面的一道讨论题,顺便就把我的分析结果放上来吧。