2016-05-27 16 views
1

我已綁定的shader storage buffershader 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指向包含4個glm::vec3對象std::vector

因爲我綁定48 bytes作爲緩衝區範圍我期望lights[]保持48/(4*3) = 4 vec3s

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

元素在指數1std::vector保存數據x=1.0, y=1.0, z=1.0

但是這樣做

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

觀看輸出我看到黃色x=1.0, y=1.0, z=0.0)像素。這不是我加載到緩衝區中的內容。

有人可以告訴我我做錯了什麼嗎?

EDIT

我剛變化了的着色器存儲塊以

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

和輸出

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

和它的工作原理(白色像素)。

如果有人可以解釋這一點,那仍然很棒。

+0

請顯示mydata的確切定義 – deniss

回答

4

這是因爲人們不採取這個簡單的建議:never use a vec3 in a UBO/SSBO

vec3的基準對​​齊爲16個字節。 總是。因此,排列時,數組步長(從一個元素到下一個元素的字節數)始終爲16.與vec4完全相同。

是的,std430佈局不同於std140。但並沒有那麼不同。具體來說,它只能防止數組元素的基本對齊和跨距(以及結構的基本對齊)四捨五入到vec4。但由於vec3的基準對​​齊爲總是等於vec4的基準對​​齊,所以它不會改變它們。它隻影響標量和vec2的。

+0

我會記住您對我餘生的建議非常感謝。 – mak