渲染器#
渲染器为策略观测和合成数据流程生成相机传感器缓冲区。它们不同于 可视化器 ;后者为检查、调试和录制提供面向人的交互式视图。Isaac Lab 采用可插拔渲染器架构,所有实现均遵循 BaseRenderer 定义的接口。
Isaac Lab 支持三种渲染后端。下表概括其运行时要求和主要用途。执行方式、输出支持与限制见 渲染器详情 ,按后端划分的输出支持矩阵见 渲染器支持情况 。
选择渲染后端#
后端 |
是否需要 Isaac Sim? |
最适用于 |
|---|---|---|
Isaac RTX |
Yes |
完整传感器保真度、RTX 逼真渲染、PhysX 后端 |
OVRTX |
不需要(不依赖 Kit;需要 |
无需 Isaac Sim 即可获得 RTX 级渲染质量 |
Newton Warp |
不需要(不依赖 Kit) |
Newton 后端、快速训练 |
渲染器输出概览#
下方示例使用相同的场景、相机、光源、材质和初始条件。六个球体分别展示镜面、透明、半透明、哑光、光泽和自发光材质。RGB 动画展示球体落到桌面上的过程,其余输出为同一次运行中的静帧。静帧取自第六个渲染帧,以便运动向量等时序输出包含有效运动,同时球体仍接近初始位姿。
这些图像用于定性比较功能支持和画面特征,不是性能测试。不依赖 Kit 的渲染器使用 Newton 物理,Isaac RTX 使用 PhysX,因此球体的精确位姿可能不同。这里使用仅用于显示的色图,使标量、向量和标签输出易于观察;相机传感器仍返回文档所述的原始张量。相近的别名,以及距离或 ID 的变体没有逐一列出,因为它们不会呈现明显不同的视觉模式。
RGB 动画#
渲染器详情#
展开下方渲染器条目,查看执行方式、输出支持、限制和典型用途。上方图像只用于视觉比较,相机支持矩阵才是各后端输出支持的权威依据。
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 渲染器 文档。
如果轻量 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
常量漫反射
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
常量漫反射
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: 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: 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 个 。
架构概览#
渲染器系统由以下部分组成:
BaseRenderer :定义渲染生命周期和接口的抽象基类。
RendererCfg :
BackendCfg的子类;各后端扩展它以提供专用选项,并在class_type中声明具体实现。具体实现 :扩展软件包中的后端专用渲染器。
SimulationContext :在后端注册表中持有渲染器实例,通过
get_or_create_backend(renderer_cfg),在具体类型相同且配置相等的请求之间共享实例。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 消费完后才能复用。因此,物理仿真可以在前一次采集仍在渲染时更新实时数组。