图形学学习总结(六)—背面消除
物体从局部坐标最后渲染到屏幕上我们已经基本了解了,但是在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);
}
}