OpenGL.光栅化就是扫描转换

本文详细介绍了OpenGL中的光栅化过程,从线段的DDA算法和Bresenham算法,到多边形的扫描转换,包括内外点检测的奇偶检测法和环绕数法,以及填充算法如种子填充法和扫描线法。通过这些方法,将几何形状转换为离散的像素点,实现数学表达到像素表达的转化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 进一步说,对于一些几何,我们还只是有数学的抽象表达,但实际的图像确实离散的像素点
  • 所以光栅化其实就是把数学表达转化为像素表达,得到的数据我们称为“片段”,用于进一步的片段处理

线段的扫描转换

  • 对于线段来说,其数学描述只是两个顶点(x1,y1)和(x2,y2)
  • 这两个顶点自然可以很容易的对应两个像素点,但这两个顶点的连线也应该对应着若干个像素点才行
  • 这里默认像素位置均为整数,尽管也有不是整数的情况
DDA算法
  • 一个很显然的思路,就是求出线段的斜率,然后递增x,y每次加上斜率并取整
  • 设x1 < x2
DDA(int x1,int y1,int x2,int y2){
    int x = 0;
    double y = y1, m = (y2-y1)/(double)(x2-x1);
    for(x=x1;x<=x2;++x){
        y += m;
        output(x,(int)y);
    }
}
  • 但是这样写仅对于 0<=|m|<=1 的情况才能得到连续的像素位置
  • 对于 |m|>1 的情况就 递增y 就行了呗
Bresenham算法
  • DDA涉及了大量的浮点运算,这样很耗时间的
  • 如果能有完全是整数运算的就好了,那肯定是快很多啊
  • 分析一下线段的转换,只考虑 0 < m < 1的情况,其余的对称
    Bresenham1

  • 对于已经确定的点p,其下一个要选择的点

    • 如果是绿色线,则更靠近m,则选择m
    • 如果是红色线,则更靠近n,则选择n
  • 就是说,下一个选择只有两个选择,如何选择就看线段更靠近那个点
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值