渲染器#

渲染器为策略观测和合成数据流程生成相机传感器缓冲区。它们不同于 可视化器 ;后者为检查、调试和录制提供面向人的交互式视图。Isaac Lab 采用可插拔渲染器架构,所有实现均遵循 BaseRenderer 定义的接口。

Isaac Lab 支持三种渲染后端。下表概括其运行时要求和主要用途。执行方式、输出支持与限制见 渲染器详情 ,按后端划分的输出支持矩阵见 渲染器支持情况 。

选择渲染后端#

后端

是否需要 Isaac Sim?

最适用于

Isaac RTX

Yes

完整传感器保真度、RTX 逼真渲染、PhysX 后端

OVRTX

不需要(不依赖 Kit;需要 isaaclab_ov + ovrtx )

无需 Isaac Sim 即可获得 RTX 级渲染质量

Newton Warp

不需要(不依赖 Kit)

Newton 后端、快速训练

渲染器输出概览#

下方示例使用相同的场景、相机、光源、材质和初始条件。六个球体分别展示镜面、透明、半透明、哑光、光泽和自发光材质。RGB 动画展示球体落到桌面上的过程,其余输出为同一次运行中的静帧。静帧取自第六个渲染帧,以便运动向量等时序输出包含有效运动,同时球体仍接近初始位姿。

这些图像用于定性比较功能支持和画面特征,不是性能测试。不依赖 Kit 的渲染器使用 Newton 物理,Isaac RTX 使用 PhysX,因此球体的精确位姿可能不同。这里使用仅用于显示的色图,使标量、向量和标签输出易于观察;相机传感器仍返回文档所述的原始张量。相近的别名,以及距离或 ID 的变体没有逐一列出,因为它们不会呈现明显不同的视觉模式。

Newton Warp RGB 输出:六个材质球落到桌面上。

RGB 动画#

Newton Warp 的六个材质球反照率输出。

反照率#

Newton Warp 的六个材质球深度输出(以伪彩色显示)。

深度。Turbo 色图从近处的紫色逐渐过渡到远处的红色。#

Newton Warp 的六个材质球表面法线输出。

法线#

Newton Warp 的六个材质球语义分割输出(以伪彩色显示)。

语义分割#

Newton Warp 的六个材质球实例分割输出(以伪彩色显示)。

实例分割#

OVRTX RGB 输出:六个材质球落到桌面上。

RGB 动画#

OVRTX 的六个材质球反照率输出。

反照率#

OVRTX 的六个材质球深度输出(以伪彩色显示)。

深度。Turbo 色图从近处的紫色逐渐过渡到远处的红色。#

OVRTX 的六个材质球表面法线输出。

法线#

OVRTX 的六个材质球语义分割输出(以伪彩色显示)。

语义分割#

OVRTX 的六个材质球实例分割输出(以伪彩色显示)。

实例分割#

OVRTX 的六个下落材质球运动向量输出(以伪彩色显示)。

运动向量。颜色表示方向和相对大小,箭头表示采样得到的图像空间运动。#

OVRTX 的六个材质球常量漫反射简化着色输出。

常量漫反射着色#

OVRTX 的六个材质球漫反射 MDL 简化着色输出。

漫反射 MDL 着色#

OVRTX 的六个材质球完整 MDL 简化着色输出。

完整 MDL 着色#

Isaac RTX RGB 输出:六个材质球落到桌面上。

RGB 动画#

Isaac RTX 的六个材质球反照率输出。

反照率#

Isaac RTX 的六个材质球深度输出(以伪彩色显示)。

深度。Turbo 色图从近处的紫色逐渐过渡到远处的红色。#

Isaac RTX 的六个材质球表面法线输出。

法线#

Isaac RTX 的六个材质球语义分割输出(以伪彩色显示)。

语义分割#

Isaac RTX 的六个材质球实例分割输出(以伪彩色显示)。

实例分割#

Isaac RTX 的六个下落材质球运动向量输出(以伪彩色显示)。

运动向量。颜色表示方向和相对大小,箭头表示采样得到的图像空间运动。#

Isaac RTX 的六个材质球常量漫反射简化着色输出。

常量漫反射着色#

Isaac RTX 的六个材质球漫反射 MDL 简化着色输出。

漫反射 MDL 着色#

Isaac RTX 的六个材质球完整 MDL 简化着色输出。

完整 MDL 着色#

