glBufferData

glbufferdata.png
glBuffeData(なんのバッファか,作るバッファのサイズbyte,渡すデータ,usage);

直前にglBindBufferされたバッファIDに対してデータを渡します

第一引数 なんのバッファか

定数名 用途 使用条件
GL_ARRAY_BUFFER 頂点データのバッファ
GL_COPY_READ_BUFFER
GL_COPY_WRITE_BUFFER
GL_DRAW_INDIRECT_BUFFER
GL_ELEMENT_ARRAY_BUFFER 頂点インデックスのバッファ
GL_PIXEL_PACK_BUFFER
GL_PIXEL_UNPACK_BUFFER
GL_TEXTURE_BUFFER
GL_TRANSFORM_FEEDBACK_BUFFER
GL_UNIFORM_BUFFER.
GL_ATOMIC_COUNTER_BUFFER   OpenGL 4.2以上
GL_DISPATCH_INDIRECT_BUFFER   OpenGL 4.3以上
GL_SHADER_STORAGE_BUFFER   OpenGL 4.3以上
GL_QUERY_BUFFER OpenGL4.4以上

usage

GL_STREAM_DRAW VBOデータが毎フレーム変更される VBOデータはアプリケーションから転送され,OpenGL描画に用いられる.
GL_STREAM_READ VBOデータが毎フレーム変更される VBOデータはGLから転送され,アプリケーションで読み込まれる
GL_STREAM_COPY VBOデータが毎フレーム変更される VBOデータはGLから転送され,OpenGL描画に用いられる.
GL_STATIC_DRAW VBOデータ変更なし.VBOデータはアプリケーションから転送され,OpenGL描画に用いられる.
GL_STATIC_READ VBOデータ変更なし.VBOデータはGLから転送され,アプリケーションで読み込まれる
GL_STATIC_COPY VBOデータ変更なし.VBOデータはGLから転送され,OpenGL描画に用いられる.
GL_DYNAMIC_DRAW VBOデータが頻繁に変更される。VBOデータはアプリケーションから転送され,OpenGL描画に用いられる..
GL_DYNAMIC_READ VBOデータが頻繁に変更される。VBOデータはGLから転送され,アプリケーションで読み込まれる
GL_DYNAMIC_COPY VBOデータが頻繁に変更される。VBOデータはGLから転送され,OpenGL描画に用いられる.

glBufferDataをした時に、バッファのサイズは決まってしまうようだ。
あとでglBufferSubDataで付け足そう、なんてことはできない。
glBufferDataはnewで確保するようなもので、あとからつけたしたいなら、この時点でたくさん確保しておくこと。

メモリのサイズ

メモリのサイズを超えるとOpenGLのエラーGL_OUT_OF_MEMORYエラーになるらしい。

注意

最初にたくさん確保しといてあとからglBufferSubData()で入れるつもりなら、

glBufferData(GL_ARRAY_BUFFER,バッファに入れる合計データサイズbyte,0, GL_STATIC_DRAW);

本来データポインタを渡すべきところを0にしておくこと。
ここで何かの配列ポインタを渡した場合、glBufferDataは指定されたサイズ目一杯データを入れようとがんばってしまってエラーになるぞ。
つまり、データポインタとして渡した配列のサイズ以上のサイズを第2引数に渡さないでねってこと。

WebGLの場合

  gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);//verticesがnew Float32Arrayで囲んであるならこっち
 gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(verts), gl.STATIC_DRAW);

gl

サポートサイト Wikidot.com gl