シェーダにバッファからバッファ入力データから頂点シェーダを供給

月曜日〜金曜日、日、時間の更新の午前7時北京時間 -

第2章では、「私たちの第一のOpenGLのプログラムは、」あなたは簡単に頂点配列オブジェクト(VAO)に導入されました。その議論の中でVAOが頂点への入力を表すか、我々は説明しシェーダーかかわら時に、我々は頂点シェーダに任意の実際の入力を使用していないと、データのハードコードされた配列のために代わりに選びました。次に、第3章では、我々は、頂点属性の概念が導入されましたが、我々は彼らの静的な値を変更するだけでどのように議論しました。頂点配列オブジェクトがあなたのためにこれらの静的属性値を格納しますが、それはより多くを行うことができます。我々が進む前に、我々は我々の頂点配列の状態を保存し、我々はそれを使用できるように、私たちのコンテキストにバインドする頂点配列オブジェクトを作成する必要があります。

第二章では、我々はVAOとの接触を持っている、とどこがシェーダー入力データをVAOする方法を説明してきた - データをその時点で私たちは本当にVAOが、ハードコードされたの使用を使用していませんでしたが。第三章では、我々は、頂点属性の概念が導入されましたが、我々はちょうど彼らの静的な値を変更する方法を説明しました。VAOがないだけあなたのためにそれらの静的プロパティを格納することができ、それはより多くを行うことができます。我々が開始する前に、我々はそれを使用することができるように、私たちは、私たちの頂点配列状態を保存するためにVAOのオブジェクトを作成し、私たちのコンテキストにバインドする必要があります

GLuint VAO;
glCreateVertexArrays(1、&VAO)。
glBindVertexArray(VAO)。
今、私たちは私たちのVAOが作成され、拘束されていることを、私たちはその状態で充填を開始することができます。むしろ頂点シェーダにハードコーディングされたデータを使用するよりも、我々は代わりに頂点属性の値に完全に依存して自動的に私たちが提供するバッファオブジェクトに格納されたデータを使用して、それを埋めるためにOpenGLを求めることができます。各頂点属性は、いくつかの頂点バッファのバインディングの1にバインドされたバッファからデータをフェッチするために取得します。頂点属性はglVertexArrayAttribBinding()関数を呼び出し、バッファを参照するために使用するバインディングを設定します:

今、私たちはVAOを作成している、我々は主要なイベントを行うことができます。今回は、バッファオブジェクトが代わりにハードコーディングされた使用するデータを提供しています。各頂点属性は、最大バッファデータ収集からターゲットノードに結合されます。そのノードのバッファ上のデータを取得するために行くために場所を知る頂点属性のために、我々はglVertexArrayAttribBinding設定するために呼び出します

空glVertexArrayAttribBinding(GLuint vaobj、GLuint attribindex、GLuint bindingindex)。
glVertexArrayAttribBinding()関数は、頂点配列オブジェクト命名vaobjが結合されたときに、attribindexで指定されたインデックスの頂点属性をbindingindexで結合バッファからデータを供給する必要があることOpenGLを伝えます。我々のデータは、どこにそのバッファに、我々は頂点バッファバインディングのいずれかにバッファをバインドするglVertexArrayVertexBuffer()関数を使用して、データが存在するオブジェクトですバッファOpenGLを伝えるために。私たちは、データのレイアウトとフォーマットを記述するためにglVertexArrayAttribFormat()関数を使用し、最終的に我々はglEnableVertexAttribArray()を呼び出すことで、属性の自動充填を可能にします。glVertexArrayVertexBufferのプロトタイプは()であります

この関数は、VAOをvaobjすると、そのbindingindex頂点をバッファするattribindexの属性に関するデータを取得するには、コンテキストにバインドされたOpenGLを、伝えます。データとバッファのメモリ内のデータパターンをバッファOpenGLを知らせるために、我々はそれらを設定するためにglVertexArrayVertexBufferを使用しています。GlVertexArrayAttribFormat我々は、つまり、メモリの友人の分布データのフォーマットを記述するために使用します。学生はメモリの分布は、私たちのC ++トリックコースで見ることができるかわからない、唯一のいくつかの小さな例を挙げてC ++の理解を深めて、基本的なC ++構文を話すことはありません。そして最後に、我々はglEnableVertexAttribArrayはOpenGLが自動的にデータがモード設定に従ったシェーダ処理に送られ、バッファに行かせて起動する関数を呼び出します。glVertexArrayVertexBuffer機能は次のとおりです。

無効glVertexArrayVertexBuffer(GLuint vaobj、
GLuintのbindingindex、
GLuintバッファ、
GLintptrオフセット、
GLsizeiストライド)。
ここでは、最初のパラメータは、その状態、あなたが変更している頂点配列オブジェクトです。第2のパラメータは、bindingindexは、glVertexArrayAttribBindingに送信パラメータ()と一致する頂点バッファのインデックスです。バッファパラメータは、我々が結合しているバッファオブジェクトの名前を指定します。最後の2つのパラメータは、オフセットおよびストライド、バッファ内の属性データ嘘をオブジェクトどこOpenGLを教えてください。最初の頂点のデータが始まり、ストライドが各頂点がどのように離れて言うところのオフセットは述べています。どちらも、バイト単位で測定されています。次に、我々は、その原型であるglVertexArrayAttribFormatを()、持っています

