マイ頂点シェーダは、問題は、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"に対応していると言います。
お返事ありがとうございました!私は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
続き。 - したがって、複数の均一なブロックにデータを供給するために単一のバッファオブジェクトを使用している場合、バインドされたバッファもGL_UNIFORM_BUFFER_OFFSET_ALIGNMENTの倍数でなければなりません。 – maverick9888
"*レイアウトがstd140でない場合、offsetはGL_UNIFORM_BUFFER_OFFSET_ALIGNMENTの倍数でなければなりません。オフセット*常に*はその倍数でなければなりません。 'std140'のレイアウトはバッファのサイズや個々のユニフォームのオフセットを問い合わせる必要がないということは、それらを直接計算できるからです。バッファは任意のサイズにすることができますが、範囲をバインドするときは、オフセットはその配列の倍数でなければなりません。 –