渲染器详情#

展开下方渲染器条目,查看执行方式、输出支持、限制和典型用途。上方图像只用于视觉比较,相机支持矩阵才是各后端输出支持的权威依据。

Newton Warp 渲染器
  • 运行时与物理: 基于 NVIDIA Warp 的轻量光栅化渲染器,不依赖 Kit,与 Newton 物理配合使用。

  • 输出支持: 提供 RGB、反照率、深度、法线、语义分割和实例分割,不提供运动向量或 RTX 材质光传输。其精简的光栅化流程所提供的真值输出少于 RTX 渲染器,后者集成了更广泛的 RTX 和标注器功能。

  • 适用场景: 吞吐量比完整 RTX 保真度更重要的训练流程。

OVRTX 渲染器
  • 运行时与物理: 通过 isaaclab_ov 扩展提供不依赖 Kit 的 RTX 渲染,与 Newton 物理配合使用。

  • 输出支持: 提供 RTX Minimal 和逼真渲染,以及几何、运动和标签输出。

  • 适用场景: 无需运行 Isaac Sim 即可获得 RTX 图像质量。

Isaac RTX 渲染器
  • 运行时与物理: 在 Isaac Sim 内运行 NVIDIA Omniverse RTX 渲染流程,与 PhysX 配合使用。

  • 输出支持: 提供 RTX Minimal、逼真渲染,以及最广泛的相机输出支持。

  • 适用场景: 完整 RTX 保真度,以及已经依赖 Isaac Sim 或 Kit 的工作流程。

选择渲染功能#

上方概览集中展示了所有视觉上不同的输出。下方按用途重新分组:面向高吞吐量训练的简化渲染、提供完整 RTX 图像质量的逼真渲染,以及几何、运动和标签等高级输出。详细图注和命令使用不带后缀的 Isaac-Cartpole-Camera 任务,无需修改 Python 即可尝试各模式。

简化渲染#

简化渲染优先考虑吞吐量和可预测的成像,而非完整光传输。Newton Warp 提供轻量的光栅化 RGB 路径。OVRTX 和 Isaac RTX 提供 RTX Minimal 模式,关闭间接光照,并提供三个层级的材质求值:

  • 常量漫反射 使用单一的恒定表面颜色。

  • 漫反射 MDL 是 Isaac Lab 对带纹理漫反射着色所采用的稳定名称。

  • 完整 MDL 是 Isaac Lab 对漫反射、光泽和自发光材质求值所采用的稳定名称。

RTX Minimal 使用场景中的第一个远光源,并采用硬阴影。渲染器级设置和限制见上游 OVRTX Minimal 模式 与 RTX Minimal 渲染器 文档。

关闭方向光阴影的 Newton Warp RGB 输出。

无阴影(默认)#

启用方向光阴影的 Newton Warp RGB 输出。

有阴影#

如果轻量 RGB 观测已经足够,Newton Warp 是不依赖 Kit 的选择。

uv run isaaclab train --rl_library rsl_rl \
   --task Isaac-Cartpole-Camera \
   physics=newton_mjwarp renderer=newton_renderer presets=rgb

显式启用方向光阴影:

uv run isaaclab train --rl_library rsl_rl \
   --task Isaac-Cartpole-Camera \
   physics=newton_mjwarp renderer=newton_renderer presets=rgb \
   env.scene.tiled_camera.renderer_cfg.enable_shadows=true
OVRTX 常量漫反射 RTX Minimal 输出。

常量漫反射: presets=simple_shading_constant_diffuse#

OVRTX 带纹理漫反射 RTX Minimal 输出。

漫反射 MDL: presets=simple_shading_diffuse_mdl#

OVRTX 完整材质 RTX Minimal 输出。

完整 MDL: presets=simple_shading_full_mdl#

常量漫反射

uv run isaaclab train --rl_library rsl_rl --task Isaac-Cartpole-Camera \
   physics=newton_mjwarp renderer=ovrtx presets=simple_shading_constant_diffuse

带纹理漫反射

uv run isaaclab train --rl_library rsl_rl --task Isaac-Cartpole-Camera \
   physics=newton_mjwarp renderer=ovrtx presets=simple_shading_diffuse_mdl

漫反射、光泽和自发光材质求值

uv run isaaclab train --rl_library rsl_rl --task Isaac-Cartpole-Camera \
   physics=newton_mjwarp renderer=ovrtx presets=simple_shading_full_mdl
