深度探索DxFramework 10-4
请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com
#第10章 进入三维的世界 4
10.5.4.变换包围盒 变换包围盒,除了变换包围盒顶点的坐标之外,还得变换包围盒的面的法线向量。如果有一个转换矩阵M对平面的各点进行变换,那么这个平面的法线向量的正确变换矩阵应该G为对各点进行变换的矩阵的逆转置矩阵(inverse-transpose matrix)。所以有下列代码:
void C_BoundingBox::TransformBoundingBox(D3DXMATRIX* p_TransformMatrix) { D3DXMATRIX tempMatrix; //取得转换矩阵的逆矩阵,然后再将其转置 D3DXMatrixInverse(&tempMatrix, NULL, p_TransformMatrix); D3DXMatrixTranspose(&tempMatrix, &tempMatrix); int i; //变换包围盒的各个角顶点 for (i = 0; i < 8; i++) { D3DXVec3TransformCoord(&point[i], &point[i], p_TransformMatrix); } //实质上就是对平面的法线进行变换 for (i = 0; i < 6; i++) { D3DXPlaneTransform(&plane[i], &plane[i], &tempMatrix); } } 10.6 观察世界的窗口,摄像机类 10.6.1 视口设置 10.6.2 雾化效果 雾化是指在三维图形程序中模拟真实世界中的云雾,水蒸汽,灰尘等大气效果。从生活经验我们可以得知,在雾气比较严重的地方,距离观察点近的地方物体比较清晰,远处的物体则随着它离观察点的距离的增加而变得越来越模糊。通过使用雾化效果将能增加三维场景的真实感。在Direct3D中,雾化效果是根据当前景物的颜色和雾的颜色,与随着物体和观察点距离增大而衰减的混合因子(fog blending factor)混合实现的。这里的术语“观察点”,就是当前摄像机在世界坐标中的位置,或者说,观察坐标系的原点在世界坐标系下的位置。当距离景物距离观察点越远的时候,混合因子就越小,场景中物体的颜色就越小,而雾的颜色就越大,景物就会变得越模糊。Direct3D渲染流水线计算雾化效果的公式如下:
COLOR = f*COLORscene + (1-f)*COLORfog
其中COLOR表示最终经过了雾化处理的颜色。COLORscene表示景物原有的颜,色。COLORfog表示雾的颜色,这颜色是由应用程序自定义的。f表示雾化的混合因子。Direct3D有两种雾化处理方法:顶点雾化(vertex fogging)和像素雾化(pixel fogging)。顶点雾化在渲染流水线中的顶点变换和光照阶段实现。基本原理是根据多边形的每个顶点与观察点的距离计算出每个顶点的雾化程度。然后根据计算结果,针对每个多边形进行插值计算。像素雾化则在像素绘制阶段实现,它通过判断每个像素对于观察点的深度值进行雾化效果计算。像素雾化与顶点雾化相比,计算结果更为精确,但也将消耗更多的系统性能。
由上面的雾化计算公式可以看到:雾化效果是物体可见程度的反映。雾化效果计算公式算出的结果值越小就表示景物的可见度就越低。而最终的计算结果 除了取决于景物颜色和雾的颜色之外,还取决于雾化混合因子的取值。Direct3D提供了一些枚举值表示几种雾化因子的计算方式。如下: