Building a Simple Engine -- Advanced Topics--Planar reflections

引擎中的平面反射(Planar Reflections in Our Engine)

现实场景中,光洁的地面、透亮的窗户总能吸引目光,游戏开发中我们常会模拟这类视觉效果。本引擎选用了一种实用且稳定的实现方案 ——平面反射(Planar Reflections)。本文将讲解平面反射的定义、引擎选用该方案的原因、具体实现方式,以及其他反射方案的适用场景。

什么是平面反射?

平面反射是指沿单一平面(如平整地面、窗户)渲染场景的镜像画面,核心是创建一个「镜像相机」,从反射面的另一侧拍摄场景。我们会将这个镜像视角的画面渲染到一张纹理中,绘制玻璃(或其他平面反射表面)时,对该纹理进行采样即可实现反射效果。

平面反射的适用场景

  • 平面镜、平静的水面、抛光地面、玻璃幕墙等平面反射表面。
  • 对反射效果有稳定性、高质量要求,且希望避免大量噪点、时间域不稳定性的场景。

平面反射的不适用场景

  • 曲面、粗糙表面,这类表面需要全视角的光泽模糊效果。
  • 任意反射方向的场景(如具有复杂微观几何结构的金属材质)。

引擎选用平面反射的原因

本引擎对反射方案的核心要求为:

  1. 易理解:仅需新增一个渲染通道、一张纹理,实现逻辑简洁。
  2. 确定性与稳定性:无画面「闪烁」问题,无需处理时间域累积带来的各类问题。
  3. 实用性:适配前向渲染器中存在单个主要反射面(玻璃、地面)的场景。

平面反射完美满足以上三点要求,且无需光线追踪硬件,能在不同性能的 GPU 上稳定运行、良好扩展。

引擎中的实现逻辑

我们仅在主渲染通道外新增一个轻量级渲染通道,并在主通道中增加一次简单的混合操作,即可实现平面反射:

镜像通道(离屏渲染)

  1. 将相机沿目标平面做镜像变换,计算得到镜像视图矩阵
  2. 关闭(或调整)面剔除功能,将场景中的不透明物体渲染到反射纹理的颜色 + 深度渲染目标中。
  3. 完成同步操作,确保反射纹理能在后续通道中被正常采样。

主通道(原相机视角)

  1. 按常规流程绘制不透明物体与透明物体。
  2. 绘制玻璃时,采样反射纹理,并结合菲涅尔公式(Fresnel)粗糙度(roughness) 以及用户可控的反射强度(reflection intensity),将反射效果与玻璃的着色效果混合。

整个实现无复杂的渲染图逻辑,无需光线查询,也无需时间域累积,核心逻辑简洁易懂。

核心镜像变换算法(简洁高效)

  1. 在世界空间中定义反射平面,公式为:ax+by+cz+d=0。
  2. 基于该平面构建反射矩阵 R,将原相机的视图矩阵与 R 相乘,即可得到镜像相机的视图矩阵。
  3. 实际实现中,需对镜像通道的面剔除进行调整(如设置cullMode = none或翻转正面),因为反射变换会改变顶点的环绕顺序。

同时,我们会将反射平面参数传入着色器,实现可选的裁剪功能:通过将世界空间位置与平面参数进行简单的点积运算,即可在镜像通道中丢弃平面「后方」的片元,避免无效渲染。

详细渲染步骤

镜像通道

  1. 创建反射颜色纹理(格式与主通道匹配,确保合成 / 玻璃绘制通道可轻松采样)与反射深度纹理。
  2. 渲染前:通过 Vulkan Synchronization 2vkCmdPipelineBarrier2,将反射颜色纹理的布局从SHADER_READ_ONLY_OPTIMAL转换为COLOR_ATTACHMENT_OPTIMAL;深度纹理同理,转换为DEPTH_ATTACHMENT_OPTIMAL
  3. 启动动态渲染,绑定不透明物体的 PBR 渲染管线,关闭面剔除(或翻转正面)。
  4. 渲染不透明网格,若有需要,可增加基于反射平面的裁剪测试。
  5. 结束渲染,将反射颜色纹理的布局转换回SHADER_READ_ONLY_OPTIMAL,确保主通道可正常采样。

主通道

  1. 按常规流程渲染不透明物体(本引擎会渲染至离屏缓冲区,为后续的色调映射合成做准备)。
  2. 透明通道绘制玻璃时,采样反射纹理并执行混合操作,混合规则为:
    • 结合菲涅尔公式(掠射角下反射效果更强),并根据粗糙度削弱反射强度。
    • 乘以 UI 中可调节的反射强度系数,快速调整反射效果的可见度。

同步机制与内存屏障(核心注意点)