Isaac RTX 常量漫反射 RTX Minimal 输出。

常量漫反射: presets=simple_shading_constant_diffuse#

Isaac RTX 带纹理漫反射 RTX Minimal 输出。

漫反射 MDL: presets=simple_shading_diffuse_mdl#

Isaac RTX 完整材质 RTX Minimal 输出。

完整 MDL: presets=simple_shading_full_mdl#

常量漫反射

uv run isaaclab train --rl_library rsl_rl --task Isaac-Cartpole-Camera \
   physics=isaacsim_physx renderer=isaacsim_rtx presets=simple_shading_constant_diffuse

带纹理漫反射

uv run isaaclab train --rl_library rsl_rl --task Isaac-Cartpole-Camera \
   physics=isaacsim_physx renderer=isaacsim_rtx presets=simple_shading_diffuse_mdl

漫反射、光泽和自发光材质求值

uv run isaaclab train --rl_library rsl_rl --task Isaac-Cartpole-Camera \
   physics=isaacsim_physx renderer=isaacsim_rtx presets=simple_shading_full_mdl

逼真渲染#

这里的 逼真渲染 指完整 RTX 实时路径追踪模式的常规 RGB 路径;它是功能分类,不是 Isaac Lab 预设名称。当材质外观、反射、透明度、光照或附带的 RTX AOV 比最低渲染延迟更重要时,选择这种方式。OVRTX 在不使用 Kit 的情况下提供此路径,Isaac RTX 则在 Isaac Sim 内提供。请参阅上游 OVRTX 渲染模式 与 Isaac Sim 渲染模式 。

OVRTX RGB 输出:六个材质球落到桌面上。

OVRTX 逼真 RGB: renderer=ovrtx presets=rgb#

同一渲染器也提供概览图中的反照率、深度、法线、分割和运动向量输出。

uv run isaaclab train --rl_library rsl_rl --task Isaac-Cartpole-Camera \
   physics=newton_mjwarp renderer=ovrtx presets=rgb
Isaac RTX RGB 输出:六个材质球落到桌面上。

Isaac RTX 逼真 RGB: renderer=isaacsim_rtx presets=rgb#

同一渲染器也提供概览图中的反照率、深度、法线、分割和运动向量输出。

uv run isaaclab train --rl_library rsl_rl --task Isaac-Cartpole-Camera \
   physics=isaacsim_physx renderer=isaacsim_rtx presets=rgb

高级渲染输出#

除 RGB 外,渲染器生成的缓冲区还提供材质、几何、运动和标注信息:

  • 反照率 将材质基础色与光照分离。

  • 深度 测量沿光轴的距离,用于几何感知和重建。

  • 法线 表示局部表面朝向。

  • 语义分割 按类别划分像素, 实例分割 则区分各个物体。

  • 运动向量 表示每个像素在图像空间中的运动,需要前一帧历史信息。

通过 data_types 请求一个或多个缓冲区。配置示例见 配置相机 ,可用名称、张量形状、数据类型和含义见 输出类型 。环境级 presets=... 选择器是任务定义的便捷方式,不是全部相机输出的完整列表。

各后端支持的输出不同。选择渲染器前,请检查 相机渲染器支持矩阵 。例如,OVRTX 和 Isaac RTX 提供运动向量,Newton Warp 不提供。上方 渲染器视觉比较 展示了同一场景中的这些输出。

备注

可视化标记是可视化器提供的调试叠加内容,不是相机输出。其支持情况独立于相机渲染器:Kit、Newton GL、Rerun 和 Viser 可视化器支持标记,实验性的 Newton RTX 可视化器不支持。可视化器支持矩阵见 可视化 。

备注

基于相机的强化学习中的时序信息。 与采用时序抗锯齿的 RTX 模式(DLSS、DLAA、TAA)不同,Newton Warp 渲染器不会将前一帧信息引入当前图像。依赖速度等视觉线索的相机控制任务,应显式添加时序观测,例如在任务中叠帧,而不是依赖特定渲染器产生的画面特征。

Isaac RTX 按环境划分场景#

Isaac RTX 渲染器默认启用按环境划分场景,为每个 /World/envs/env_<index> 层级及其相机分配匹配的场景分区标记,使平铺视图仅渲染对应环境的几何。

通过 IsaacRtxRendererCfg 配置该行为:

from isaaclab_physx.renderers import IsaacRtxRendererCfg

renderer_cfg = IsaacRtxRendererCfg(enable_scene_partitioning=False)

场景分区与显示所有环境的观察视图是两个独立设置。只有启用 Kit 视口,或请求 Kit 可视化、录制、直播流或 XR 时, KitLauncher 才会在 RTX 启动前启用观察模式支持。常规无界面训练和相机传感器运行保持该功能关闭,使平铺相机不受观察模式世界空间布局约束的影响。

global_settings.show_all_partitions_by_default 对应同一个进程级全局 RTX 设置,并不是独立功能。其默认值 None 保留 KitLauncher 在启动时的选择。显式赋值会在构建 Isaac RTX 渲染器时覆盖该设置。启用时,环境必须在空间上分开,因为分区边界重叠可能使内容出现在其他环境中或消失。关闭时,Kit 视口只显示选中的环境。

此设置不影响 OVRTX;OVRTX 始终对多环境场景进行分区。

环境层级之外的 prim 保留在共享背景分区中。环境持有的 PointInstancer 标记可以为每个实例携带一个匹配的场景分区标记;没有此类所有权信息的标记保持共享。

警告

Isaac RTX 与 OVRTX 渲染器将场景分区数量限制为 15625。启用场景分区时,如果请求超过 15625 个环境,多出的分区会被丢弃, rtx.scenedb.plugin 会记录 SceneDbContext : Maximum number of scene partitions (15625) reached. Additional scene partitions will be discarded. 。超过该数量的环境会与其他环境共享分区,因此其平铺相机画面可能显示其他环境的几何。详情见 场景分区上限为 15625 个 。

架构概览#

渲染器系统由以下部分组成:

  1. BaseRenderer :定义渲染生命周期和接口的抽象基类。

  2. RendererCfg : BackendCfg 的子类;各后端扩展它以提供专用选项,并在 class_type 中声明具体实现。

  3. 具体实现 :扩展软件包中的后端专用渲染器。

  4. SimulationContext :在后端注册表中持有渲染器实例,通过 get_or_create_backend(renderer_cfg) ,在具体类型相同且配置相等的请求之间共享实例。

  5. RenderContext :通过仿真注册表的过滤视图,协调初始化、舞台准备、场景更新和材质写入器,不负责构建、缓存或关闭渲染器实例。

import isaaclab.sim as sim_utils
from isaaclab.renderers import BaseRenderer
from isaaclab_newton.renderers import NewtonWarpRendererCfg

# Create a Newton Warp renderer (no Isaac Sim required)
sim_ctx = sim_utils.SimulationContext.instance()
# Reuse a matching renderer or construct one through instantiate(cfg).
renderer: BaseRenderer = sim_ctx.get_or_create_backend(NewtonWarpRendererCfg())
assert isinstance(renderer, BaseRenderer)

使用 RTX 渲染器时(需要 Isaac Sim):

import isaaclab.sim as sim_utils
from isaaclab.renderers import BaseRenderer
from isaaclab_physx.renderers import IsaacRtxRendererCfg

# Create an RTX renderer
sim_ctx = sim_utils.SimulationContext.instance()
# Reuse a matching renderer or construct one through instantiate(cfg).
renderer: BaseRenderer = sim_ctx.get_or_create_backend(IsaacRtxRendererCfg())

RTX 渲染器设置见 选择与配置渲染器 。

批量渲染相机#

render_batch() 接受同一渲染器持有的一组渲染数据对象。渲染前准备相机位姿、内参和共享场景状态,之后读取各相机输出。空序列不会触发渲染。

renderer.render_batch([first_render_data, second_render_data])
renderer.read_output(first_render_data, first_camera_data)
renderer.read_output(second_render_data, second_camera_data)

render() 仍接受单个渲染数据对象。默认的 render_batch() 实现逐项调用 render() ,因此已有自定义渲染器和单相机调用方无需修改。OVRTX 同时推进所有已注册渲染产品,但只发布所请求相机的观测。

主动更新传感器时( scene.cfg.lazy_sensor_update=False ), scene.update() 按场景顺序推进传感器时钟,并收集支持批处理的传感器。循环结束后,相机批处理实现会准备其余到期的采集请求。 render_into_cameras() 按渲染器实例分组,渲染各组并读取输出。上下文不保留待处理相机队列,每个相机维护自己的更新周期和重置状态。

