2012-10-23 8 views
5

マイ頂点シェーダは、問題は、3.1

uniform Block1{ vec4 offset_x1; vec4 offset_x2;}block1; 

out float value; 

in vec4 position; 

void main() 
{ 
    value = block1.offset_x1.x + block1.offset_x2.x;    

    gl_Position = position; 
} 

私は値を渡すために使用していたコードは次のとおりです。私は、16のバイトを渡すことです期待していものをここで

GLfloat color_values[8];// contains valid values 

glGenBuffers(1,&buffer_object); 

glBindBuffer(GL_UNIFORM_BUFFER,buffer_object); 

glBufferData(GL_UNIFORM_BUFFER,sizeof(color_values),color_values,GL_STATIC_DRAW); 

glUniformBlockBinding(psId,blockIndex,0); 

glBindBufferRange(GL_UNIFORM_BUFFER,0,buffer_object,0,16);            

glBindBufferRange(GL_UNIFORM_BUFFER,0,buffer_object,16,16); 

vec4制服ごとに。オフセット= 16、サイズ= 16のGL_INVALID_VALUEエラーが発生します。 オフセット値と混同しています。 Specは、 "buffer_object"に対応していると言います。

答えて

8

バインディング時にUBO用にalignment restrictionがあります。 glBindBufferRange/Baseのオフセットは、GL_UNIFORM_BUFFER_OFFSET_ALIGNMENTの倍数でなければなりません。この整列は何でもかまいませんので、均一なバッファーの配列を構築する前に照会する必要があります。つまり、コンパイル時のC++ロジックで直接行うことはできません。ランタイムロジックでなければなりません。

実行時にクエリを実行すると言えば、コードは他の多くの方法でひどく壊れています。均一ブロックにレイアウト修飾子を定義していませんでした。したがって、既定値はsharedです。そしてあなたは、querying the layout of each block's members from OpenGL.なしで共有レイアウトを使用することはできませんまで

クエリを実行した場合、均一ブロックが少なくとも32バイト(サイズではなく16)であることがすぐに判明しました。可能性がありますプログラム終了)結果。

均一ブロック定義に正確にマップするC/C++オブジェクトを定義できるようにするには、std140レイアウトを使用し、C/C++オブジェクトのstd140のレイアウトのルールに従う必要があります。

+0

お返事ありがとうございました!私はGL_UNIFORM_BUFFER_OFFSET_ALIGNMENTを知らなかった。私はすでにそのサイズ(32バイト)のUniform Blockを照会していましたが、Uniform Blockの2番目の「vec4」コンポーネントに16バイトを指定すると、私は間違っていると考えました。私は第二の "vec4"コンポーネントを個々の統一物として扱うべきだと思います。 レイアウトをstd140でない場合は、情報を追加するだけで、オフセットはGL_UNIFORM_BUFFER_OFFSET_ALIGNMENTの倍数でなければなりません。したがって、結合バッファは、GL_UNIFORM_BUFFER_OFFSET_ALIGNMENTの倍数でなければなりません。 – maverick9888

+0

続き。 - したがって、複数の均一なブロックにデータを供給するために単一のバッファオブジェクトを使用している場合、バインドされたバッファもGL_UNIFORM_BUFFER_OFFSET_ALIGNMENTの倍数でなければなりません。 – maverick9888

+0

"*レイアウトがstd140でない場合、offsetはGL_UNIFORM_BUFFER_OFFSET_ALIGNMENTの倍数でなければなりません。オフセット*常に*はその倍数でなければなりません。 'std140'のレイアウトはバッファのサイズや個々のユニフォームのオフセットを問い合わせる必要がないということは、それらを直接計算できるからです。バッファは任意のサイズにすることができますが、範囲をバインドするときは、オフセットはその配列の倍数でなければなりません。 –

関連する問題