图形学学习总结(六)—背面消除

物体从局部坐标最后渲染到屏幕上我们已经基本了解了,但是在3d流水线中还有一些操作是需要的,就是物体的背面消除和剔除,可以避免大量无用的运算

背面消除

物体的背面消除很简单,在世界坐标中进行,即相机坐标转换操作之前,物体的面法量与面到视点的向量的夹角不超过90度时,这个面就是对视点可见的,如图:

图形学学习总结(六)—背面消除

根据图示我们可知,当面上顶点到视点的向量与面法线的余弦大于0时,该面是可见的。

背面消除源码:

//物体背面消除
void Object3D::RemoveObjBackface(POINT4D_PTR cam_pos)
{
	//计算多边形面法线
	VECTOR4D u, v, n;
	//指向视点的向量
	VECTOR4D view;
 
	for (int poly = 0; poly < this->num_polys; poly++)
	{
		POLY4DV1_PTR curpoly = &this->plist[poly];
		//取顶点
		int vertex_idx1 = curpoly->vert[0];
		int vertex_idx2 = curpoly->vert[1];
		int vertex_idx3 = curpoly->vert[2];
		//取u和v
		VECTOR4D_SUB(&curpoly->vlist[vertex_idx2], &curpoly->vlist[vertex_idx1], &u);
		VECTOR4D_SUB(&curpoly->vlist[vertex_idx3], &curpoly->vlist[vertex_idx2], &v);
		//求法线n
		VECTOR4D_CROSS(&u, &v, &n);
		//指向视点
		VECTOR4D_SUB(cam_pos, &curpoly->vlist[vertex_idx1], &view);
		//计算点积
		float dp = VECTOR4D_DOT(&n, &view);
		if (dp <= 0.0)
			SET_BIT(curpoly->state, POLY4DV1_STATE_BACKFACE);
	}
}