本引擎基于 Vulkan Synchronization 2 实现简洁的同步逻辑,核心规则如下:

  1. 禁止在活跃的动态渲染通道内修改图像布局,需先结束渲染通道。
  2. 调用vkCmdPipelineBarrier2时,需正确设置源 / 目标阶段掩码访问掩码以及旧 / 新布局
  3. 反射颜色纹理:镜像通道前从SHADER_READ_ONLY_OPTIMAL转为COLOR_ATTACHMENT_OPTIMAL,渲染后恢复为SHADER_READ_ONLY_OPTIMAL
  4. 交换链纹理:合成 / 透明通道前转为COLOR_ATTACHMENT_OPTIMAL所有渲染通道结束后,再转为PRESENT_SRC_KHR

描述符绑定:反射纹理的绑定位置

  1. 我们在 PBR 描述符集中预留了绑定点 10,用于绑定反射纹理的采样器。
  2. 在每帧的安全执行点(上一帧的渲染工作完成后),刷新当前帧的绑定点 10,使其指向上一帧生成的反射纹理。
  3. 玻璃着色器会检测 UBO 中的reflectionEnabled标志位,仅当存在有效反射纹理时,才执行反射纹理的采样操作。

玻璃混合模型(简易实用)

玻璃的核心视觉效果是透射,但我们希望实现逼真且鲜明的反射效果,因此采用以下简易混合模型:

  1. 菲涅尔项(Schlick 近似):掠射角下反射效果更强,贴合物理规律。
  2. 粗糙度因子:粗糙度越高,反射效果越弱、越模糊(本引擎做了简化处理,仅通过粗糙度削弱反射强度)。
  3. 反射强度滑动条:在 UI 中暴露该参数,可实时调整反射效果的明显程度。

该模型并非完整的物理光谱模型,但足够简洁易懂,且能输出逼真的视觉效果,完全满足示例引擎的需求。

其他反射方案及适用场景

屏幕空间反射(SSR)

  • 无需新增渲染通道,直接使用当前帧的颜色 / 深度缓冲区。
  • 适合水坑、局部小范围反射效果,但无法渲染屏外物体,且存在时间域不稳定性问题。
  • 适用场景:希望快速实现全场景反射,且可接受偶尔的画面瑕疵。

环境贴图 / 立方体贴图 / 反射探针

  • 预计算实现,渲染速度极快。
  • 对近距离物体的反射效果缺乏视角准确性,适合远距离的光泽反射。
  • 适用场景:实现全局环境反射,或反射面非完美平面的场景。

硬件光线追踪 / 混合渲染方案

  • 反射效果高度精准,支持复杂的反射场景。
  • 需光线追踪硬件,且需实现高级去噪算法,代码复杂度与性能开销较高。
  • 适用场景:面向高端 GPU 开发,且要求全场景反射效果达到「物理级逼真」。

平面反射(本引擎方案)

  • 仅需新增一个渲染通道,效果确定、稳定。
  • 完美适配单个或少数大型平面反射面(地面、窗户、平静水面)。
  • 适用场景:希望为特定平面实现高质量镜面反射,且不想引入光线追踪技术。

性能优化技巧

  1. 降低镜像通道的渲染分辨率:本引擎提供了分辨率缩放滑动条,可灵活调整。
  2. 激进的剔除策略:引擎的 CPU 视锥剔除对原相机和镜像相机均生效,可大幅减少渲染量。
  3. 按需启用镜像通道:当反射面不在相机可视范围内时,直接关闭镜像通道。
  4. 反射纹理模糊:若希望粗糙表面呈现柔和的反射效果,可对反射纹理采样结果进行模糊处理。

常见问题排查

反射效果过弱

调高 UI 中的反射强度滑动条,或降低反射面的粗糙度参数。

代码对应位置

镜像相机矩阵计算、反射通道及通道顺序配置

renderer_rendering.cpp

反射渲染目标与管线配置

renderer_pipelines.cpp

反射纹理采样 + 玻璃着色逻辑

shaders/pbr.slangshaders/pbr_utils.slang

反射纹理描述符绑定与每帧安全执行点刷新

renderer_rendering.cpp(反射描述符刷新逻辑)

未来拓展方向

若希望进一步优化平面反射效果,可参考以下方向:

  1. 实现基于粗糙度的反射纹理模糊(通过 mip 链或可分离模糊算法)。
  2. 支持多个反射平面,适配多层地板等复杂场景。
  3. 新增屏幕空间反射(SSR)作为兜底方案,在平面反射无效的区域混合 SSR 效果。
  4. 为非平面表面实现选择性光线查询反射,打造混合反射方案。

后续推荐阅读

若希望深入了解本引擎的其他核心功能,可阅读以下文档:

  1. Synchronization and Streaming(同步机制与资源流式加载)
  2. Forward+ Rendering(Forward + 渲染)
  3. Descriptor Indexing and Stable Descriptor Updates(描述符索引与稳定的描述符更新)
  4. Rendering Pipeline Overview(渲染管线总览)

你可以基于本方案自由尝试与拓展,平面反射的实现被刻意设计得简洁直观,让你能专注于学习 Vulkan 的核心知识点,而无需在复杂的图形技术中迷失。

Read more

2026年高校AIGC检测新规解读:AI率多少算合格?

