# SoftRender **Repository Path**: mo-si/SoftRender ## Basic Information - **Project Name**: SoftRender - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-01-23 - **Last Updated**: 2022-03-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 软渲染器代码理解 Render1.h文件,整体可以分为4个部分:数学库,工具函数,位图类,渲染类。 数学库主要就是支持各种向量运算和矩阵运算。工具函数就是一些矩阵转换,颜色值的转换等。 主要的还是位图类(Bitmap)和渲染类(RenderHelp)。 ### Bitmap 主要的功能就是加载位图文件和生成位图文件。加载位图原理就是依据位图的格式,首先读取对应的头部,得知该位图的信息,然后依据这些信息来读取接下来的图片内容信息,也就是每一个像素对应的颜色值。位图的生成就是就是逆过程。这一部分就是文件的读写操作,知道对应的格式,照着做就可以了。 这个类中还有一些比较重要的函数:光栅化一条线(DrawLine),纹理采样的时候双线性插值。 DrawLine很简单,就是确定了两个顶点后,确定在这两个点之间,对应的哪些像素需要上色。 双线性插值:将uv坐标映射到对应图片的坐标,然后在这个点的四周采样4个点的颜色,在根据双线性插值的公式,按一定的权重将4个点的颜色混合起来。这里主要涉及到将浮点数转换为整数来达到加速的效果。代码里面的一系列位运算就和这个优化有关系。 ### RenderHelp 该类的主要函数就是DrawPrimitive(),首先先用顶点着色器,来设置顶点的各种属性:颜色值,uv值,法线等,在将三角形的顶点经过mvp矩阵进行转换,此时三角形的顶点位于裁剪空间,接着就是对三角形进行裁剪(这里的做法是如果其中一个点超过了范围,就直接丢弃整个三角形),完成裁剪后就进行透视除法,将三角形的顶点坐标转换到NDC坐标空间,最后在将三角形的顶点坐标转换到屏幕空间,接着计算包围盒。遍历这个包围盒中的每一个像素,判断该像素是否在三角形内(通过叉乘来实现)。接着计算在三角形内每一个像素的重心坐标,通过重心坐标来进行插值。这里要注意的是,由于进行投影变换的时候不是线性变换,因此,这里不能简单的通过重心坐标来进行插值,需要进行透视矫正。在进行插值之前还需要进行深度测试,将当前像素的深度值和记录在深度缓冲上的深度值进行对比。最后就是将插值好的数据,传进像素着色器,计算出最后的颜色值。 ### 感悟 上面整个光栅化过程,就是将一个模型的顶点数据映射到屏幕上,并对三角形面内的点进行插值计算。最终颜色是什么还是由shader来决定的,也就是前面的部分处理数据,最后将数据提供给shader来处理,得到最终的颜色。