Three.jsでの整数頂点バッファの扱いについて
Q&A
Three.jsでの整数頂点バッファの扱いについて教えて下さい。r144を使用しています。
現在BufferGeometryとRawShaderMaterialを使った描画テストをしています。頂点データは型付配列Uint8ClampedArrayで保持しています(諸般の事情です)。
今まではあまり何も考えず以下のようにしていました。
geometry.setAttribute( 'position',
new THREE.BufferGeometry( vertices, 4 )
);
もともとUint8ClampedArrayだったものを小数として渡すほうがGPU側のメモリ消費量が大きいのではないかと考えました(実際の挙動はわかりませんが)。
1つ目の質問
上記の考え方は正しいでしょうか。シェーダ内で都度floatに変換する必要は生じますが、メモリ使用量が少なければ、頂点数が多いときには使えるのかなと思った次第です。
2つ目の質問
geometry.setAttribute( 'position',
new THREE.Uint8ClampedBufferAttribute( vertices, 4 )
);
上記のコードで頂点データを送ってみたところFirefoxのコンソールで以下のようなエラーが出ました。
WebGL warning: drawArraysInstanced:
Vertex attrib 0 requires data of type INT,
but is being supplied with type FLOAT.
しかし以下のように変更すると動きました。
geometry.setAttribute( 'position',
new THREE.Int32BufferAttribute( vertices, 4 )
);
「THREE.Uint8ClampedBufferAttribute」では頂点データを送ることができない(小数として送ってしまう)のでしょうか。GLSL内では以下のように受け取っています。
in ivec4 position;
自分で試したこと
以下のいずれを使った場合でも上記のエラーが出ました。
- Int16BufferAttribute
- Uint16BufferAttribute
- Int8BufferAttribute
- Uint8BufferAttribute
- Uint8ClampedBufferAttribute
「Uint32BufferAttribute」を使った場合は少しエラーが変わりました。
WebGL warning: drawArraysInstanced:
Vertex attrib 0 requires data of type INT,
but is being supplied with type UINT.
素人質問で恐縮です。識者の方、よろしくお願いします。
0