具有 vec3 数组的 GLSL 统一块

GLSL uniform block with an array of vec3

我正在尝试以数组的形式将模型视图矩阵发送到顶点着色器。我已经尝试了三种方法来做到这一点;一个浮点数数组,一个 vec4-s 数组和一个 vec3-s 数组。着色器如下图(模型-视图矩阵命名为"locate")

layout (shared) uniform uView
{
    float locate[12];   // <-- METHOD 1
    //vec4 locate[4];   // <-- METHOD 2
    //vec3 locate[4];   // <-- METHOD 3
    mat4 project;
};

in vec3 aPosition;
in vec4 aColour;

out vec4 fColour;

void main()
{
    gl_Position = project*vec4(     // <-- METHOD 1
        locate[ 0]*aPosition.x + locate[ 3]*aPosition.y + locate[ 6]*aPosition.z + locate[ 9],
        locate[ 1]*aPosition.x + locate[ 4]*aPosition.y + locate[ 7]*aPosition.z + locate[10],
        locate[ 2]*aPosition.x + locate[ 5]*aPosition.y + locate[ 8]*aPosition.z + locate[11],
        1.0);
    //gl_Position = project*vec4(   // <-- METHODS 2 & 3
    //    locate[0].xyz*aPosition[0] +
    //    locate[1].xyz*aPosition[1] +
    //    locate[2].xyz*aPosition[2] +
    //    locate[3].xyz,
    //    1.0);

    fColour = aColour;
}

方法一和方法三只发送矩阵的前三行; 12 个浮点数,或 4 个 vec3-s。生成齐次坐标的行正好有一个在对角线上,所以可以省略。方法 2 发送最后一行,但不使用它。

方法 1 和 2 有效。方法 3 没有。我不知道为什么。我没有收到任何着色器编译错误。它只是不画任何东西。我正在使用 PyOpenGL。 vec3-s 数组是否存在一些我不知道的填充问题?


旁注...当我可以将模型视图矩阵作为 mat4 发送时,我很欣赏这是一个有点愚蠢的例子。这是我尝试实现的 N 维着色器的最小 3 维示例。在 N 维中,aPosition 变量是 N 个浮点数的数组,模型视图矩阵可以是 (N+1)x3 矩阵。因此,我想将模型视图矩阵作为 N+1 vec3-s 的数组发送。

vec3 在 GLSL 中是一个奇怪的东西,特别是在 buffer-backed block 布局中。它 总是 占用与 vec4 一样多的空间。总是。无论是 vec3 someName 还是 vec3 someArrray[30],就布局而言,每个 vec3 也可能是 vec4

在这里使用 vec3 不会节省内存。所以你也可以明确填充并使用 vec4.