这篇主要讲扫描转换方法光栅化2d三角形

之前我们已经完成了线段的绘制,而三角形其实3条线段的首尾相连,所以我们只要给出三个不在同一直线的顶点就能绘制三角形

一、完善画线算法

Bresenham算法是种相对高效的算法,但目前我项目中的这一算法在顶点x坐标或y坐标相同时还无法完成绘制。所以这一情况下,我选择DDA算法取代。
如下
 

void DrawLine(point_t v1, point_t v2, color_t c)
{
    if (v1.x == v2.x || v1.y == v2.y)
    {
        DrawLineDDA2d(v1, v2, c);
    }
    else
    {
        DrawLineBre(v1, v2, c);
    }
}

这样一来就完成了相对高效且完全通用的画线算法

二、用画线算法绘制三角形

算法很简单,就是绘制三条首尾相连的三角形

void DrawTriangle(point_t v1, point_t v2, point_t v3,color_t c)
{
    if (v1.x == v2.x&&v1.x == v3.x) return;
    if (v1.y == v2.y&&v1.y == v3.y) return;
    DrawLine(v1, v2,c);
    DrawLine(v2, v3,c);
    DrawLine(v3, v1,c);
}

接下来在重绘函数里测试代码

// 重绘函数
void myDisplay(void)
{
    glClear(GL_COLOR_BUFFER_BIT);     // 清屏幕 

    glBegin(GL_POINTS);
    point_t v1{ 10,15 };
    point_t v2{ 400,405 };
    point_t v3{ 100,405 };
    color_t c{ 1.0,1.0,0,1.0 };//黄色
    DrawTriangle(v1, v2, v3, c);
    glEnd();
    glFlush();                         // 将所有输出到显示屏上 
}

光栅渲染器(三)光栅化2D三角形_光栅渲染器

奇怪这个三角形怎么只有线段,好吧,我们需要填充三角形

三、通过扫描转换算法填充三角形

参考: https://blog.csdn.net/weixin_44350205/article/details/105937713