TinyRenderer第三课是利用深度缓冲区在屏幕上绘制像素,前置知识包括:
- 知道什么是深度缓冲区(Z-buffer),以及它的作用和原理;
- 熟悉第一节和第二节的知识;
- 熟悉屏幕坐标系和纹理坐标系的概念和转换关系;
- 屏幕坐标系是指计算机显示器的坐标系,以左上角为原点,向右为X轴正方向,向下为Y轴正方向。它通常使用像素值来表示坐标位置。
- 纹理坐标系是指用于纹理映射的坐标系,它是一个二维坐标系,通常采用(u,v)表示纹理坐标,其中u和v的值都在[0,1]之间。在3D图形中,纹理坐标是用来对3D模型表面进行纹理映射的,而在2D图形中,纹理坐标可以用来对图像进行拉伸、缩放和扭曲等操作。
- 屏幕坐标系和纹理坐标系之间的转换关系是通过纹理映射矩阵实现的。纹理映射矩阵可以将纹理坐标系中的纹理坐标转换为屏幕坐标系中的像素坐标,从而实现将纹理贴图到3D模型表面或2D图像上的目的。通常,纹理映射矩阵包括平移、旋转、缩放等变换操作,用于对纹理坐标进行变换。
- 知道如何读取和操作像素数据;
- 知道如何使用TGA库的API即可。
- 了解简单的插值和采样算法;
- 插值算法通常用于将离散数据点的值,推算出中间位置的值,从而使得数据连续化,进而可以应用到更多的图像处理和渲染操作中。插值算法可以有不同的实现方式,其中最常见的包括线性插值和双线性插值。
- 采样算法是指在连续值的定义域上,选取有限个点,然后通过这些点来推断函数在整个区间上的取值。在图像处理中,采样算法常用于将连续的图像数据转换为离散的图像数据。例如,我们将一张分辨率为 1920x1080 的连续图像转换为分辨率为 640x360 的离散图像时,就需要对连续图像进行采样。
- 常用的采样算法包括最近邻插值、双线性插值、双立方插值等。最近邻插值是指将目标像素的颜色值设置为最接近它的源像素的颜色值。这种方法计算简单,但在图像放大时会产生锯齿状的伪影。双线性插值是指通过对周围 4 个像素的加权平均来计算目标像素的颜色值。这种方法可以在一定程度上避免锯齿伪影,但处理速度较慢。双立方插值是指通过对周围 16 个像素的加权平均来计算目标像素的颜色值。这种方法可以提供更高的图像质量,但处理速度更慢。
- 选择适当的采样算法取决于具体应用场景和需求。
- 三角形重心性质和计算方法;
- 向量的叉乘。
如果对这些知识点不熟悉,可以先学习相关的基础知识再进行深入学习。
TinyRenderer第三课主要介绍了深度测试和深度缓冲区的实现。在渲染管线的过程中,深度测试是在光栅化之后的一个重要步骤。它会比较当前像素的深度值与深度缓冲区中对应像素的深度值,如果当前像素的深度值更小,则更新深度缓冲区,并将像素渲染到屏幕上。
深度缓冲区是一个二维数组,用于保存屏幕上每个像素点的深度值,初始值为无穷大。
在每次进行深度测试时,将当前像素的深度值与深度缓冲区中对应像素的深度值比较,如果当前像素的深度值小于深度缓冲区中的值,则将当前像素的深度值写入深度缓冲区中,并将当前像素渲染到屏幕上。这样可以保证前面绘制的像素不会被后面的像素覆盖掉。
计算三角形内给定点P的重心[175503222023]
画三角形的重心算法[175703222023]
源码[185003222023]