ZBufeer算法
ZBuffer是像空間消隱算法,首先在三維空間中記住物體的深度信息,將物體投影到二維平面后,用一個全局的緩沖器存儲每個像素對應的Z值,這樣只繪制距離相機最近的表面。
關鍵是要有一個緩沖器,然后是計算每個像素對應的Z值,這個Z值是在相機坐標系下的距離。
坐標轉換
緩沖器的初始化和釋放
void CZBuffer::initZdeep(int width, int height, int deepth) {Zdeep = new double* [width];for (int i = 0; i < width; i++){Zdeep[i] = new double[height];for (int j = 0; j < height; j++)Zdeep[i][j] = deepth;} }void CZBuffer::releaseZdeep(int width) {for (int i = 0; i < width; i++)delete[] Zdeep[i];if (Zdeep != NULL)delete Zdeep; }根據Z值和緩沖器中的存儲值判斷是否要填充像素
void CZBuffer::drawFaceZ(int ScreenWidth, int ScreenHeight, CDC* pDC) {CBucketZ* currentCBucket = this->PCBucket;//一條掃描線一條掃描線的解決while ((currentCBucket != NULL)){CAETZ* currentpET = currentCBucket->pET;while ((currentpET != NULL) && (currentpET->pNext != NULL)){CPoint3D tempStart3D(currentpET->x, currentpET->y, currentpET->z, currentpET->rgb);CPoint3D tempEnd3D(currentpET->pNext->x, currentpET->pNext->y, currentpET->pNext->z, currentpET->pNext->rgb);//CPoint3D currentpoint3D = tempEnd3D;//沿著y掃描線,x從小到大的坐標,逐個像素給屏幕像素填充顏色for (int ix = tempStart3D.x; ix <= tempEnd3D.x; ix++){//計算像素坐標的z值double z;if (tempEnd3D.x != tempStart3D.x){z = (tempEnd3D.z - tempStart3D.z) * (ix - tempStart3D.x) / (tempEnd3D.x - tempStart3D.x)+ tempStart3D.z;}else{tempEnd3D.z > tempStart3D.z ? z = tempStart3D.z : z = tempEnd3D.z;}//比較Zdeep中的Zbuffelint iys = (int)(currentpET->y + ScreenHeight / 2);//將屏幕坐標系中所有點平移到第一象限中int ixs = (int)(ix + ScreenWidth / 2);if (z < Zdeep[ixs][iys])//ix iy 的值可能變化{Zdeep[ixs][iys] = z;//計算像素值CRGB tempRgb;if (tempEnd3D.x != tempStart3D.x){/*CRGB temp((tempEnd3D.rgb - tempStart3D.rgb) * (ix - tempStart3D.x) / (tempEnd3D.x - tempStart3D.x)+ tempStart3D.rgb);*/double r = (ix - tempStart3D.x) / (tempEnd3D.x - tempStart3D.x);tempRgb = r * tempEnd3D.rgb + (1-r)* tempStart3D.rgb;}elsetempRgb = tempStart3D.rgb;//設置屏幕像素顏色pDC->SetPixelV(ix, currentpET->y, RGB(tempRgb.red, tempRgb.green, tempRgb.blue));}}currentpET = currentpET->pNext;}currentCBucket = currentCBucket->pNext;} }總結
- 上一篇: 边表法
- 下一篇: VSC++ 常量中出现符号