SoftGLRender笔记:简介

简介

SoftGLRender是一个跨平台的软件渲染器,实现了GPU渲染管线的主要步骤,通过C++模拟顶点着色器、片元着色器. 支持实时切换软件/OpenGL/Vulkan模式渲染.

可通过改项目,学习和了解现代图形编程.

特点:

1. 完整的 GPU 渲染管线实现

  • 纯C++实现GPU渲染核心流程:顶点处理、光栅化、深度测试、纹理采样、颜色混合等;
  • 模拟顶点着色器(Vertex Shader)片元着色器(Fragment Shader),帮助理解现代图形API;

2. 多种渲染后端支持:软件、OpenGL、Vulkan

  • 软件渲染器:完全基于CPU计算,不依赖GPU,适合学习光栅化原理;
  • OpenGL/Vulkan渲染器:提供现代图形API实现;
  • 运行时实时切换

3. 支持标准3D模型格式

  • Assimp库加载glTF/OBJ/FBX等模型,支持网格、材质、纹理等数据解析;
  • GLM数学库处理矩阵变换、投影、光照等计算;

4. 实现核心图形技术

  • 三角形光栅化
  • 深度缓冲(Z-Buffer) 解决遮挡问题
  • 双线性纹理过滤 改善贴图锯齿
  • Alpha混合 实现透明效果
  • Phong光照模型

各模块特色

渲染管线(Pipeline)

  • 顶点着色
  • 视锥剔除(线段 & 三角形)
  • 透视校正插值
  • 背面剔除
  • 点/线/三角形光栅化
  • 片元着色
  • 着色器导数计算(dFdx/dFdy)
  • 深度测试 & Alpha 混合
  • 提前深度测试 & 反向 Z 缓冲
  • 4x 多重采样抗锯齿(MSAA)

纹理映射(Texture Mapping)

  • Mipmap 生成与采样
  • 采样参数:LOD(细节层级)、Bias(偏移)、Offset(坐标偏移)
  • 多种纹理过滤 & 环绕模式
  • 图像存储布局(Tiling & Swizzling)
  • 线性布局(Linear):像素按行连续存储(常用于 RGBA 缓冲区)
  • 分块布局(Tiled):按块存储,块内像素线性排列
  • Morton 布局:按块存储,块内像素按 Z 形曲线排列

优化(Optimization)

  • 多线程:基于分块的光栅化,支持多线程并行处理
  • SIMD 加速:重心坐标计算、着色器变量插值等

查看器功能(Viewer)

  • 基于 ImGui 的配置面板
  • 轨道摄像机控制器
  • Blinn-Phong 光照
  • PBR & 基于图像的照明(IBL)
  • 天空盒(立方体贴图 & 等距柱状投影)
  • 阴影映射(Shadow Mapping)
  • FXAA 抗锯齿
  • 集成 RenderDoc 帧捕获(应用内调试)

目录结构

  • assets: GLTF模型和天空盒纹理,assets.json是所有模型和天空盒材质的索引
  • src: 主要代码目录
    • Base: 基础工具类,如文件(file), 哈希(hash), 定时器(timer)等.
    • Render: 渲染器抽象层,包含顶点(vertex)、纹理(texture)、统一变量(uniform)、帧缓冲(framebuffer)等
    • Software: 软件渲染器实现
    • OpenGL: OpenGL渲染器实现
    • Vulkan: Vulkan渲染器实现
    • Viewer: GLTF加载(基于Assimp)、相机与控制(camera & controller)、配置面板(configpanel)、渲染通道管理(render pass management)
    • Shader/GLSL: GLSL着色器源码
  • screenshot: 存放运行时截图
  • third_party: 第三方库(libraries)和资源(assets)

根目录如下图:

img

资源

Github源码地址:https://github.com/keith2018/SoftGLRender

第三方库

开源的跨平台3D模型导入库,用于加载多种格式的3D模型文件,并将其转换为统一的内部数据结构,方便在图形应用程序中使用.

跨平台的开源库,主要用于创建窗口、处理输入(如键盘、鼠标、手柄等)以及管理 OpenGL 上下文.

注:与GLEW不同,GLEW是一个用于处理 OpenGL 扩展的库. 早期OpenGL功能有限,主要由显卡驱动提供OpenGL核心功能,但额外功能通常由扩展方式提供.

glfw使用可参见:https://easyvulkan.github.io/

开源C++数学库,专门为图形编程设计,提供与 GLSL高度一致的接口. 支持向量、矩阵运算、几何变换、四元数等核心数学功能.

由Khronos Group维护的开源工具库,用于GLSL的解析、验证和中间表示(IR)生成. 它是Vulkan的着色器编译工具链(如glslc和SPIR-V 生成)的核心组件,也广泛应用于OpenGL、Vulkan和其他图形API的着色器处理.

ImGui(Immediate Mode GUI),轻量级、高性能的C++ GUI库,专为游戏、工具和实时应用设计. 由Omar Cornut开发并开源,广泛应用于调试工具、编辑器、3D渲染器等场景.

轻量级、高性能的 C++11 JSON 解析与序列化库,由 Dropbox 开发. 以简洁的 API 设计、0外部依赖和高性能著称,特别适合嵌入式系统或需要快速集成JSON功能的 C++项目.

属于stb系列开源库,用于图像加载、解码. 以单头文件(header-only)设计、无外部依赖、高性能著称,广泛用于游戏开发、图形应用和嵌入式系统.

VMA(Vulkan Memory Allocator),开源Vulkan内存管理库,由GPUOpen(AMD主导)开发,用于简化Vulkan的GPU内存和CPU内存分配.

posted @ 2025-05-18 16:53  明明1109  阅读(109)  评论(0)    收藏  举报