圖形學學習總結(六)—背面消除
阿新 • • 發佈:2018-12-21
物體從區域性座標最後渲染到螢幕上我們已經基本瞭解了,但是在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); } }