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



该框架运行的主体代码如下:

  • 01
  • 02
  • 03
  • 04
  • 05
  • 06
  • 07
  • 08
  • 09
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
#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