//画面 void DrawPlane(int p1_index, int p2_index, int p3_index, int p4_index) { HVertex p1 = mesh[p1_index]; HVertex p2 = mesh[p2_index]; HVertex p3 = mesh[p3_index]; HVertex p4 = mesh[p4_index]; //纹理绘制到这个面上面 p1.uv.u = 0; p1.uv.v = 0; p2.uv.u = 0; p2.uv.v = 1; p3.uv.u = 1; p3.uv.v = 1; p4.uv.u = 1; p4.uv.v = 0; HTriangle T1 = new HTriangle(); T1.p1InObjectSpace = p1; T1.p2InObjectSpace = p2; T1.p3InObjectSpace = p3; DrawTriangle(T1); HTriangle T2 = new HTriangle(); T2.p1InObjectSpace = p3; T2.p2InObjectSpace = p4; T2.p3InObjectSpace = p1; DrawTriangle(T2); }
//计算三角形三个顶点的裁剪空间的坐标 void InitTriangleClipSpacePos(HTriangle Triangle) { //三角形的模型坐标乘以MVP矩阵 得到投影坐标(相机空间) Triangle.p1InClipSpace = Triangle.p1InObjectSpace.Copy(); Triangle.p2InClipSpace = Triangle.p2InObjectSpace.Copy(); Triangle.p3InClipSpace = Triangle.p3InObjectSpace.Copy(); }
//计算三角形三个顶点的裁剪空间的坐标 void CalTriangleScreenSpacePos(HTriangle Triangle) { //顶点的其他数据 Triangle.p1InScreenSpace = Triangle.p1InObjectSpace.Copy(); Triangle.p2InScreenSpace = Triangle.p2InObjectSpace.Copy(); Triangle.p3InScreenSpace = Triangle.p3InObjectSpace.Copy(); //归一化然后乘宽高 Triangle.p1InScreenSpace.pos = Transform.HomogenizeToScreenCoord(Triangle.p1InClipSpace.pos); Triangle.p2InScreenSpace.pos = Transform.HomogenizeToScreenCoord(Triangle.p2InClipSpace.pos); Triangle.p3InScreenSpace.pos = Transform.HomogenizeToScreenCoord(Triangle.p3InClipSpace.pos); //保存Z信息 Triangle.p1InScreenSpace.pos.w = Triangle.p1InClipSpace.pos.w; Triangle.p2InScreenSpace.pos.w = Triangle.p2InClipSpace.pos.w; Triangle.p3InScreenSpace.pos.w = Triangle.p3InClipSpace.pos.w; }
//检查三角形是否在裁剪 bool CheckTriangleInCVV(HTriangle Triangle) { if (Triangle.p1InClipSpace.pos.CheckInCVV() == false) { return(false); } if (Triangle.p2InClipSpace.pos.CheckInCVV() == false) { return(false); } if (Triangle.p3InClipSpace.pos.CheckInCVV() == false) { return(false); } return(true); }
//画三角形 传入的 void DrawTriangle(HTriangle Triangle) { //1、更新立方体的MVP矩阵 UpdateMVPMat(); //2.1、初始化裁剪空间坐标 InitTriangleClipSpacePos(Triangle); //2.2、 顶点着色器 Triangle.p1InClipSpace.pos = vert(new a2v(Triangle.p1InObjectSpace.pos)).pos; Triangle.p2InClipSpace.pos = vert(new a2v(Triangle.p2InObjectSpace.pos)).pos; Triangle.p3InClipSpace.pos = vert(new a2v(Triangle.p3InObjectSpace.pos)).pos; //曲面细分着色器【TODO】 //几何着色器【TODO】 //3、用裁剪空间裁剪三角形(这里比较暴力 一个点不在CVV则剔除) if (CheckTriangleInCVV(Triangle) == false) { return; } //4、归一化然后计算得到屏幕坐标 CalTriangleScreenSpacePos(Triangle); //5、插值初始化 InitTriangleInterpn(Triangle); //6、屏幕坐标的三角形拆分三角形为0-2个梯形,并且返回可用梯形数量 List <HTrapezoid> traps = new List <HTrapezoid>(); traps.Add(new HTrapezoid()); traps.Add(new HTrapezoid()); int n = Triangle.CalculateTrap(traps); //7、梯形扫描 绘制梯形 if (n >= 1) { DrawTrap(traps[0]); } if (n >= 2) { DrawTrap(traps[1]); } }
//深度Z初始化顶点插值信息 void InitTriangleInterpn(HTriangle Triangle) { Triangle.p1InScreenSpace.Initrhw(); Triangle.p2InScreenSpace.Initrhw(); Triangle.p3InScreenSpace.Initrhw(); }