跳到主要内容

LambdaRender 渲染入门

LambdaSim 提供 lambdasim.render.create_render(),可以在 Python 脚本中创建渲染会话,将场景保存为图片。程序完成渲染后退出,适合离线出图和自动生成图像。

本文使用 examples/lambda_render.py,创建地面、一个球、一盏矩形面积光和相机,输出一张带阴影的图片。几何由公开 API 创建,运行时无需准备外部模型资产。

运行示例​

在已配置好 LambdaSim 和 CUDA 渲染依赖、具有可用 cuda:0 的环境中,从 LambdaSim 仓库根目录执行:

.venv/bin/python examples/lambda_render.py

渲染完成后,图片保存在仓库内的 tmp/sphere_ground.png,分辨率为 960 × 640。输出目录由渲染 API 创建;再次运行会覆盖同名图片。

LambdaRender 渲染的球体、地面与面积光阴影

如图(上): 橙色球体放置在地面上,一盏矩形面积光照亮球面,并在地面形成阴影。图片由相机直接渲染生成。

场景与渲染流程​

下面五段代码按顺序衔接,使用同一个 scene。文末提供可直接执行的完整脚本。

1. 创建场景和几何​

import ektro as ek
import lambdasim.render
from lambdasim.scene.light_object import RectLightObject
from lambdasim.scene.scene import Scene

scene = Scene()
scene.add_plane__ektro(
path="/World/Ground",
width=12.0,
length=12.0,
color=(0.38, 0.43, 0.50),
)
scene.add_sphere__ektro(
path="/World/Sphere",
pos=(0.0, 0.0, 0.75),
radius=0.75,
segments=64,
rings=32,
static=True,
color=(0.85, 0.22, 0.07),
)

Scene() 保存本次渲染的场景对象。这里生成一块地面和一个橙色球体,尺寸按米设置。

球心高度和半径同为 0.75,因此球底恰好接触地面。后续灯光和相机也添加到这个 scene 中。

2. 添加灯光​

scene.add_light(RectLightObject(
"key",
size=(2.5, 2.5),
world_xform=ek.transform(ek.vec3(-3, -4, 6), ek.quat(0, 0, 0, 1)),
intensity=20.0,
cast_shadow=True,
))

RectLightObject 是矩形面积光,本例用这一盏灯照亮球体和地面。

  • size=(2.5, 2.5):光源宽、高均为 2.5 米。
  • world_xform:指定世界位置和朝向;本例位置为 (-3, -4, 6) 米。
  • intensity=20.0:设置灯光强度。
  • cast_shadow=True:启用阴影,使地面能显示球体的投影。

3. 配置相机​

camera = scene.add_camera("/root", name="Camera")
camera.set_local_RT(ek.vec3(0, -6, 3.5), ek.vec3(65, 0, 0))
camera.set_fov_y(40.0)
camera.set_resolution((960, 640))

scene.add_camera() 创建场景相机,后续渲染通过 camera.path 选择它。

  • set_local_RT():设置相机的局部平移和 XYZ 欧拉角,单位分别为米和度。
  • set_fov_y(40.0):设置竖直视场角为 40 度。
  • set_resolution((960, 640)):设置图片宽度为 960 像素、高度为 640 像素。

4. 创建和同步渲染会话​

renderer = lambdasim.render.create_render(
render_name="lambda_render",
scene=scene,
device="cuda:0",
spp=128,
)
renderer.update_scene()

create_render() 将渲染会话绑定到前面创建的 scene,使用 cuda:0,每像素采样 128 次。

renderer.update_scene() 将当前场景同步给渲染器。后续修改对象位置、几何、材质或灯光后,再调用它更新渲染器中的场景。

5. 渲染和释放​

renderer.render(camera=camera.path, output="tmp/sphere_ground.png")
renderer.close()

renderer.render() 使用第 3 步创建的相机,将图片保存到 tmp/sphere_ground.png。相对路径从运行命令所在目录计算,输出目录由 API 创建。

图片生成后,renderer.close() 释放渲染会话资源,脚本结束。

完整代码​

以下代码与示例的执行代码一致,省略了文件开头的运行说明。可从仓库根目录执行。

import ektro as ek
import lambdasim.render
from lambdasim.scene.light_object import RectLightObject
from lambdasim.scene.scene import Scene


def main(
) -> None:
"""渲染地面上的球和阴影。Render a sphere resting on the ground with shadows."""
# 创建程序化地面和球,球心高度等于半径。Create a procedural ground and a resting sphere.
scene = Scene()
scene.add_plane__ektro(
path="/World/Ground",
width=12.0,
length=12.0,
color=(0.38, 0.43, 0.50),
)
scene.add_sphere__ektro(
path="/World/Sphere",
pos=(0.0, 0.0, 0.75),
radius=0.75,
segments=64,
rings=32,
static=True,
color=(0.85, 0.22, 0.07),
)

# 添加场景灯光。Add a scene light.
scene.add_light(RectLightObject(
"key",
size=(2.5, 2.5),
world_xform=ek.transform(ek.vec3(-3, -4, 6), ek.quat(0, 0, 0, 1)),
intensity=20.0,
cast_shadow=True,
))

# 创建并设置相机。Create and configure the camera.
camera = scene.add_camera("/root", name="Camera")
camera.set_local_RT(ek.vec3(0, -6, 3.5), ek.vec3(65, 0, 0))
camera.set_fov_y(40.0)
camera.set_resolution((960, 640))

# 创建渲染器。Create the renderer.
renderer = lambdasim.render.create_render(
render_name="lambda_render",
scene=scene,
device="cuda:0",
spp=128,
)

# 同步场景并输出图片。Synchronize the scene and render an image.
renderer.update_scene()
renderer.render(camera=camera.path, output="tmp/sphere_ground.png")

# 释放渲染资源。Release rendering resources.
renderer.close()


# 直接运行示例。Run the example directly.
if __name__ == "__main__":
main()