ここで、最初のパラメータはVAOである、第2のパラメータはインデックスと1対1の対応が内部設定glVertexArrayAttribBindingことは、インデックスバッファのオブジェクトです。第三パラメータがバッファオブジェクトです。最後の2つのパラメータは、ストライドの間のOpenGL同じ属性データ間隔を伝え、オフセットデータは、開始位置OpenGLを伝え、OpenGLのメモリオフセット及びこれらのデータのストライドパターンを教えて、それはバイトサイズです。

ボイドglVertexArrayAttribFormat(GLuint vaobj、
GLuint attribindex、
グリントサイズ、
GLenum型、
GLboolean正規化され、
GLuintのrelativeoffset)。
glVertexArrayAttribFormat()の場合は、最初のパラメータは、再びその状態私たちが修正している頂点配列です。attribindexは頂点属性のインデックスです。あなたは、頂点シェーダへの入力として属性の多くを定義し、3サイズは毎にバッファに格納される構成要素の数である章の「頂点属性」のセクションで説明したように、それらのインデックスによってそれらを参照することができます頂点及びタイプは、通常、表5.3のタイプのいずれかであろうデータのタイプです。

最初のパラメータはglVertexArrayAttribFormat VAOで、attribindexは頂点属性のインデックスです。あなたは、プロパティの数を定義し、インデックスにそれらを参照するために試すことができます。サイズパラメータを指し、各頂点部の数、種類は、一般的に表5.3のものと呼ばれるデータの種類を指します。

正規化されたパラメータは、バッファ内のデータが正規化さ頂点シェーダーに渡される前に(0.0と1.0との間のスケーリングされた)、またはあるとして、それは放置し、渡されるべきかどうすべきかどうかOpenGLを伝えます。このパラメータは、浮動小数点データでは無視されますが、このようなGL_UNSIGNED_BYTEやGL_INTとして整数データ型、のために、それが重要です。GL_UNSIGNED_BYTEデータが正規化される場合、例えば、それは、頂点シェーダへの浮動小数点入力に渡される前に、(符号なしバイトで最大値表現)255によって分割されています。シェーダは、したがって、0.0と1.0との間の入力属性の値が表示されます。しかし、データが正規化されていない場合、それは単に浮動小数点値にキャストされ、シェーダが頂点シェーダへの入力は、浮動小数点データで構成されていても、0.0及び255.0の間番号を受信します。ストライドパラメータは、一つの頂点のデータの開始と次の開始の間ですが、あなたはOpenGLはサイズと種類の値に基づいて、あなたのためにそれを計算させるために、このパラメータを0に設定することができますどのように多くのバイトOpenGLを伝えます。最後に、相対オフセットは、頂点のデータの特定の属性のデータ開始からオフセットされています。これは、すべてのかなり複雑なようだが、バッファオブジェクト内の位置を計算するための擬似コードは非常に簡単です:

正規化されたパラメータは、データが前に送信シェーダに0と1の間にスケーリングする必要があるかどうか、OpenGLを伝えます。GL_FLOATタイプの場合、このパラメータは、OpenGLを無視されますが、データのGL_UNSIGNED_BYTEまたはGL_INTタイプのために、このパラメータは非常に重要です。あなたの着信データがある場合は、OpenGLの規模を伝えるためにここに必要がある場合GL_UNSIGNED_BYTEについて、255、そのデータを使用すると、OpenGLのスケーリングを伝えるために必要がない場合は、シェーダによって受信されたデータは、255.0で、シェーダー1.0によって受信され、浮動小数点数。ストライドパラメータは、OpenGLのデータ間隔を伝えます。最後に、相対的なすべてのデータをオフセット頂点に特定の属性データを示すデータをオフセット。これらの概念は複雑に見えるかもしれませんが、それは計算している間オフセット擬似コードは単純です。

位置=メモリ内のデータストアの[attrib.binding] .memory + //スタート結合
結合[attrib.binding] .offset + //バッファに頂点属性のオフセット
結合[attrib.binding] .stride vertex.index + //スタートこの*頂点
vertex.relative_offset。頂点に属性の相対//スタート
最後に、glEnableVertexAttribArray()と逆glDisableVertexAttribArrayは()のプロトタイプを持っています:

最後に、逆の操作glDisableVertexAttribArray glEnableVertexAttribArrayとは、次のような機能は述べています:

