统一缓冲区对象未对齐。 GLSL访问受损

时间:2014-04-12 15:53:23

标签: c++ opengl glsl

使用GLFW,GLEW(虽然它不重要)

将结构传递给片段着色器时,会发现意外行为: 如果我直接传递环境颜色:

out vec3 color
...
color = MaterialCols.ambient

一切都按预期工作。通过漫反射时,它偏移1(即绿色通道为红色,蓝色通道为绿色)

传递高光时,第一个值是前一个vec3的绿色通道(漫反射)。

我认为这是一个协调问题。似乎要么GLSL只想访问特定对齐的vec3组件,要么C ++代码添加一些填充(原因未知)。

这是数据分配。它作为统一缓冲对象传递。如果需要,我可以添加使用的代码。

C ++:

typedef  struct  material_colors{
    glm::vec3 ambient;
    glm::vec3 diffuse;
    glm::vec3 specular;
}material_cols;

GLSL:

uniform MaterialColors {
    vec3 ambient;
    vec3 diffuse;
    vec3 specular;
} MaterialCols;

1 个答案:

答案 0 :(得分:0)

根据derhass的评论,以及OpenGL 3.2核心规范中标题为“统一变量”的相关章节2.11.4:

  

3. 如果成员是一个三分量向量,其组件消耗N个基本机器单位,则基本对齐为4N。

因此,通过在第一个vec3之后使用float填充c ++结构,使漫反射对齐。

C ++

typedef  struct  material_colors{
    glm::vec3 ambient;
    float padding;
    glm::vec3 diffuse;
    glm::vec3 specular;
}material_cols;