コード例 #1
0
    //画面
    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);
    }
コード例 #2
0
 //计算三角形三个顶点的裁剪空间的坐标
 void InitTriangleClipSpacePos(HTriangle Triangle)
 {
     //三角形的模型坐标乘以MVP矩阵 得到投影坐标(相机空间)
     Triangle.p1InClipSpace = Triangle.p1InObjectSpace.Copy();
     Triangle.p2InClipSpace = Triangle.p2InObjectSpace.Copy();
     Triangle.p3InClipSpace = Triangle.p3InObjectSpace.Copy();
 }
コード例 #3
0
 //计算三角形三个顶点的裁剪空间的坐标
 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;
 }
コード例 #4
0
 //检查三角形是否在裁剪
 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);
 }
コード例 #5
0
    //画三角形 传入的
    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]);
        }
    }
コード例 #6
0
 //深度Z初始化顶点插值信息
 void InitTriangleInterpn(HTriangle Triangle)
 {
     Triangle.p1InScreenSpace.Initrhw();
     Triangle.p2InScreenSpace.Initrhw();
     Triangle.p3InScreenSpace.Initrhw();
 }