頂点バッファオブジェクト

頂点バッファオブジェクトVBO)は、非即時モードレンダリングのために頂点データ(位置法線ベクトル、色など)をビデオデバイスにアップロードするためのメソッドを提供するOpenGLの機能です。VBOは、データがシステムメモリではなくビデオデバイスメモリに格納されるため、ビデオデバイスで直接レンダリングでき、即時モードレンダリングに比べてパフォーマンスが大幅に向上します。これらはDirect3D頂点バッファに相当します。

頂点バッファオブジェクトの仕様は、OpenGLバージョン1.5(2003年)時点でOpenGLアーキテクチャレビュー委員会(Wayback Machineに2011年11月24日アーカイブ)によって標準化されています。VBOの標準化以前にも、 NVIDIAが作成した拡張機能「頂点配列範囲」[1]ATIの拡張機能「頂点配列オブジェクト」[2]を介して同様の機能が利用可能でした。

基本的なVBO関数

次の関数は、VBO のアクセスと操作の中核を形成します。

OpenGL 1.4の場合:
glGenBuffersARB (サイズ n, uint *バッファ)
新しい VBO を生成し、その ID 番号を符号なし整数として返します。ID 0 は予約されています。
glBindBufferARB (列挙型ターゲット、uint バッファ)
以前に作成したバッファをアクティブ VBO として使用します。
glBufferDataARB (列挙型ターゲット、sizeiptrARB サイズ、const void *データ、列挙型の使用法)
アクティブな VBO にデータをアップロードします。
glDeleteBuffersARB (サイズ n、定数 *バッファ)
指定された配列または VBO ID から指定された数の VBO を削除します。
OpenGL 2.1[3] 、 OpenGL 3.x [4]、OpenGL 4.xでは、[5]
glGenBuffers (サイズ n, uint *バッファ)
新しい VBO を生成し、その ID 番号を符号なし整数として返します。ID 0 は予約されています。
glBindBuffer (列挙型ターゲット、uint バッファ)
以前に作成したバッファをアクティブ VBO として使用します。
glBufferData (列挙型ターゲット、sizeiptrARBサイズ、const void *データ、列挙型の使用法)
アクティブな VBO にデータをアップロードします。
glDeleteBuffers (サイズ n, 定数 *バッファ)
指定された配列または VBO ID から指定された数の VBO を削除します。

使用例

C言語でOpenGL 2.1を使用

//VBO を初期化します - プログラムの開始時に 1 回だけ実行します//VBO 識別子を保持する変数を作成しますGLuint triangleVBO ; //三角形の頂点(反時計回り)float data [] = { 1.0 , 0.0 , 1.0 , 0.0 , 0.0 , -1.0 , -1.0 , 0.0 , 1.0 }; //上記が機能しない場合は、float data[] = {0.0, 1.0, 0.0, -1.0, -1.0, 0.0, 1.0, -1.0 , 0.0 }; を試してください。           //新しい VBO を作成し、変数 id を使用して VBO ID を格納しますglGenBuffers ( 1 , & triangleVBO ); //新しい VBO をアクティブにするglBindBuffer ( GL_ARRAY_BUFFER , triangleVBO ); // 頂点データをビデオデバイスにアップロードします。glBufferData ( GL_ARRAY_BUFFER , sizeof ( data ), data , GL_STATIC_DRAW );   //新しいVBOをアクティブにします。初期化以降に変更があった場合はここで繰り返します。glBindBuffer ( GL_ARRAY_BUFFER , triangleVBO ); // VBO から三角形を描画 - ウィンドウ、ビュー ポイント、またはデータが変更されるたびに実行// この配列で、ストライド 0 の頂点ごとに 3 つの座標を確立します。ここで必要ですglVertexPointer ( 3 , GL_FLOAT , 0 , NULL );   // 配列に頂点 (法線、色、テクスチャ座標などではない) が含まれるようにします。glEnableClientState ( GL_VERTEX_ARRAY );// 提供された頂点の数を指定して、実際に三角形を描画します。glDrawArrays ( GL_TRIANGLES , 0 , sizeof ( data ) / sizeof ( float ) / 3 );      //ディスプレイを今すぐ描画するように強制するglFlush ();

C言語ではOpenGL 3.xとOpenGL 4.xを使用する

頂点シェーダー:

/*----------------- "exampleVertexShader.vert" -----------------*/#version 150 // 使用している GLSL のバージョンを指定します。// in_Position はvec3 in_Position属性インデックス 0("shaderAttribute") にバインドされました  void main ( ) { gl_Position = vec4 ( in_Position.x , in_Position.y , in_Position.z , 1.0 ) ; } / * ---------------------------------------------------------------- * /        


フラグメントシェーダー:

/*---------------- "exampleFragmentShader.frag" ----------------*/#version 150 // 使用している GLSL のバージョンを指定します。precision highp float ; // ビデオカードドライバが正しく機能するにはこの行が必要です   vec4 fragColorを出力します  void main () { fragColor = vec4 ( 1.0 , 1.0 , 1.0 , 1.0 ); //各フラグメントの色を白に設定} /*----------------------------------------------------------------*/      


メイン OpenGL プログラム:

