本文主要介绍GAMES101课程作业1的框架以及对应的改进。
作业1的内容是完成一个基本的软渲染器,补充缺失的几个数学函数。作业本身很简单,但是我发现了可以优化改进的一个方向。课程原版的作业代码框架使用了OpenCV库来辅助展示渲染结果,但是作为一个小程序来说,OpenCV是一个过于重的库,因此我想把这个作业框架修改为更轻量的版本,尽量只依靠OpenGL和一个C++的数学库,以及必要的资源文件加载库来构成新的软渲染器。这个软渲染器有基本的渲染管线,并且希望可以实时展示正在渲染的图片,即使是当前帧渲染未完成的状态,避免程序阻塞。
不过多线程部分比较难,现在先考虑同步版本的软渲染器。我跟据GAME101作业搭建的渲染框架链接在文章最后,本篇文章先实现了一个最基本的框架,效果如下。
Screen-Shot-2022-07-01-at-22.21.39-PM
Screen-Shot-2022-07-01-at-22.21.31-PM
该框架运行的主体代码如下:

#include "renderer.h"

using namespace Rocket;

int main(int argv, char** argc) {
    RenderApp app;
    app.Initialize(1280, 720);

    int32_t width = 1280;
    int32_t height = 720;
    int32_t nrChannels = 4;

    SoftRasterizer rst(width, height);
    rst.ClearAll(BufferType::COLOR | BufferType::DEPTH);

    while(!app.ShouldClose()) {
        app.Tick();

        auto data = rst.FrameBuffer().data();
        app.Render(data);
    }

    app.Finalize();

    return 0;
}
CustomRasterizer