高斯泼溅数据格式
GSplatFormat 描述 GPU 纹理存储方式并生成读取代码,定义数据流名称、像素格式和属性提取代码。
备注
此功能基于渲染架构。
概览
数据存于称为流的 GPU 纹理,每条有名称和像素格式,例如 PIXELFORMAT_RGBA32F,由 GSplatFormat 定义及提供读取代码。
着色器访问
生成的函数通过全局 splat 结构确定读取哪个单元。
当前索引
默认读取自身,setSplat(index) 可切换:
- GLSL
- WGSL
setSplat(otherIndex); // Set the splat index for subsequent reads
vec3 pos = getCenter(); // Now reads from otherIndex
setSplat(otherIndex);
let pos = getCenter();
加载函数
每条流生成两个函数:
| 函数 | 说明 |
|---|---|
load{StreamName}() | 读取 setSplat() 设置的当前 splat.uv |
load{StreamName}WithIndex(index) | 直接读取指定索引 |
例如 dataCenter 生成:
- loadDataCenter():当前索引。
- loadDataCenterWithIndex(index):指定索引。
- GLSL
- WGSL
// Read from specific index without changing current splat
vec4 otherCenter = loadDataCenterWithIndex(neighborIndex);
let otherCenter = loadDataCenterWithIndex(neighborIndex);
适合访问邻居或比较多个单元。
文件资源格式
加载 PLY、SOG 或 LOD 时,根据文件自动创建,无需手动配置。
访问格式
通过资源访问:
const format = entity.gsplat.resource.format;
添加额外流
可添加额外流保存逐单元自定义数据,存储类型决定纹理分配:
备注
流式 SOG 不支持额外流,因为动态加载卸载时无法保留它们。
| 存储类型 | 说明 |
|---|---|
GSPLAT_STREAM_RESOURCE | 默认,由使用该资源的全部组件实例共享 |
GSPLAT_STREAM_INSTANCE | 每个组件独立创建纹理 |
资源级流
所有实例数据相同时用 RESOURCE,或省略 storage:
// Add a stream shared across all instances
resource.format.addExtraStreams([
{ name: 'customData', format: pc.PIXELFORMAT_RGBA8 }
]);
// Access the shared texture
const texture = resource.streams.getTexture('customData');
实例级流
每组件需独立数据时用 INSTANCE:
// Add a per-instance stream
resource.format.addExtraStreams([
{ name: 'instanceTint', format: pc.PIXELFORMAT_RGBA8, storage: pc.GSPLAT_STREAM_INSTANCE }
]);
// Access the instance texture via the component
const texture = entity.gsplat.getInstanceTexture('instanceTint');
if (texture) {
const data = texture.lock();
// Fill texture data per splat...
texture.unlock();
}
常见格式:
- PIXELFORMAT_RGBA8:四字节,打包标志或染色。
- PIXELFORMAT_RGBA16F:四半浮点,自定义属性。
- PIXELFORMAT_RGBA32F:四浮点,高精度。
备注
添加后不可移除。
程序化格式
通过 GSplatContainer 创建程序化数据时,需显式创建配置。可用内置格式,也可自行定义流和代码。
详见程序化数据,包括:
- createDefaultFormat 和 createSimpleFormat。
- 创建自定义流。
- 编写读取代码。
工作缓冲区格式
工作缓冲区有自己的中间数据格式,可添加流,在复制和绘制期间定制。
详见工作缓冲区格式:
- 添加额外流。
- 用 setWorkBufferModifier() 定制复制。
- 读写自定义数据。
另请参见
- GSplatFormat API
- 工作缓冲区格式:定制复制。
- 工作缓冲区渲染:定制绘制。
- 程序化数据:代码创建。
- 渲染架构