表面与纹理#
**表面(surface)**描述实体渲染时的外观:颜色、光泽度、透明度和纹理贴图。每个实体最多可以有三份彼此独立的描述:
修改表面绝不会改变实体的运动或碰撞方式,只会改变渲染出的图像。如果省略表面,Genesis World 会使用 gs.surfaces.Default(一种 Disney 原理化 BSDF),并沿用资产文件中已定义的任何材质。
覆盖所有表面类型的可运行脚本是 examples/rendering/demo.py:
scene.add_entity(
morph=gs.morphs.Mesh(file="meshes/sphere.obj", scale=0.5, pos=(0.0, -0.6, 0.0)),
surface=gs.surfaces.Smooth(color=(0.6, 0.8, 1.0)),
)
选择表面#
每种表面都是基于物理的(PBR)材质,各类型之间的区别只在默认值。挑一个最接近你需求的类型,再覆盖单独的属性。
表面 |
说明 |
主要默认值 |
|---|---|---|
|
Disney 原理化 BSDF;通用表面 |
|
哑光塑料 |
|
|
亮面塑料 |
|
|
接近镜面的塑料 |
|
|
带光谱色调的导体 |
|
|
镜面反射与折射 |
|
|
针对水调校的玻璃 |
|
|
发光;用作光源 |
— |
Iron、Gold、Copper 和 Aluminium 是指定了对应 metal_type 的 Metal 快捷方式。metal_type 的完整取值集合为 "aluminium"、"gold"、"copper"、"brass"、"iron"、"titanium"、"vanadium" 和 "lithium",每种都带有自己的折射率。
# both spheres are gold; the second spells out what the shortcut sets
scene.add_entity(morph=gold_sphere, surface=gs.surfaces.Gold())
scene.add_entity(morph=gold_sphere, surface=gs.surfaces.Metal(metal_type="gold"))
设置颜色和 PBR 属性#
每个 PBR 通道实质上都是一张纹理(见下文),但如果某个通道只存一个常量,就可以改用快捷参数,而不必传入纹理对象。常用的快捷参数有 color、roughness、opacity、emissive、metallic 和 ior:
surface = gs.surfaces.Default(
color=(0.8, 0.2, 0.2), # base (diffuse) color, RGB in [0, 1]
roughness=0.4, # 0 = mirror-smooth, 1 = fully matte
metallic=0.0, # 0 = dielectric, 1 = metal
)
快捷参数映射到通道的方式带来两个限制:
快捷参数和它对应的纹理不能同时设置:同时传入
color=...与diffuse_texture=...会报错,因为纹理本身已经携带颜色。快捷参数只对表面实际拥有的通道生效。
metallic在Default/BSDF上有意义;Metal、Glass以及各种塑料会忽略它,因为它们的反射特性由其类型决定。
Genesis World 把颜色的第四个分量视为不透明度,因此 color=(r, g, b, a) 是让表面半透明的简洁写法:
# 50% transparent glossy plastic
gs.surfaces.Smooth(color=(1.0, 1.0, 1.0, 0.5))
纹理#
当某个属性在表面上各处不同时(木纹、喷绘标志、粗糙度贴图),应提供纹理而不是常量。纹理类位于 gs.textures 下:
gs.textures.ColorTexture(color=...):单一均匀的颜色。等价于color快捷参数,在某个参数要求传入纹理对象时很有用。gs.textures.ImageTexture(image_path=..., encoding=...):按网格 UV 坐标采样的图像贴图。gs.textures.BatchTexture:一叠纹理,每个环境一张,用于并行渲染。
把纹理赋给它所驱动的通道。基础色对应 diffuse_texture;数据贴图对应 roughness_texture、normal_texture、opacity_texture 等:
surface = gs.surfaces.Rough(
diffuse_texture=gs.textures.ImageTexture(image_path="textures/checker.png"),
roughness_texture=gs.textures.ImageTexture(image_path="rough.png", encoding="linear"),
normal_texture=gs.textures.ImageTexture(image_path="normal.png", encoding="linear"),
)
Warning
凡是存储数据而非颜色的贴图(粗糙度、金属度、法线和透明度贴图),都要设置 encoding="linear"。默认的 encoding="srgb" 会施加 gamma 校正,这对彩色图像是正确的,但会破坏数据贴图。Genesis World 会把 .hdr 和 .exr 文件强制设为 linear。
Genesis World 先相对于你的工作目录解析图像路径,再相对于随包附带的资产目录(genesis/assets),因此 "textures/checker.png" 加载的是随库提供的棋盘格图像。加载的资产(例如 .glb 或带纹理的 .obj)会自带表面;只有当你想要覆盖它时,才需要向 add_entity 传入 surface。
为光线追踪场景打光#
在Nyx 光线追踪器中,灯光不是特殊对象:它们就是带有 Emission 表面的普通实体。环境贴图是把同样的思路用到背景上:一张包裹住场景的发光图像,为其中的一切提供光照。
下面这段代码摘自 examples/rendering/demo.py,它设置了一个 HDRI 风格的环境贴图和一盏面光源:
scene = gs.Scene(
renderer=gs.renderers.RayTracer(
env_surface=gs.surfaces.Emission(
emissive_texture=gs.textures.ImageTexture(image_path="textures/indoor_bright.png"),
),
env_radius=15.0, # meters; the environment sphere's radius
env_euler=(0, 0, 180), # extrinsic x-y-z, degrees; rotates the map
lights=[
{"pos": (0.0, 0.0, 10.0), "radius": 3.0, "color": (15.0, 15.0, 15.0)},
],
),
)
Note
表面在交互式查看器的光栅化器和光线追踪器中都能渲染,但反射、折射、透射以及基于发光的照明只有光线追踪器才能完整呈现。选择与配置渲染器的方法见渲染。
可视化视觉网格之外的内容#
vis_mode 决定渲染器绘制实体的哪一套几何,与表面的材质无关。它对基于粒子的实体最为重要,这类实体的“形状”是点云而不是网格:
# draw a fluid entity as its raw particles
gs.surfaces.Rough(color=(0.6, 0.8, 1.0), vis_mode="particle")
# reconstruct a smooth surface mesh from those particles
gs.surfaces.Glass(color=(0.7, 0.85, 1.0, 0.7), vis_mode="recon")
可接受的取值为 "visual"、"collision"、"particle"、"sdf" 和 "recon"。用 "collision" 可以查看物理仿真实际看到的碰撞几何体。
泡沫与水花#
快速运动的粒子流体会夹带空气:破碎波峰上的白水、溅落时飞出的水花、被卷到水面以下的气泡。在光线追踪器中,Genesis World 把这些渲染为粒子流体周围的次级泡沫粒子。泡沫只是一种渲染效果,不会影响物理仿真,光栅化器也会忽略它。
在流体的表面上设置 generate_foam=True 即可启用,并通过 foam_options 对象调节外观:
scene.add_entity(
material=gs.materials.SPH.Liquid(),
morph=gs.morphs.Box(pos=(0.0, 0.0, 0.5), size=(0.4, 0.4, 0.4)),
surface=gs.surfaces.Water(
vis_mode="recon", # foam sits on the reconstructed fluid surface
generate_foam=True,
foam_options=gs.options.FoamOptions(
radius_scale=0.2, # foam particle radius relative to a fluid particle
k_foam=1000.0, # foam particles generated per frame
spray_decay=2.0,
foam_decay=1.0,
bubble_decay=5.0,
),
),
)
gs.options.FoamOptions 把效果拆成三个群体,每个群体有各自的消散速率(数值越大,该群体消失得越快):
radius_scale: 泡沫粒子半径相对于流体粒子半径的比例。默认0.2。k_foam: 每帧生成的泡沫粒子数量。默认1000.0。spray_decay: 空中水花的消散速率。默认2.0。foam_decay: 浮于表面的泡沫的消散速率。默认1.0。bubble_decay: 水下气泡的消散速率。默认5.0。color: 泡沫粒子的 RGBA 色调。默认(0.7, 0.7, 0.7, 0.7)。