2017-08-11 86 views
-1
struct Light { 

    glm::vec4 position; 
    glm::vec4 color; 
    glm::vec4 attenuation; 

}; 

struct UBO { 

    // View and projection matrix 
    glm::mat4 view; 
    glm::mat4 proj; 

    // Fog 
    glm::vec4 skyColor; 
    float density; 
    float gradient; 

    // Clipping plane 
    glm::vec4 clippingPlane; 

    // Lights 
    Light lights[4]; 

}; 

比对福尔康API:UBOs以及它们在福尔康

的UBO结构是每个更新的每个帧,然后传递到顶点着色器上形成均匀缓冲区。 渲染的图像颜色错误,因为光阵列没有正确传递。

顶点着色器绑定:

layout (binding = 1) uniform UBO { 

    // View and projection matrix 
    mat4 view; 
    mat4 proj; 

    // Fog 
    vec4 skyColor; 
    float density; 
    float gradient; 

    // Clipping plane 
    vec4 clippingPlane; 

    // Lights 
    Light lights[4]; 

} ubo; 

我需要以某种方式排列的数据?

回答

1

从规格:

标准统一缓冲器布局

的OpTypeStruct成员的类型的“基础对准”被递归地定义如下:

  • 的标量大小N具有N的碱基对齐。

  • 双分量向量,其中c大小为N omponents,具有2 N.

  • 三或四成分的矢量,具有大小为N部件的基部对准,具有4 N.

  • 的基部对准的阵列具有基本对齐方式等于其元素类型的基本对齐方式,取整为16的倍数。

  • 结构的基本对齐方式等于其任何成员的最大基本对齐方式,取整为16的倍数。

  • C列的行 - 主矩阵具有基本对齐等式a到C矩阵分量向量的基本对齐。

  • 列主矩阵具有等于矩阵列类型的基本对齐的基本对齐。

std140布局GLSL满足这些规则。

更多关于这个在14.5.4. Offset and Stride Assignment规范部分。