v4vendeta's homepage

Home | About | Contacts | Blogs| Others

光栅化软渲染器_光栅化

bresenham直线生成算法

bresenham是一种高效的直线绘制的算法,也是最常用的直线绘制算法

给定两个点 A(x1、y1)和 B(x2、y2)的坐标。在像素的计算机屏幕上查找绘制线 AB 所需的所有中间点

算法步骤伪代码

计算 计算直线的斜率

直线生成算法用于绘制线框图

光栅化

扫描线算法

规定三角形的三个顶点v1,v2,v3的y值y1<y2<y3,我们将三角形分解成上下两部分,根据插值计算出新的点v4

以三角形的长边为底,一行一行向上/向下绘制像素点。

缺点:插值的精度损失导致的多个三角形间存在接缝的问题

重心坐标算法

计算三角形的bounding box

遍历bounding box内的像素,渲染出在三角形内部的点

重心坐标

已知三角形的三个顶点$v1,v2,v3$

用$\alpha ·v1+\beta·v2+\gamma·v3,\alpha+\beta+\gamma=1$可以表示三角形平面上任意点 如果做约束$\alpha,\beta,\gamma\in[0,1]$,上式可以表示三角形内部的任意点

反过来,如果给定任意点$(x,y)$,我们可以写出它的重心坐标(数学推导)

如果重心坐标$\alpha,\beta,\gamma$满足$\alpha,\beta,\gamma\in[0,1]$那么就可以判断点在三角形内

深度测试

经过光栅化的过程,我们已经可以绘制出基本的图形了,但仍有一个问题需要解决,后绘制的图形总是在先绘制的图形前面,也就是我们总能看到最后绘制的图形,这与现实是不相符的,我们用一个数组记录屏幕上每个像素的深度值

由点的重心坐标,对三角形三个点的z值插值

如果$zp$值小于深度缓冲中相应位置存储的$z$值,将$zp$写入深度缓冲,并绘制出像素的颜色

reference:

https://learnopengl-cn.github.io/

《Real-Time Rendering Fourth Edition》

.. ... ...