現代3 Dグラフィックプログラミング学習--openglは異なるキャッシュオブジェクトを使用する(翻訳者追加)

2095 ワード

現代3 Dグラフィックプログラミング学習シリーズ翻訳アドレス
http://www.cnblogs.com/grass-and-moon/category/920962.html
Openglは異なるキャッシュオブジェクトを使用します
色を設定する章では、キャッシュオブジェクトを使用してポイントと色の情報を格納します.では、点と色の情報を別々に保存する可能性はありますか?これは、実際のアプリケーションでは、各プロパティ間で相互に独立したままにすることができるかもしれません.この章の補足内容に必要なことはこれです.
前章で変更すべき内容に対して
頂点アトリビュートとカラーは別々に保存されます.
const float vertex[] = {
    0.0f, 0.5f, 0.0f, 1.0f,
    0.5f, -0.366f, 0.0f, 1.0f,
    -0.5f, -0.366f, 0.0f, 1.0f,
};

const float color[] = {
    1.0f, 0.0f, 0.0f, 1.0f,
    0.0f, 1.0f, 0.0f, 1.0f,
    0.0f, 0.0f, 1.0f, 1.0f
};

Vertex Array Object
前章では、画像を描画するために必要なデータはVertex Buffer Objectに格納され、glVertexAttribPointerを使用してopenglキャッシュオブジェクトのどのデータセグメントが頂点位置属性であり、どのデータセグメントが色属性であるかを教えます.複数の属性をそれぞれ独立したVBOに格納するには,ここではVBOがすぐに就任する必要がある.VCOは、複数のVBOオブジェクトのオブジェクトを格納するために使用することができる.オブジェクトのレンダリングを完了するために必要な情報を格納するように設計されています.ここには、データ、データフォーマット、および異なるデータに対応するシェーダのlocationが含まれます.
そこで前章のInitializeVertexBufferInitializeVAOに変更しました
void InitializeVAO()
{
    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);

    glGenBuffers(1, &positionBufferObject);

    glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject);
    glBufferData(GL__ARRAY_BUFFER, sizeof(vertexData), vertexData, GL_STATIC_DRAW);
    glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);

    glGenBuffers(1, &colorBufferObject);
    glBindBuffer(GL_ARRAY_BUFFER, colorBufferObject);
    glBufferData(GL_ARRAY_BUFFER, sizeof(colorData), colorData, GL_STATIC_DRAW);
    glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 0, 0);

    glBindBuffer(GL_ARRAY_BUFFER, 0);
}

同時にdisplayのコードも以下の修正が必要です.
void display()
{
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    program.UseProgram();

    glBindVertexArray(vao);
    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);

    glDrawArrays(GL___TRIANGLES, 0, 3);
    glDisableVertexAttribArray(0);
    glDisableVertexAttribArray(1);

    glUseProgram(0);
    glutSwapBuffers();
}