/*--------------------- メイン OpenGL プログラム ---------------------*//* VBO 識別子を保持する変数を作成します */ GLuint triangleVBO ; /* これはシェーダー プログラムへのハンドルです */ GLuint shaderProgram ;   /* これらのポインターはシェーダー ソース コード ファイルの内容を受け取ります */ GLchar * vertexSource * fragmentSource ;  /* これらはシェーダーを参照するために使用されるハンドルです */ GLuint vertexShader fragmentShader ;  const unsigned intシェーダー属性= 0 ;     /* 三角形の頂点(反時計回り) */ float data [ 3 ][ 3 ] = { { 0.0 , 1.0 , 0.0 }, { -1.0 , -1.0 , 0.0 }, { 1.0 , -1.0 , 0.0 } };                  /*---------------------- VBO を初期化します - (注: プログラムの開始時に 1 回のみ実行します) ---------------------*/ /* 新しい VBO を作成し、変数 "triangleVBO" を使用して VBO ID を保存します */ glGenBuffers ( 1 , & triangleVBO ); /* 新しい VBO をアクティブにする */ glBindBuffer ( GL_ARRAY_BUFFER , triangleVBO ); /* 頂点データをビデオデバイスにアップロードします */ glBufferData ( GL_ARRAY_BUFFER , sizeof ( data ), data , GL_STATIC_DRAW );   /* 座標データが属性インデックス 0 (shaderAttribute) に入り、頂点ごとに 3 つの float が含まれることを指定します */ glVertexAttribPointer ( shaderAttribute , 3 , GL_FLOAT , GL_FALSE , 0 , 0 );     /* 属性インデックス 0 (shaderAttribute) を使用中として有効にする */ glEnableVertexAttribArray ( shaderAttribute );/* 新しい VBO をアクティブにします。 */ glBindBuffer ( GL_ARRAY_BUFFER , triangleVBO ); /*------------------------------------------------------------------------------------------------------------------*/ /*--------------------- ファイルから頂点シェーダとフラグメント シェーダをロードしてコンパイルします --------------------*/ /* シェーダを適切なバッファに読み込みます */ vertexSource = filetobuf ( "exampleVertexShader.vert" ); fragmentSource = filetobuf ( "exampleFragmentShader.frag" );    /* 新しいシェーダー オブジェクトのハンドルに「名前」を割り当てます */ vertexShader = glCreateShader ( GL_VERTEX_SHADER ); fragmentShader = glCreateShader ( GL_FRAGMENT_SHADER );    /* ソース コード バッファーを各ハンドルに関連付けます */ glShaderSource ( vertexShader , 1 , ( const GLchar ** ) & vertexSource , 0 ); glShaderSource ( fragmentShader , 1 , ( const GLchar ** ) & fragmentSource , 0 );        /* 一時的に割り当てられたメモリを解放します */ free ( vertexSource ); free ( fragmentSource );/* シェーダオブジェクトをコンパイルします */ glCompileShader ( vertexShader ); glCompileShader ( fragmentShader ); /*------------------------------------------------------------------------------------------------------------------*//*-------------------- シェーダー プログラムを作成し、シェーダーをアタッチしてリンクします ---------------------*/ /* プログラム ハンドルに「名前」を割り当てます */ shaderProgram = glCreateProgram ();  /* シェーダーをプログラムにアタッチします */ glAttachShader ( shaderProgram , vertexShader ); glAttachShader ( shaderProgram , fragmentShader );  /* 属性インデックス 0 (shaderAttribute) を in_Position にバインドします */ /* "in_Position" は、頂点シェーダ内の "data" 配列の内容を表します */ glBindAttribLocation ( shaderProgram shaderAttribute "in_Position" );  /* シェーダープログラムのリンク*/ glLinkProgram ( shaderProgram ); /*----------------------------------------------------------------------------------------------------------------*//* シェーダ プログラムをアクティブに使用されているように設定します */ glUseProgram ( shaderProgram );/* 背景色を黒に設定します */ glClearColor ( 0.0 , 0.0 , 0.0 , 1.0 );   /* 背景を黒色でクリアします */ glClear ( GL_COLOR_BUFFER_BIT );/* 実際に三角形を描画します。 データは三角形であり、0 ~ 3 個の頂点を描画することを指定しながら、 glDrawArrays を呼び出して頂点の数を指定します*/ glDrawArrays ( GL_TRIANGLES , 0 , ( sizeof ( data ) / 3 ) / sizeof ( GLfloat )); /*---------------------------------------------------------------*/      

参考文献

  1. ^ 「GL_NV_vertex_array_range ホワイトペーパー」。2004年8月17日時点のオリジナルよりアーカイブ2024年6月24日閲覧。{{cite web}}: CS1 maint: bot: original URL status unknown (link)
  2. ^ “ATI_vertex_array_object”. 2012年7月4日時点のオリジナルよりアーカイブ2011年8月12日閲覧。
  3. ^ 「OpenGL 2.1 関数リファレンス」。2008年2月17日時点のオリジナルよりアーカイブ2008年2月11日閲覧。
  4. ^ 「OpenGL 3.3 関数リファレンス」。
  5. ^ 「OpenGL 4.2 関数リファレンス」。2013年7月15日時点のオリジナルよりアーカイブ2012年4月6日閲覧。
  • 頂点バッファオブジェクトのホワイトペーパー
Retrieved from "https://en.wikipedia.org/w/index.php?title=Vertex_buffer_object&oldid=1323911273"