Skip to content

バッファオブジェクト

最終更新日時: 2025年08月25日 12:57

頂点バッファ、インデックスバッファ、uniform、データテクスチャをchromeの現時点の環境では利用できる

バッファGLSLでの使用Three.jsでの記述特徴と制限(WebGL)
VBO (頂点バッファ)in vec3 positiongeometry.setAttribute使える(WebGL1/2)
uniformuniform float timematerial.uniforms.time.value 制限:uniform数に上限あり
DataTexturesampler2D + .r/.g/...DataTexture などWebGL1/2で安全な代替手段
EBO(インデックスバッファ)自動geometry.setIndex()使える(WebGL1/2)
UBO(uniformブロック)uniform MyBlock { ... };Three.js非対応WebGL2のみ/Three.js未対応
SSBO(read/write buffer)buffer MyData { ... };WebGL非対応OpenGL 4.3以上のみ(不可)
  • Vertex Buffer Object (VBO):頂点座標や法線、UVなどを格納
  • uniform:
  • DataTexture: GPU上のテクスチャとして格納される
  • Element Buffer Object (EBO):面を定義するインデックス情報を格納。vertexのIDを3つ単位で使って三角ポリゴンを生成
  • Uniform Buffer Object (UBO):複数のuniform変数を構造化して転送。WebGL2以降、Threejsでは未対応
  • Shader Storage Buffer Object (SSBO):GLSLから読み書き可能な大容量バッファ。WebGL未対応なのでchromeでは使えない
geometry.setAttribute('aOffset', new THREE.BufferAttribute(offsetArray, 3));
Three.js側
attribute vec3 aOffset; // vec3でもfloatでも
vertex shader側
material.uniforms.time.value = performance.now() * 0.001;
Three.js側
uniform float time;
vertex/fragment shader側
const data = new Float32Array(256 * 4);
const tex = new THREE.DataTexture(data, 256, 1, THREE.RGBAFormat, THREE.FloatType);
tex.needsUpdate = true;
material.uniforms.uDataTex = { value: tex };
Three.js側
uniform sampler2D uDataTex;
void main() {
vec4 v = texture2D(uDataTex, vec2(0.1, 0.0)); // X=0.1の位置のデータ取得
}
vertex/fragment shader側
  • 頂点の再利用をするために頂点にインデックス番号をつけて三角ポリゴンを定義する
  • インデックスバッファそのものにGLSLから直接アクセスはできない
const vertices = [
0, 0, 0, // 頂点0
1, 0, 0, // 頂点1
1, 1, 0, // 頂点2
0, 1, 0 // 頂点3
];
geometry.setAttribute('position', new THREE.Float32BufferAttribute(vertices, 3));
geometry.setIndex([0, 1, 2, 0, 2, 3]); // 三角形を2枚定義(0-1-2, 0-2-3)
Code :