2016-05-27 6 views
1

私は4つのglm::vec3オブジェクトを含むstd::vectorにとてもShader Storage Blockからのみゴミを取得しますか?

GLuint index = glGetProgramResourceIndex(myprogram, GL_SHADER_STORAGE_BLOCK, name); 
glShaderStorageBlockBinding(myprogram, index, mybindingpoint); 
glBindBuffer(GL_SHADER_STORAGE_BUFFER, mybuffer) 
glBindBufferRange(GL_SHADER_STORAGE_BUFFER, mybindingpoint, mybuffer, 0, 48); 
glBufferSubData(GL_SHADER_STORAGE_BUFFER, 0, 48, &mydata); 

mydataポイントのようshader storage blockからshader storage bufferを拘束されています。

48 bytesをバッファ範囲としてバインドしたので、lights[]は、48/(4*3) = 4 vec3sを保持すると予想しています。私std::vectorのインデックス1

layout(std430) buffer light { 
    vec3 lights[]; 
}; 

要素は、データx=1.0, y=1.0, z=1.0を保持しています。

しかし、私は黄色x=1.0, y=1.0, z=0.0)ピクセルを参照してください

gl_FragColor = vec4(lights[1], 1.0); 

を行うことで出力を表示します。これは私がバッファにロードしたものではありません。

誰かが私が間違っていることを教えてもらえますか?私はちょうど

layout(std430) buffer light { 
    float lights[]; 
}; 

出力

gl_FragColor = vec4(lights[3],lights[4],lights[5],1.0); 

にシェーダ記憶ブロックをchangend、それが(白画素)動作

EDIT

誰かがこれを説明することができれば、それでも素晴らしいでしょう。

+0

mydataの正確な定義を表示してください – deniss

答えて

4

人々がこの簡単なアドバイスを取っていないからです:never use a vec3 in a UBO/SSBO

vec3のベースアライメントは16バイトです。 常にです。したがって配列が配列されるとき、配列のストライド(ある要素から次の要素までのバイト数)は常に16です。vec4とまったく同じです。

はい、std430のレイアウトはstd140とは異なります。しかしそれはそれほど違いはありません。具体的には、配列要素の基本的な整列とストライド(および構造体の基本整列)がvec4のものに切り上げられるのを防ぐだけです。しかし、vec3のベースアラインメントはであるので、vec4と常に等しいに等しいので、それらについては何も変わりません。それはスカラーとvec2のものにのみ影響します。

+0

私の残りの人生のためにあなたのアドバイスを覚えています。 – mak

関連する問題