按需更新传感器时,读取相机的 data 只刷新该相机的传感器缓冲区和采集时间戳,不会刷新共享渲染器的其他相机传感器。

核心概念#

  • 使用仿真注册表: 始终通过 sim_ctx.get_or_create_backend(IsaacRtxRendererCfg()) 等方式,使用渲染器专用配置类获取渲染器。不要直接导入或实例化具体后端类,例如 IsaacRtxRenderer 、 OVRTXRenderer ;类名和软件包位置属于实现细节,可能不经通知就改变。

  • 轻量配置导入: 导入渲染器配置类不会引入后端专用依赖。 class_type 在构建渲染器时按需解析,后端未安装时,构建可能失败。

    import isaaclab.sim as sim_utils
    from isaaclab.renderers import BaseRenderer
    # Lightweight: does not import OVRTX backend dependencies
    from isaaclab_ov.renderers import OVRTXRendererCfg
    
    # Lazily loads ovrtx when instantiated; may fail if isaaclab_ov / ovrtx is not installed
    sim_ctx = sim_utils.SimulationContext.instance()
    renderer: BaseRenderer = sim_ctx.get_or_create_backend(OVRTXRendererCfg())
    

安装 OVRTX 渲染器#

OVRTX 渲染器由 isaaclab_ov 扩展提供。扩展源码包随核心安装发布,但渲染器的 ovrtx 运行时 wheel(公开 PyPI 上发布的 ovrtx 软件包)默认 不会 安装,必须显式选择。OVRTX 不需要 Isaac Sim。

通过 Isaac Lab CLI 使用 ov[ovrtx] 选项安装:

# Install the ovrtx runtime wheel on top of an existing install
./isaaclab.sh -i ov[ovrtx]

备注

单独使用 ov 选项 不会 安装任何运行时 wheel,因为源码包已包含在核心安装中。请使用 ov[ovrtx] 或 ov[all] 安装 ovrtx 依赖。

也可以直接从 PyPI 安装公开的 ovrtx 软件包:

pip install "ovrtx==0.5.1.385782"
  • 不透明渲染数据: create_render_data() 返回的渲染数据对象传给后续渲染器方法。调用方应将其视为完全不透明的对象;通过属性读写检查或修改它是不恰当的用法,会破坏 API 约定。

备注

BaseRenderer 仍在积极开发,可能不经通知就改变。

异步渲染#

async_rendering 在渲染下一张图像时,返回相机的前一次采集结果,使渲染能够与仿真及 Python 工作重叠。首次采集(包括重置后的首次采集)会等待新图像,ovstage 路径保持同步。

延迟为一次采集,不一定等于一个物理步或控制步。状态观测仍是当前值,因此启用此选项会改变策略观测的时序,训练可能需要考虑该延迟。物理与策略计算也可能使用 GPU。

对于每个环境步采集一次的相机,稳态运行过程如下:

Synchronous:   physics k -> submit image k -> wait/read image k -> policy
Asynchronous:  physics k -> submit image k -> wait/read image k-1 -> policy
                                |                                 |
                                +---- image k renders ------------+--> physics k+1

首次准备完成后立即返回第一张图像,下一次采集时会再返回一次。

每个相机持有自己的待发布观测。读取相机 A 不会改变相机 B 的像素或元数据,即使它们共享一次原生渲染提交。重置丢弃该相机的待发布观测。部分环境重置会重新准备整个平铺相机产品,不会使其他相机失效。

camera.data.pos_w 、 camera.data.intrinsic_matrices 等实时字段仍是当前值。将延迟像素与位姿或标定配对时,应使用采集元数据,例如进行深度反投影时:

data = camera.data
depth = data.output["distance_to_image_plane"]
capture = data.info["distance_to_image_plane"]["capture"]
position, orientation = capture["pos_w"], capture["quat_w_world"]
intrinsics, frame = capture["intrinsic_matrices"], capture["frame"]

之后的采集不会改变已有采集元数据。直接调用渲染器时,在提交采集前使用 prepare_capture() ,通过 read_output() 发布结果。

SDP 填充渲染器持有的变换与几何缓冲区,包括可变形网格、粒子和线缆。两个缓冲区在每次写入时交替使用,只有 OVRTX 消费完后才能复用。因此,物理仿真可以在前一次采集仍在渲染时更新实时数组。

另请参阅#