2026年高校AIGC检测新规解读:AI率多少算合格?

2026年高校AIGC检测新规解读:AI率多少算合格? 从2024年知网正式上线AIGC检测功能开始,短短两年时间,"AI率"已经从一个新鲜名词变成了每个毕业生必须面对的硬性指标。2026年,各高校的AIGC检测政策进一步收紧和细化,要求也越来越明确。 那么,2026年AI率到底多少才算合格?不同学校的标准差别大吗?不合格会面临什么后果?本文将对这些问题进行深入解读。 一、AIGC检测已成为毕业论文审查的标配 回顾AIGC检测在高校中的普及历程,可以用"指数级扩散"来形容: * 2024年:知网上线AIGC检测功能,少数985/211院校开始试点,大部分学校处于观望状态 * 2025年:超过60%的本科院校和80%的研究生培养单位将AIGC检测纳入论文审查流程 * 2026年:AIGC检测基本实现全覆盖,包括专科院校在内的绝大部分高等教育机构都已建立相关制度 这一进程的背后,是教育部在2025年初发布的《关于加强高等学校学位论文学术诚信管理的指导意见》,其中明确提到"鼓励各高校引入人工智能生成内容检测机制,将AIGC检测作为论文质量保障的重要环节"。 虽然教育部没

【PX4+QGroundControl+MAVROS+Gazebo】PX4控制在Gazebo中控制自己的无人机

目录 前言 一、PX4、MAVROS、QGroundControl之间的关系 1.1 Gazebo与PX4通信 1.2 PX4与QGroundControl通信 1.3 总结 二、实现过程【以阿木实验室P230为例】 2.1 仿真环境 2.2 模型建立 2.3 建立gazebo和MAVROS之间的连接 2.4 建立MAVROS和PX4之间的连接 2.5 验证实验结果 三、一个失败的地方 总结 前言 笔者在准备用阿木实验室-P230无人机仿真的时候,发现官方给的该无人机仿真的代码依赖于该公司的Prometheus、Prometheus-PX4以及QGroundControl软件。但是笔者日后想把自己的项目上传到Github上,如果把整个阿木实验室的PX4上传上去显得不现实,且也占很大存储。因此,笔者会从小白的角度【因为笔者也是Green Bird】,介绍将自己的无人机连接PX4的办法。以下内容仅供参考,若有误,

宇树VR遥操与IL——从遥操程序xr_teleoperate到unitree_IL_lerobot:如何基于G1进行manipulation开发

宇树VR遥操与IL——从遥操程序xr_teleoperate到unitree_IL_lerobot:如何基于G1进行manipulation开发

前言 如之前的文章所述,我司「七月在线」正在并行开发多个订单,目前正在全力做好每一个订单,因为保密协议的原因,暂时没法拿出太多细节出来分享 但可以持续解读我们所创新改造或二次开发的对象,即解读paper和开源库「当然 有些paper/库还没开始用,但也可以提前解读,作为关注了解」 而对于我司人形开发的订单,截止到25年4月,背后的机器人多半基于这几家:宇树、智元、傅利叶、乐聚「之所以用的这几家,一半因为我和这些公司熟,一半因为客户已有其中某一家或某几家的本体 需在其基础上做定制开发,如其它厂商看到 有兴趣合作,欢迎私我,比如星动纪元、星海图、众擎等等」 * 通过此文《Fourier-Lerobot——把斯坦福人形动作策略iDP3封装进了Lerobot(含我司七月的idp3落地实践)》可知,傅利叶 把idp3 装进了lerobot * 类似的,宇树 通过此开源库「unitree_IL_lerobot」,也把lerobot 集成了下 该库包含了π0策略 且无论咱们是用傅利叶集成的lerobot—

论文阅读 | MiniCPM-o | RLAIF-V开源AI反馈助力模型可信度超越GPT-4V

论文阅读 | MiniCPM-o | RLAIF-V开源AI反馈助力模型可信度超越GPT-4V

论文地址:https://arxiv.org/pdf/2405.17220 发布时间:2024年5月27日 =》2025 年 10 月 29 日 v3版本 论文主要由豆包AI翻译 论文总结 核心目标 解决现有多模态大语言模型的幻觉问题,突破传统RLHF依赖人工标注、现有RLAIF依赖专有模型的局限,通过全开源范式构建高质量反馈,实现模型可信度与人类偏好的对齐。 核心创新 1. 去混淆响应生成:相同条件下多轮采样解码,消除文本风格干扰,凸显可信度真实差异; 2. 分而治之反馈标注:将响应拆解为原子声明,转换为极性问题评估,降低开源模型标注难度; 3. 迭代反馈学习:动态更新反馈分布,解决DPO训练中的分布偏移问题; 4. 推理自反馈机制:利用DPO对齐模型的奖励分数,结合长度归一化策略,优化推理阶段性能。 关键结果 1. 幻觉抑制显著:RLAIF-V 7B将物体幻觉率降低80.7%