0%

软光栅渲染器

软光栅渲染器是一个使用软件模拟GPU硬件图形渲染流水线的项目,在Viual Studio 2017上,用C++语言实现了:Input Assembler、Vertex Shader、Primitive Assembler、Rasterizer、Pixel Shader、Output-Merger这样的一个图形渲染流水线。模拟经典的图形渲染流水线最基础的部分。

本项目参考自:软渲染器Soft Renderer:光栅化篇 | YangWC's Blog

项目主要的一个架构就是图形界面+渲染逻辑。图形界面简单调用了Qt来实现,主要是利用Qt的画布来实现图形显示。另外一个重要功能是渲染逻辑,放在了一个类:RenderLoop中来实现,渲染逻辑主要包含三大部分:

  1. 清除后帧缓存;

  2. 绘制;

    1. 读取obj模型数据,涉及到了vertex buffer和index buffer两个数据结构;

    2. 将顶点组装成三角形片元,也就是图元组装阶段;

    3. 送入顶点着色器;

      1. 执行MVP变换;模型空间、观察空间、投影空间。

        涉及到了三个矩阵:

        World:分别决定物体在空间中的位置、朝向、缩放;变换到世界空间;

        View:决定摄像机的位置,计算以摄像机为原点的物体坐标;变换到视图空间;

        Project:正交投影或者透视投影;变换到裁剪空间;

      2. Gouraud着色(若选择Gouraud着色);

    4. 进行背面剔除;

    5. 进行几何裁剪;

    6. 执行透视除法,转化到标准设备空间,[0,1]。

    7. 进行视口变换,将图形从标准设备屏幕大小转化为真实的显示尺寸;

    8. 光栅化;

      1. Breshenham
      2. Edge-Walking
    9. 像素着色器;

      1. 纹理;
      2. Blin-Phong着色(若选择Blin-Phong着色);
    10. 进行深度判断,输出合并阶段;

    11. 之后交换前后缓存,显示图形。

  3. 交换前后帧缓存。

进行透视插值矫正的原因是:

透视投影时,物体在三维空间中等距离的点,投影到二维平面上后,有可能不再等距离。为了正确显示纹理,需要进行透视插值矫正。计算表明插值/z与插值点的位置线性相关。