トップページ
ひらく | たたむ | ページトップ
↓マウスで反転選択した文字を検索
OpenGL
   
ページ内検索 ページ外検索
検索したい文字を入力して
ENTERを押すと移動します。
\n
[ トップページ ]
[ ____CommandPrompt ] [ ____JScript ] [ ____MySQL ] [ ____Cygwin ] [ ____Java ] [ ____Emacs ] [ ____Make ] [ ____Perl ] [ ____Python ] [ ____OpenGL ] [ ____C# ] [ ____StyleSheet ] [ ____C++ ] [ ____Winsock ] [ ____Thread ] [ ____VisualStudio ] [ ____C ] [ ____Win32API ] [ ____Lua ] [ ____PhotoShop ]
ヘッダ検索
___

■ 頂点バッファオブジェクト(VBO)


  SAMPLE
     VBO 

___

■ BufferObjectに頂点配列(VertexArray)を配置する

DESC 頂点データをビデオメモリに配置することで描画を高速化する機能のこと。 アプリケーション側のメモリを解放もでき、 また CPU < -> GPU 間での頻繁なデータの転送も不要になる。 DEP VERSION::1.5
    App::onInit() {   

      glGenBuffers =
        (PFNGLGENBUFFERSPROC)wglGetProcAddress("glGenBuffers");      
      glBindBuffer =
        (PFNGLBINDBUFFERPROC)wglGetProcAddress("glBindBuffer");
      glBufferData =
        (PFNGLBUFFERDATAPROC)wglGetProcAddress("glBufferData");      


      // BufferObject ID を確保
      glGenBuffers( n, bufs );

      // buffer をバインドして頂点データ, インデックスデータのどちらかを指定する。

      // Buffer Object を選択して初期化
      glBindBuffer( GL_ARRAY_BUFFER, id );


      // 頂点属性
      struct Vertex {
        float vtx[3];
        float col[3]
      };

      // OpenGL側に記憶領域を確保してもらいアプリケーション側のデータをコピーする
      Vertex vtx[] = { 
                      0, 0, 0, 1, 1, 1, 
                      1, 0, 0, 1, 1, 1,  
                      1, 1, 0, 1, 1, 1,  
                      0, 1, 0, 1, 1, 1, 
                      };

      glBufferData( GL_ARRAY_BUFFER, sizeof(vtx), vtx, GL_STATIC_DRAW );

      
      // 頂点と同じようにインデックス用のVBOを作成する。
      glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, id );

      // インデックスデータをコピーする。
      unsigned short idx[] = { 0, 1, 2, 3 };
      glBufferData( GL_ELEMENT_ARRAY_BUFFER, sizeof(idx), idx, GL_STATIC_DRAW );

    }

  App::onDraw() {

    // 描画に利用する VBO を指定する。
    glBindBuffer( GL_ARRAY_BUFFER, id );
    glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, id );

    
    // VBO を利用するときは, 頂点データのポインタではなく VBO 内のオフセットを指定する。
    // インターリーブ型の配列のため stride は頂点ごとのバイト数を指定する。
    // pointer 引数には各頂点属性のオフセットを指定する。
    glVertexPointer( 3, GL_FLOAT, sizeof(Vertex), 0  )
    glColorPointer ( 3, GL_FLOAT, sizeof(Vertex), sizeof( float )*3;  )


    // 頂点配列を使うときは OpenGL にどこから Data をとるか指定する
    // Data を直接送るときも, BufferObject を利用するときも同じ

    // 頂点データは既に転送済のため, 要素数、要素型 オフセットのみを指定する。
    // VBO の先頭から指定するため offset = 0
    //
    glVertexPointer( 3, GL_FLOAT, 0, (GLvoid *)( (char*)0 ) );
    glVertexPointer( 3, GL_FLOAT, 0, (void *)0 );
    
    
    // 描画する。
    // VBO を利用しているので pointer はメインメモリのアドレスではなく 
    // インデックス用のVBO内のオフセットを指定する。
    glDrawElements( GL_QUADS, 1, GL_UNSIGNED_SHORT, 0 );
  }


終了時はバッファオブジェクトを解放する。
    App::onQuit() {
      glDeleteBuffers( n, bufs );
    }
TIP id = 0; GL は VBO を使用しなくなる glBindBuffer() ではじめて Bind すると作成 -> 2度目からは, Bind ( glBindTexture とおなじ ) BufferObject , ClientMemory 共に指定する Interface は同一
___

■ glGenBuffers

SYNTAX glGenBuffers( GLsizei n, // 取得する BufferObject の個数 GLuint *buf ) DESC n 個の BufferObject の ID を取得する

  // Buffer Object の生成
  glGenBuffers( 1, (GLuint *)&id_src );

___

■ glBindBuffer

SYNTAX glBindBuffer( GLenum tgt, // BufferObject のタイプ GLuint id // glGenBuffers で作成した ID ) DESC カレントの BufferObject を選択する 新規の Buffer ならば初期化される( 空Data の Object が作成される )

    // 選択をはずすには 0 を指定する
    glBindBuffer( GL_ARRAY_BUFFER, 0 );

    // 頂点配列を格納するためのバッファを作成するには GL_ARRAY_BUFFER
    glBindBuffer( GL_ARRAY_BUFFER, id );

    // Index を格納するには GL_ELEMENT_ARRAY_BUFFER を指定する
    glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, id );

___

■ glBufferData

SYNTAX glBufferData( GLenum tgt, GLsizeiptr size, // バッファオブジェクト全体のサイズ const GLvoid *data, // コピー元のデータ GLenum usage ) DESC Client Memory から BufferObject へデータをコピーする。 転送先は glBindBuffer() で指定しておく データは glBufferData() をコールした時点で転送される。 Specifies the expected usage pattern of the data store. The symbolic constant must be GL_STREAM_DRAW, GL_STREAM_READ, GL_STREAM_COPY, GL_STATIC_DRAW, GL_STATIC_READ, GL_STATIC_COPY, GL_DYNAMIC_DRAW, GL_DYNAMIC_READ, or GL_DYNAMIC_COPY. usage is a hint to the GL implementation as to how a buffer object's data store will be accessed. This enables the GL implementation to make more intelligent decisions that may significantly impact buffer object performance. It does not, however, constrain the actual usage of the data store. usage can be broken down into two parts: first, the frequency of access (modification and usage), and second, the nature of that access. The frequency of access may be one of these: STREAM The data store contents will be modified once and used at most a few times. STATIC The data store contents will be modified once and used many times. DYNAMIC The data store contents will be modified repeatedly and used many times. DRAW The data store contents are modified by the application, and used as the source for GL drawing and image specification commands. READ The data store contents are modified by reading data from the GL, and used to return that data when queried by the application. COPY The data store contents are modified by reading data from the GL, and used as the source for GL drawing and image specification commands.

    // buffer object 用の領域を確保と転送
    glBufferData( GL_ARRAY_BUFFER, 3*sizeof(float)*cnt, vtx, GL_STATIC_DRAW );



___

■ glDeleteBuffers

SYNTAX glDeleteBuffers( GLsizei n, GLuint *bufs ) DESC 指定 ID の BufferObject を解放する 不要になったら ServerMemory を解放すること






金利比較.COM
NINJAIDX 9