使用GLFW,GLEW(虽然它不重要)
将结构传递给片段着色器时,会发现意外行为: 如果我直接传递环境颜色:
out vec3 color
...
color = MaterialCols.ambient
一切都按预期工作。通过漫反射时,它偏移1(即绿色通道为红色,蓝色通道为绿色)
传递高光时,第一个值是前一个vec3的绿色通道(漫反射)。
我认为这是一个协调问题。似乎要么GLSL只想访问特定对齐的vec3组件,要么C ++代码添加一些填充(原因未知)。
这是数据分配。它作为统一缓冲对象传递。如果需要,我可以添加使用的代码。
typedef struct material_colors{
glm::vec3 ambient;
glm::vec3 diffuse;
glm::vec3 specular;
}material_cols;
uniform MaterialColors {
vec3 ambient;
vec3 diffuse;
vec3 specular;
} MaterialCols;
答案 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;