基于 OpenGL 4.3+ 的多模式渲染实验项目,支持 PBR(Physically Based Rendering)+ IBL 光栅化、Compute Shader 光线追踪(BVH 加速)、Shadow Mapping(PCF 软阴影)、SkyBox 天空盒以及经典 ADS Phong 光照。集成 Dear ImGui 启动面板与实时调参面板,五种渲染模式可在启动时自由切换。
| 模式 | 技术栈 | 说明 |
|---|---|---|
| PBR + IBL | Cook-Torrance BRDF, GGX/Smith/Schlick, 辐照度图 + 预过滤环境贴图 + BRDF LUT | 完整的基于物理的渲染管线,支持 ARM 打包纹理与多光源 |
| Ray Tracing | Compute Shader 递归光线追踪, BVH 加速结构, 反射/折射 | 用栈模拟递归,支持三角网格模型求交 |
| Shadow Mapping | 深度图 Pass + PCF 软阴影, 透明模型支持 | 经典阴影技术,程序化地面平面接收阴影 |
| SkyBox | 立方体贴图天空盒 | 独立天空盒渲染模式,支持 6 面立方体贴图 |
| ADS Phong | Ambient / Diffuse / Specular 光照模型 | 基础模式,用于对照学习 |
- Metalness-Roughness 工作流
- ARM 打包纹理(AO / Roughness / Metallic)与独立贴图双模式
- 法线贴图 + TBN 矩阵(Gram-Schmidt 正交化)
- Reinhard 色调映射 + Gamma 校正
- HDR 环境贴图自动曝光计算
- 启动面板(Launcher):启动时选择渲染模式、模型文件、各模式专属纹理资源、光源参数
- 实时调参面板(GuiManager):运行时调节 FOV、相机位置、模型位移/旋转角度
- 多光源编辑器:添加/删除光源,独立编辑每个光源的颜色与强度(PBR 模式)
- 鼠标轨道相机:鼠标右键拖拽旋转视角,滚轮缩放场景深度
- 文件浏览对话框:通过系统原生对话框选择模型和纹理文件
- C++20,RAII 管理所有 GPU 资源生命周期
- Assimp 加载 glTF / OBJ 模型
- CMake 构建系统 + CMakePresets,Visual Studio 2022 支持
- 自动定位项目根目录,不受工作目录影响
在项目同级目录创建 OpenGL-ref,结构如下:
../OpenGL-ref/
├── include/
│ ├── GL/ glew.h
│ ├── GLFW/ glfw3.h
│ ├── SOIL2/ SOIL2.h
│ ├── assimp/ Importer.hpp, scene.h, postprocess.h
│ └── glm/ glm.hpp, gtc/type_ptr.hpp, gtc/matrix_transform.hpp
└── lib/
├── glew32.lib
├── glfw3.lib
├── soil2-debug.lib
└── assimp-vc143-mtd.lib
也可通过 vcpkg 安装依赖,修改
CMakeLists.txt中OPENGL_REF_DIR指向 vcpkg 目录:vcpkg install glew glfw3 soil2 assimp glm
项目使用 Ninja 生成器(CMakePresets 配置)。需先安装 Ninja,或直接用 Visual Studio 2022 打开项目根目录(VS 会自动识别 CMakePresets 并配置)。
# 安装 Ninja(任选一种)
winget install Ninja-build.Ninja # Windows
choco install ninja # Chocolatey
# CMake Preset 构建
cmake --preset x64-debug -S .
cmake --build out/build/x64-debug --config DebugVS 用户也可以跳过 Ninja,直接用 MSBuild:
cmake -B build -G "Visual Studio 17 2022" -A x64 cmake --build build --config Debug
运行前将以下 DLL 放在 exe 同目录或 PATH 中:
glew32.dllassimp-vc143-mtd.dll
- 启动程序后进入 启动面板(Launcher)
- 从下拉菜单选择渲染模式(ADS / PBR / RayTrace / SkyBox / ShadowMap)
- 根据所选模式配置资源路径(模型、纹理、HDR 环境贴图等)和光源参数
- 点击确认进入渲染窗口
- 在渲染窗口中:
- 通过 ImGui 面板实时调节相机、模型、光源等参数
- 鼠标右键拖拽旋转轨道相机
- 鼠标滚轮缩放场景深度
RenderLab/
├── HybridRender.cpp/.h # 入口,Application 编排所有模块初始化与运行
├── CMakeLists.txt # 构建配置
├── CMakePresets.json # CMake Preset 配置
├── resource/
│ ├── model/ # 3D 模型 (glTF, OBJ)
│ ├── shader/
│ │ ├── pbr/ # PBR + IBL 着色器 (6 文件)
│ │ ├── raytrace/ # 光追 Compute Shader + 全屏四边形
│ │ ├── shadowmap/ # 阴影深度图 + 场景着色器
│ │ ├── skybox/ # 天空盒着色器
│ │ ├── ads/ # ADS 光照着色器
│ │ └── rasterize/ # 基础光栅化着色器
│ └── texture/
│ ├── hdr/ # HDR 环境贴图
│ ├── pbrTexture/ # PBR 材质贴图 (4K)
│ └── cubeMap/ # 天空盒六面贴图
├── utils/
│ ├── Utils.cpp/.h # OpenGL 工具:Shader 编译、纹理/HDR 加载、曝光计算
│ ├── WindowInit.cpp/.h # GLFW 窗口 + 主循环 + RenderContext + 鼠标轨道相机
│ ├── ImportModel.cpp/.h # Assimp 模型导入
│ ├── SourceData.cpp/.h # CPU 端顶点数据存储与展开
│ ├── GPUBuffer.cpp/.h # GPU 缓冲区管理 (VAO/VBO/SSBO/FBO)
│ ├── LoadSource.cpp/.h # Shader 程序 + 纹理加载封装
│ ├── IBLBaker.cpp/.h # IBL 烘焙管线
│ ├── BVH.cpp/.h # BVH 构建 + 序列化(光线追踪加速)
│ ├── GuiManager.cpp/.h # Dear ImGui 实时调参面板
│ ├── LauncherPanel.cpp/.h # Dear ImGui 启动面板(选择渲染模式与资源)
│ ├── light/
│ │ ├── LightManager.cpp/.h # 多光源管理器(增删改查、颜色/强度编辑)
│ │ └── ADSLight.h # ADS 光照 UBO 结构体定义
│ └── render/
│ ├── RenderPass.cpp/.h # 渲染 Pass 基类
│ ├── PBRRenderPass.cpp/.h # PBR 渲染(带 IBL + 多光源)
│ ├── ADSRenderPass.cpp/.h # ADS Phong 光照
│ ├── ShadowMapRenderPass.cpp/.h # PCF 阴影贴图
│ ├── RayTraceRenderPass.cpp/.h # Compute Shader 光线追踪
│ └── SkyBoxRenderPass.cpp/.h # 天空盒
└── thirdparty/
└── imgui/ # Dear ImGui (vendored)
[HDR 环境贴图] → IBLBaker
├── Equirect → Cubemap (1024² RGB16F)
├── Irradiance Map (32², 漫反射卷积)
├── Prefiltered Map (128², 5 级 mip, GGX 重要性采样)
└── BRDF LUT (512² RG16F)
[模型] → Assimp → SourceData → GPUBuffer (VAO/VBO/EBO)
| 按键 / 控件 | 功能 |
|---|---|
| 启动面板 | 选择渲染模式、模型/纹理路径、初始光源参数 |
| ImGui 面板 | 运行时调节 FOV、相机位置、模型位置/旋转角度 |
| ImGui Lights | 添加/删除光源,编辑每个光源的颜色与强度 |
| 鼠标右键拖拽 | 旋转轨道相机视角 |
| 鼠标滚轮 | 缩放场景深度(调整相机距离) |
MIT