经纬志
首页 / luma.gl / API 文档

Geometry

先看结论

v9 的 Geometry 是纯 CPU 容器:保存类型化数组、索引与布局, 不持有 GPU 缓冲。上传与绘制由 Model 完成。

最后验证 2026-11-03 · luma.gl 9.4 · 更新 2026-10-27 · 引用本文
new Geometry(props) → Geometry

构造参数

参数说明
topology图元类型:point-list、line-list、line-strip、triangle-list、triangle-strip
attributes属性名字到类型化数组或 { value, size } 的映射
indices索引数组,可选
vertexCount顶点数量,未提供时由属性或索引推算
bufferLayout显式缓冲区布局,未提供时按属性自动生成
id调试标识

属性与方法

成员说明
topology图元类型
attributesCPU 属性,保留调用方给的名字
indices索引属性,可能是 Uint16 或 Uint32
vertexCount解析后的顶点数量
bufferLayout与属性对应的缓冲区布局
getVertexCount()返回顶点数量
getAttributes()返回全部属性,包含索引
userData应用自带的元数据

构造一个三角形

const geometry = new Geometry({
  topology: 'triangle-list',
  attributes: {
    positions: new Float32Array([
      -0.6, -0.45, 0,
       0.6, -0.45, 0,
       0.0,  0.55, 0
    ]),
    colors: new Float32Array([
      0.95, 0.36, 0.32,
      0.98, 0.78, 0.35,
      0.35, 0.80, 0.95
    ])
  },
  indices: new Uint16Array([0, 1, 2])
});

console.log(geometry.getVertexCount()); // 3

属性名会映射到着色器的 in 变量。自动生成的布局按类型化数组推断格式: Float32Array 且每个顶点三个分量,对应 float32x3。 需要交错存储或自定义偏移时,显式传 bufferLayout。

交给 Model 绘制

const model = new Model(device, {
  geometry: geometry,
  vs: vsSource,
  fs: fsSource
});

const pass = device.beginRenderPass({ clearColor: [0.04, 0.06, 0.09, 1] });
model.draw(pass);
pass.end();

构造 Model 时,CPU 属性会被上传为缓冲区,vertexCount 与 bufferLayout 从几何体继承。后续改动几何体的 CPU 数据不会自动同步, 需要重新 setGeometry 或直接更新缓冲区。

GPUGeometry:已经上传的缓冲

需要自己管理缓冲区生命周期、或多份模型共享同一批缓冲时,用 GPUGeometry 包装已经创建好的 Buffer:

const gpuGeometry = new GPUGeometry({
  topology: 'triangle-list',
  vertexCount: 3,
  bufferLayout: [
    { name: 'positions', stepMode: 'vertex', format: 'float32x3' }
  ],
  attributes: {
    positions: device.createBuffer(new Float32Array([
      -0.6, -0.45, 0,
       0.6, -0.45, 0,
       0.0,  0.55, 0
    ]))
  },
  indices: null
});

const model = new Model(device, {
  geometry: gpuGeometry,
  vs: vsSource,
  fs: fsSource
});

GPUGeometry 不释放外部传入的缓冲区,谁创建谁销毁。 这类所有权划分在多个模型共享几何体时必须理清,否则会出现提前释放导致的绘制失败。

与 v8 的差别

v8 的 Geometry 同时管理 CPU 数据与 GPU 缓冲,构造时就要传设备。 v9 把它拆成两层:Geometry 只负责数据与布局, 上传与绑定交给 Model。迁移时,如果旧代码依赖 geometry.getBuffer() 之类的接口,需要在 v9 里改用 GPUGeometry 或直接持有 Buffer。

属性名先对齐再谈布局。几何体里的名字、着色器里的 in 变量、 显式布局里的 name 必须完全一致。三者一致后,格式只需与数组分量数匹配, 调试成本会低很多。

引用本文

经纬志(2026)。《Geometry》。https://www.jingweizhi.com/lumagl/api/geometry.html(访问日期 2026-11-03)。