gltfLoader 顶点颜色问题
gltfLoader vertexColors issue
我正在使用 glTF-transform 创建 GLB(由 gltf-pack 压缩),并且在 THREE.GLTFLoader 中遇到了奇怪的行为。
我正在使用顶点颜色并以这种方式传递它们
我的管道看起来像:
创建 Glb -> gltfpack -> 使用 gltfLoader -> mergeBufferGeometry -> render() 在 fragmentShader
中使用不透明度加载到三个
const primitive = doc
.createPrimitive()
.setAttribute('POSITION', position)
.setIndices(indices);
const positionArr = position.getArray();
if (positionArr) {
const colors = [];
const colorAccessor = doc
.createAccessor()
.setType('VEC4')
.setBuffer(buffer);
const rgba = this.toRGBAColor(Number.parseInt(sPrim.c));
for (let i = 0; i < position.getCount(); i++) {
colors.push(rgba[0], rgba[1], rgba[2], rgba[3]);
}
colorAccessor.setArray(new Float32Array(colors));
primitive.setAttribute('COLOR', colorAccessor);
}
mesh.addPrimitive(primitive);
在这种情况下,颜色是正确的,RGBA 从 0 到 1
console.log(primitive.getAttribute('COLOR')?.getArray());
-> Float32Array(16) [
0.4627451002597809, 0.27450981736183167,
0.20000000298023224, 1,
0.4627451002597809, 0.27450981736183167,
0.20000000298023224, 1,
0.4627451002597809, 0.27450981736183167,
0.20000000298023224, 1,
0.4627451002597809, 0.27450981736183167,
0.20000000298023224, 1
]
但是,当我将模型加载到 gltfLoader 中时,颜色属性数组变为 Uint8Array(即使对于 alpha,值也为 0-255)
那么,传递顶点颜色的正确方法是什么?
COLOR_0
(不是 COLOR
)是顶点颜色属性的预期名称——模型可以有多个顶点颜色集。 gltfpack 正在“规范化”float32 颜色,这意味着它将 [0, 1] 中的 float32 值替换为 [0, 255] 中的 uint8 值,需要减少约 75% space。 three.js 两者都可以支持。
我正在使用 glTF-transform 创建 GLB(由 gltf-pack 压缩),并且在 THREE.GLTFLoader 中遇到了奇怪的行为。
我正在使用顶点颜色并以这种方式传递它们
我的管道看起来像: 创建 Glb -> gltfpack -> 使用 gltfLoader -> mergeBufferGeometry -> render() 在 fragmentShader
中使用不透明度加载到三个const primitive = doc
.createPrimitive()
.setAttribute('POSITION', position)
.setIndices(indices);
const positionArr = position.getArray();
if (positionArr) {
const colors = [];
const colorAccessor = doc
.createAccessor()
.setType('VEC4')
.setBuffer(buffer);
const rgba = this.toRGBAColor(Number.parseInt(sPrim.c));
for (let i = 0; i < position.getCount(); i++) {
colors.push(rgba[0], rgba[1], rgba[2], rgba[3]);
}
colorAccessor.setArray(new Float32Array(colors));
primitive.setAttribute('COLOR', colorAccessor);
}
mesh.addPrimitive(primitive);
在这种情况下,颜色是正确的,RGBA 从 0 到 1
console.log(primitive.getAttribute('COLOR')?.getArray());
-> Float32Array(16) [
0.4627451002597809, 0.27450981736183167,
0.20000000298023224, 1,
0.4627451002597809, 0.27450981736183167,
0.20000000298023224, 1,
0.4627451002597809, 0.27450981736183167,
0.20000000298023224, 1,
0.4627451002597809, 0.27450981736183167,
0.20000000298023224, 1
]
但是,当我将模型加载到 gltfLoader 中时,颜色属性数组变为 Uint8Array(即使对于 alpha,值也为 0-255)
那么,传递顶点颜色的正确方法是什么?
COLOR_0
(不是 COLOR
)是顶点颜色属性的预期名称——模型可以有多个顶点颜色集。 gltfpack 正在“规范化”float32 颜色,这意味着它将 [0, 1] 中的 float32 值替换为 [0, 255] 中的 uint8 值,需要减少约 75% space。 three.js 两者都可以支持。