2013-04-01 36 views
4

我有以下統一緩衝:GLSL佈局std140填充困境

layout(std140) uniform Light 
{ 
    vec4 AmbientLight; 
    vec4 LightIntensity; 
    vec3 LightPosition; 
    float LightAttenuation; 
}; 

我有一些問題,緩存中的數據時,並填充我需要添加。我已閱讀http://ptgmedia.pearsoncmg.com/images/9780321552624/downloads/0321552628_AppL.pdf,其中說我必須在vec3的末尾添加一個額外的4個字節用於填充 - 所以我將總共爲「Light」上傳13個字節。然而,當我這樣做時,'LightAttenuation'獲得的是我在'LightPosition'上填充的值,而不是前面的一個字節,所以當我不填充時,我在着色器中得到正確的值。爲什麼是這樣?

+2

「*我已閱讀說明*」誰在乎它說什麼? [OpenGL規範](http://www.opengl.org/registry/)是主要來源;其他一切都是次要的。對於std140佈局的描述並不像人們所說的那樣難以理解。 –

回答

9

有關詳細信息,請參見OpenGL規範的第7.6.2.2節,但基本上,std140佈局表示每個變量都將在上一個變量之後立即佈置,並在爲變量類型所需的對齊添加足夠的填充後添加足夠的填充。 vec3vec4都需要16字節對齊,分別是12和16字節。 float需要4個字節對齊,並有4個字節大小。因此,使用std140佈局時,LightPosition將獲得16個字節的對齊方式,因此將始終以12 mod 16的地址結束。由於這是4字節對齊,所以在LightAttenuation之前不會插入額外的填充。

0

通常是的,openGL會將vec3作爲vec4。但AFAIK在這種情況下將浮動LightAttenuation追加到vec3 LightPosition中 - 形成一個總體vec4(由glsl編譯器完成的某種優化)。整個結構的大小將是3x vec4。

試用LightAttenuation的vec3或vec4。