Posts Tagged ‘3D图形学’

裁剪(clipping)和背面剔除(back-face culling)夹在投影变换和光栅化两步中间,主要负责剔除超出屏幕坐标系的顶点和背向摄像机的三角形,减小渲染压力。裁剪还有另一个重要用途就是剪掉投影变换前z坐标小于0的点,以免出现诡异的结果以及除零错误。

Read the rest of this entry »

视变换(viewing transform)和投影变换(perspective transform)是3D渲染管线中不可缺少的两个重要变换,前者将顶点坐标由世界坐标系变换到观察坐标系(又称相机坐标系),后者将顶点坐标由观察坐标系变换到屏幕坐标系,之后就是光栅化的步骤了。

关于这两种变换的原理就不多讲,随便找一本图形学的书上面都会有。具体实现也很简单,就是根据参数生成两个矩阵,然后和顶点向量相乘就行了。这里均采用列向量(即P = M2 * M1 * P0,变换顺序是先M1后M2)和右手坐标系。

Read the rest of this entry »

三角形光栅化是传统图形渲染管线的最后一步,也是最重要的一步,需要插值计算出三角形内部每个像素的颜色值,并根据z值进行深度测试以决定像素的远近关系。

光栅化的算法用掉了我好几天的时间,一开始是用Barycentric Coordinates算法进行的,结果帧率只有杯具的3,想办法把很多的乘除法改成了加减法还是没有起色,看来浮点数运算还是坑爹啊,于是决定用经典的Bresenham算法了。但是Bresenham算法是用来画线的,对于光栅化三角形来说还要考虑三角形内部针对顶点颜色的插值,于是我将其变成了Bresenham插值算法……

Read the rest of this entry »

纹理映射是光栅化过程中重要的一步。由于众所周知的原因,透视投影是非线性变换,因此顶点原始的uv坐标在变换之后不可以直接使用线性插值计算新的uv坐标。例如,矩形四个顶点的uv坐标分别为(0,0),(0,1),(1,0),(1,1),矩形中点的uv坐标按照线性插值的话等于(0.5,0.5),但是若矩形不是正对观察点的话,透视变换后中点的uv坐标就不一定等于(0.5,0.5)。

例如:

纹理贴图:

线性插值结果->错误:

透视矫正插值结果->正确:

Read the rest of this entry »

在3D渲染管线的透视变换(prospective transformation)中,远近裁剪面的取值不同,会对变换的结果造成一定的影响,主要体现在变换后z值的密度上。这次图形学作业有关于这方面的一道讨论题,顺便就把我的分析结果放上来吧。

Read the rest of this entry »

网上有很多“绕任意轴的旋转矩阵”的文章,不过要么限定了所谓“任意轴”必须经过原点,要么只有推导没有结论。最近在完成图形学作业的时候正好用到了这个算法,通过Google娘找到了一篇名叫Glenn Murray的老外的文章,于是直接拿来用了。以下直接放结论,详细推导过程可以参考原文[1]。

算法的输入参数分别是旋转轴上的任意一点P(a,b,c),单位化后的旋转轴方向向量V(u,v,w),旋转角度θ。

Read the rest of this entry »

World Line
Time Machine
Online Tools