在接下来的三次作业中,要做的事情就是模拟一个基于CPU的光栅化渲染器的简化版本。

本次作业的任务是填写一个旋转矩阵和一个透视投影矩阵,给定三个点,我们需要做的将三个点的左边变换为屏幕坐标并在屏幕上绘制出对应的线框三角形,因为代码中已经提供了draw_triangle函数,所以你只需要去构建变换矩阵即可。简而言之,我们需要进行模型、视图、投影、视口等变换来将三角形显示在屏幕上。在提供的代码框架中,我们只需要完成模型变换和投影变换。

我们需要在main.cpp中修改

  • get_model_matrix(float rotation_angle) 在这个函数,我们需要实现的就是三维中绕z轴旋转的变换矩阵,不用处理平移与缩放。
  • get_projection_matrix(float eye_fov, float aspect_ratio, float zNear, float zFar) 使用给定的参数逐个元素地构建透视投影矩阵并返回该矩阵。
  • 在main() 函数里可以自行补充所需要的其它操作

当我正确地构建模型与投影矩阵后,就可以run了,光栅化器会创建一个窗口显示出线框三角形。由于光栅化器是逐帧渲染与绘制的,所以我们可以使用A和D键去将该三角形绕z轴旋转此处有一个提高的任务,如何实现将三角形绕任意过原点的轴旋转,按下Esc键的时候,窗口会关闭并且程序终止。

也可以从命令行中运行该程序。可以使用以下命令来运行和传递旋转角给程序,在这样的运行方式下,是不会生成任何的窗口,输出的结果图像会被存储在给定的文件中(若未指定文件名,则默认存储在output.png 中)。图像的存储位置在可执行文件旁,所以如果可执行文件是在build 文件夹中,那么图像也会在该文件夹内。命令行的使用命令如下:

./Rasterizer //循环运行程序, 创建一个窗口显示, 且你可以
//使用A键和D键旋转三角形。

./Rasterizer −r 20 //运行程序并将三角形旋转20度,然后将
//结果存在output.png中

./Rasterizer −r 20 image.png //运行程序并将三角形旋转20度,
//然后将结果存在image.png中。

在这次的作业中,因为并不需要去使用三角形类,所以我需要理解与修改的文件为:rasterizer.hpp和main.cpp。其中rasterizer.hpp文件作用是生成渲染器界面与绘制。

光栅化器类在该程序系统中起着重要的作用,其成员变量与函数如下。

成员变量:

  • Matrix4f model, view, projection: 三个变换矩阵。
  • vector<vector3f> frame_buf: 帧缓冲对象,用于存储需要在屏幕上绘制的
    颜色数据。</vector3f>

成员函数:

  • set_model(const Eigen::Matrix4f& m): 将内部的模型矩阵作为参数传递给光栅化器。
  • set_view(const Eigen::Matrix4f& v): 将视图变换矩阵设为内部视图矩阵。
  • set_projection(const Eigen::Matrix4f& p): 将内部的投影矩阵设为给定矩阵p,并传递给光栅化器
  • set_pixel(Vector2f point, Vector3f color): 将屏幕像素点(x, y) 设为(r, g, b) 的颜色,并写入相应的帧缓冲区位置。

在main.cpp中,代码框架模拟了图形管线,首先定义了光栅化器类的实例,然后设置了其必要的变量。然后得到一个带有三个顶点的硬编码三角形。在主函数上。定义了三个分别计算模型、视图和投影矩阵的函数,每一个函数都会返回相应的矩阵。接着,这三个函数的返回值会被set_model(), set_view()和set_projection() 三个函数传入光栅化器中。最后,光栅化器在屏幕上显示出变换的结果。

在用模型、视图、投影矩阵对给定几何体进行变换后,我们得到三个顶点的正则化空间坐标(canonical space coordinate)。正则化空间坐标是由三个取值范围在[-1,1] 之间的x, y, z 坐标构成。我们下一步需要做的就是视口变换,将坐标映射到我们的屏幕中(window_width * window_height),这些在光栅化器中都已完成,所以不需要担心。但是,我们需要做的就是去理解这步操作是如何运作的,这一点十分重要。

最后一步就是进行编译,在虚拟机上使用CMake进行编译

mkdir build // 创建build文件夹以保留的工程文件。
cd build     // 进入build文件夹。
cmake ..     // 通过提供CMakeLists.txt文件的路径
             // 作为参数来运行CMake。
make −j4     // 通过make编译代码, −j4 表示通过
             // 4个内核进行并行化编译。
./Rasterizer // 运行代码。

在虚拟机里,要将cpu核心数设置为4。

本次作业的提高作业是在main.cpp中构造一个函数,该函数的作用是得到绕任意过原点的轴的旋转变换矩阵。

Eigen::Matrix4f get_ratation(Vector3f axis, float angle)