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