glEnableVertexAttribArray(GLuint指数)を無効に。
頂点属性が有効になっている場合、OpenGLはあなたがglVertexArrayVertexBuffer()とglVertexArrayAttribFormat()を提供した形式と場所の情報に基づいて、頂点シェーダにデータを送ります。属性が無効になっている場合には、頂点シェーダを使用すると、glVertexAttribへの呼び出しを提供し、静的な情報が提供されます)(。5.4リスト頂点属性を設定するには、glVertexArrayVertexBuffer()とglVertexArrayAttribFormat()を使用する方法を示しています。我々はまた、オフセット、ストライド、およびフォーマット情報を設定した後glEnableVertexArrayAttrib()を呼び出すことに注意してください。これはかなりglVertexAttribのうちの1つを介して当社が提供するデータを使用するよりも頂点属性を埋めるために、バッファ内のデータを使用するためにOpenGLを伝える()関数。

頂点属性が有効になっている場合、OpenGLは私たちの前に設置されたものによるとシェーダパラメータに送信されます。頂点属性が無効になっている場合は、OpenGLのシェーダは、あなたが使用glVertexAttribお送りしますデータセット固定それらの機能のいくつかを。5.4リストglVertexArrayAttribFormat glVertexArrayVertexBufferと頂点属性を設定する方法を示しています。私たちは、コールglEnableVertexArrayAttribの同じオフセット情報、ストライドとフォーマットを設定することに注意してください。これは、我々がWTO glVertexAttribにシェーダの入力パラメータロシアアクように、データバッファを使用し、OpenGLを語っているそれらのものが設定機能します。

//まず、VAOに頂点バッファに結合
glVertexArrayVertexBuffer(VAO、//頂点配列オブジェクト
0、//最初の頂点バッファ
結合
バッファー、//バッファオブジェクト
0、先頭から開始し//
はsizeof(vmath :: vec4)) ; //各頂点は1 vec4です
//今、それがどこにあるかということを教え、OpenGLのにデータを記述し、自動オンに
指定された属性のフェッチ//頂点
glVertexArrayAttribFormat(VAO、//頂点配列オブジェクト
0、//最初の属性
4、//四の成分
GL_FLOAT、//浮動小数点データ
GL_FALSE、//正規-フロートでは無視
0)。頂点の//最初の要素
glEnableVertexArrayAttrib(VAO、0);
リスト5.4:頂点属性を設定します

5.4が実行されたリストの後、OpenGLは、自動的にそれがglVertexArrayVertexBuffer(でVAOに結合されたバッファ)から読み取ったデータを頂点シェーダの最初の属性を記入します。私たちは、その入力頂点属性ではなく、ハードコードされた配列のみを使用するように私たちの頂点シェーダを変更することができます。この更新されたシェーダは5.5リストに示されています。

リストは5.4倍を行う場合、OpenGLは自動的に最初のプロパティを埋めるためにVAOのシェーダにデータバインディングバッファglVertexArrayVertexBufferを使用します。私たちは今、シェーダーは、入力されたデータではなく、ハードコーディングされたデータを使用するようにしましょう、シェーダを変更します。5.5リスト書き方をシェーダコードの最新バージョンを示してい

#version 450コア
vec4位置に配置(位置= 0)。
ボイドメイン(ボイド)
{
gl_Position =位置。
}
5.5リスト:頂点シェーダで属性を使用

あなたが見ることができるようにゴーン第2章に示す元のシェーダは、データのハードコードされた配列である上、リスト5.5のシェーダが大幅に簡素化されます。追加ボーナスとして、このシェーダは、頂点の任意の数で使用することができます。あなたは文字通り)あなたのバッファオブジェクトへのデータの頂点価値の何百万人を置くと、そのようなglDrawArrays(への呼び出しなどの単一のコマンドでそれらのすべてを描くことができます。あなたが頂点属性を埋めるために、バッファオブジェクトからのデータを使用して行われている場合、あなたはプロトタイプですglDisableVertexAttribArray()への呼び出しで再びその属性を無効にすることができます

あなたが見ることができるように、5.5のリストははるかに簡単に以前のシェーダに比べて。ハードコーディングされたデータを削除しました。シェーダは、頂点の任意の番号を使用することができます。あなたがバッファ内のデータの何百万人を入れて、その後、それらを引き出します描画命令を使用することができ、言うことができます。あなたがプロパティで頂点バッファを使用して終了している場合は、glDisableVertexAttribArrayこのプロパティを無効に使用することができます。

glDisableAttribArray(GLuint指数)を無効に。
あなたが頂点属性を無効にしたら、それは静的であること、あなたがシェーダにglVertexAttrib *()で指定した値を渡すに戻ります。

このプロパティを無効にすると、データが設定され、それらのデータglVertexAttribの*機能を使用するためにシェーダーに渡されたとき、シェーダ未来を呼び出します。

この日の翻訳は〜さようなら、明日お会いし、ここで取得します

最新のプロットを初めて取得し、東漢アカデミーと公共グラフィック番の心に注意を払ってください。

ハン・カレッジ、あなたはああをプレイするのを待ちます

おすすめ

転載: blog.51cto.com/battlefire/2430611