1. 程式人生 > >圖形學學習總結(六)—背面消除

圖形學學習總結(六)—背面消除

物體從區域性座標最後渲染到螢幕上我們已經基本瞭解了,但是在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);
	}
}