上一章中我们实现了所需要的线性代数工具,我们现在还需要一个可以观察到画面的GUI界面,这里我选择使用imgui这个库来搭建我们所需要的界面。

2.1 imgui编译

imgui有不同的后端实现,在这里我们选择用GLFW和GLAD作为imgui的后端。

2.1.1 GLFW

GLFW是一个专门针对OpenGL的C语言库,我们可以在它的官网(https://www.glfw.org/download.html)上获取到已编译好的库文件和源码,在这里我们直接选择下载对应我们系统版本的编译生成库版本。

GLFW下载界面

GLFW下载界面

读者也可以尝试去下载源文件再对其进行编译,这部分内容我们可以在诸如https://learnopengl-cn.github.io/等教程网站上找到,因此不在此赘述。

2.1.2 GLAD

因为OpenGL只是一个标准,具体的实现是由驱动开发商针对特定显卡实现的。由于OpenGL驱动版本众多,它大多数函数的位置都无法在编译时确定下来。所以需要开发者在运行时获取函数指针保存下来进行使用,而这在不同平台上方法也不同,为了简化这个过程,GLAD可以帮助我们找到正确的函数指针并赋值,可以在github(https://github.com/Dav1dde/glad)上下载到。

2.1.3 imgui

接下来我们还需要imgui的本体,我们可以在github(https://github.com/ocornut/imgui)上获取到imgui的源文件。

2.1.4 cmake

在获取了这三个库之后,我们可以通过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)

2.1.5 编译

在完成上述工作之后我们可以通过刚刚创建好的CMakeList.txt来编译我们的项目了,在CMakeList.txt所处的目录下打开终端,输入下列命令:

mkdir build
cmake ..
make

如果没有出现错误的话,会在build目录下出现与CMakeList中项目同名的可执行文件,这就说明我们的编译成功了。

2.2 imgui窗口

2.2.1 初始化imgui窗口