上一章中我们实现了所需要的线性代数工具,我们现在还需要一个可以观察到画面的GUI界面,这里我选择使用imgui这个库来搭建我们所需要的界面。
imgui有不同的后端实现,在这里我们选择用GLFW和GLAD作为imgui的后端。
GLFW是一个专门针对OpenGL的C语言库,我们可以在它的官网(https://www.glfw.org/download.html)上获取到已编译好的库文件和源码,在这里我们直接选择下载对应我们系统版本的编译生成库版本。

GLFW下载界面
读者也可以尝试去下载源文件再对其进行编译,这部分内容我们可以在诸如https://learnopengl-cn.github.io/等教程网站上找到,因此不在此赘述。
因为OpenGL只是一个标准,具体的实现是由驱动开发商针对特定显卡实现的。由于OpenGL驱动版本众多,它大多数函数的位置都无法在编译时确定下来。所以需要开发者在运行时获取函数指针保存下来进行使用,而这在不同平台上方法也不同,为了简化这个过程,GLAD可以帮助我们找到正确的函数指针并赋值,可以在github(https://github.com/Dav1dde/glad)上下载到。
接下来我们还需要imgui的本体,我们可以在github(https://github.com/ocornut/imgui)上获取到imgui的源文件。
在获取了这三个库之后,我们可以通过CMakeLists来简化编译过程,具体的书写方式由具体情景而定,笔者在这里仅给出一个参考:
# version
cmake_minimum_required(VERSION 3.27)
# project name
project(realtime_raytracer)
# c++ standard
set(CMAKE_CXX_STANDARD 11)
include_directories(${PROJECT_SOURCE_DIR}/third_party)
include_directories(${PROJECT_SOURCE_DIR}/third_party/glad/include)
include_directories(${PROJECT_SOURCE_DIR}/third_party/glfw/include)
include_directories(${PROJECT_SOURCE_DIR}/src)
link_directories(third_party/glfw/lib)
add_executable(realtime_raytracer main.cpp
# glad
third_party/glad/src/glad.c
# imgui
third_party/imgui/imgui.cpp
third_party/imgui/imgui_draw.cpp
third_party/imgui/imgui_tables.cpp
third_party/imgui/imgui_widgets.cpp
third_party/imgui/imgui_demo.cpp
third_party/imgui/backends/imgui_impl_glfw.cpp
third_party/imgui/backends/imgui_impl_opengl3.cpp
# src
src/vec3.cpp
src/vec3.hpp
src/ray.cpp
src/ray.hpp
)
target_link_libraries(${PROJECT_NAME} glfw)
在完成上述工作之后我们可以通过刚刚创建好的CMakeList.txt来编译我们的项目了,在CMakeList.txt所处的目录下打开终端,输入下列命令:
mkdir build
cmake ..
make
如果没有出现错误的话,会在build目录下出现与CMakeList中项目同名的可执行文件,这就说明我们的编译成功了。