Geometry
v9 的 Geometry 是纯 CPU 容器:保存类型化数组、索引与布局,
不持有 GPU 缓冲。上传与绘制由 Model 完成。
构造参数
| 参数 | 说明 |
|---|---|
topology | 图元类型:point-list、line-list、line-strip、triangle-list、triangle-strip |
attributes | 属性名字到类型化数组或 { value, size } 的映射 |
indices | 索引数组,可选 |
vertexCount | 顶点数量,未提供时由属性或索引推算 |
bufferLayout | 显式缓冲区布局,未提供时按属性自动生成 |
id | 调试标识 |
属性与方法
| 成员 | 说明 |
|---|---|
topology | 图元类型 |
attributes | CPU 属性,保留调用方给的名字 |
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)。