软光栅渲染器是一个使用软件模拟GPU硬件图形渲染流水线的项目,在Viual Studio 2017上,用C++语言实现了:Input Assembler、Vertex Shader、Primitive Assembler、Rasterizer、Pixel Shader、Output-Merger这样的一个图形渲染流水线。模拟经典的图形渲染流水线最基础的部分。
本项目参考自:软渲染器Soft Renderer:光栅化篇 | YangWC's Blog
项目主要的一个架构就是图形界面+渲染逻辑。图形界面简单调用了Qt来实现,主要是利用Qt的画布来实现图形显示。另外一个重要功能是渲染逻辑,放在了一个类:RenderLoop中来实现,渲染逻辑主要包含三大部分:
清除后帧缓存;
绘制;
读取obj模型数据,涉及到了vertex buffer和index buffer两个数据结构;
将顶点组装成三角形片元,也就是图元组装阶段;
送入顶点着色器;
执行MVP变换;模型空间、观察空间、投影空间。
涉及到了三个矩阵:
World:分别决定物体在空间中的位置、朝向、缩放;变换到世界空间;
View:决定摄像机的位置,计算以摄像机为原点的物体坐标;变换到视图空间;
Project:正交投影或者透视投影;变换到裁剪空间;
Gouraud着色(若选择Gouraud着色);
进行背面剔除;
进行几何裁剪;
执行透视除法,转化到标准设备空间,[0,1]。
进行视口变换,将图形从标准设备屏幕大小转化为真实的显示尺寸;
光栅化;
- Breshenham
- Edge-Walking
像素着色器;
- 纹理;
- Blin-Phong着色(若选择Blin-Phong着色);
进行深度判断,输出合并阶段;
之后交换前后缓存,显示图形。
交换前后帧缓存。
进行透视插值矫正的原因是:
透视投影时,物体在三维空间中等距离的点,投影到二维平面上后,有可能不再等距离。为了正确显示纹理,需要进行透视插值矫正。计算表明插值/z与插值点的位置线性相关。