跳到主要内容

高斯泼溅数据格式

GSplatFormat 描述 GPU 纹理存储方式并生成读取代码,定义数据流名称、像素格式和属性提取代码。

备注

此功能基于渲染架构。

概览​

数据存于称为流的 GPU 纹理,每条有名称和像素格式,例如 PIXELFORMAT_RGBA32F,由 GSplatFormat 定义及提供读取代码。

着色器访问​

生成的函数通过全局 splat 结构确定读取哪个单元。

当前索引​

默认读取自身,setSplat(index) 可切换:

setSplat(otherIndex); // Set the splat index for subsequent reads
vec3 pos = getCenter(); // Now reads from otherIndex

加载函数​

每条流生成两个函数:

函数说明
load{StreamName}()读取 setSplat() 设置的当前 splat.uv
load{StreamName}WithIndex(index)直接读取指定索引

例如 dataCenter 生成:

  • loadDataCenter():当前索引。
  • loadDataCenterWithIndex(index):指定索引。
// Read from specific index without changing current splat
vec4 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() 定制复制。
  • 读写自定义数据。

另请参见​