Loading article…
頂点バッファオブジェクト(VBO)は、OpenGLの機能の一つで、非即時モードレンダリングのために頂点データ(位置、法線ベクトル、色など)をビデオデバイスにアップロードするメソッドを提供します。VBOは、データがシステムメモリではなくビデオデバイスのメモリに格納されるため、ビデオデバイスが直接レンダリングできることから、即時モードレンダリングに比べて大幅なパフォーマンス向上を実現します。これはDirect3Dの頂点バッファに相当します。
頂点バッファオブジェクトの仕様は、OpenGLバージョン1.5(2003年)の時点でOpenGLアーキテクチャレビューボードによって標準化されました(2011年11月24日にWayback Machineにアーカイブ)。VBOの標準化以前にも、 Nvidiaが作成した拡張機能「頂点配列範囲」[ 1 ]またはATIの「頂点配列オブジェクト」[ 2 ]拡張機能によって同様の機能が利用可能でした。
以下の機能は、VBOへのアクセスと操作の中核を成すものです。
//VBOを初期化します - プログラムの開始時に一度だけ実行します//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から三角形を描画します - 各時間ウィンドウ、ビューポイント、またはデータ変更を実行します//この配列で、ストライドがゼロの頂点ごとに3つの座標を確立します。ここで必要ですglVertexPointer ( 3 , GL_FLOAT , 0 , NULL );//頂点を含む配列を確立します(法線、色、テクスチャ座標などは含みません)glEnableClientState ( GL_VERTEX_ARRAY );//実際に三角形を描画し、指定された頂点の数を指定しますglDrawArrays ( GL_TRIANGLES , 0 , sizeof ( data ) / sizeof ( float ) / 3 );//ディスプレイを強制的に描画するglFlush ();頂点シェーダー:
/*----------------- "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 のバージョンを指定します。精度高位浮動小数点数; // ビデオカードドライバが正しく機能するには、この行が必要です。出力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 shaderAttribute = 0 ;/* 三角形の頂点 (反時計回り) */ float data [ 3 ][ 3 ] = { { 0.0 , 1.0 , 0.0 }, { -1.0 , -1.0 , 0.0 }, { 1.0 , -1.0 , 0.0 } };/*---------------------- VBO の初期化 - (注: プログラムの開始時に一度だけ実行) ---------------------*/ /* 新しい 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 );/* 実際に三角形を描画します。glDrawArrays を呼び出すことで提供される頂点の数を指定し、 データが三角形であり、0~3 個の頂点を描画したいことを伝えます。*/ glDrawArrays ( GL_TRIANGLES , 0 , ( sizeof ( data ) / 3 ) / sizeof ( GLfloat )); /*---------------------------------------------------------------*/{{cite web}}: CS1 maint: bot: 元の URL の状態が不明です (リンク)