带有vec3阵列的GLSL均匀块

时间:2016-02-20 14:45:51

标签: opengl glsl

我正在尝试以数组的形式将模型视图矩阵发送到顶点着色器。我尝试了三种方法;一系列浮点数,一组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;
}

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

方法1和2工作。方法3没有。我无法弄清楚为什么。我没有得到任何着色器编译错误。它只是没有画任何东西。我正在使用PyOpenGL。对于我不知道的vec3-s数组是否存在填充问题?

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

1 个答案:

答案 0 :(得分:0)

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

此处使用vec3可以节省内存。因此,您也可以明确填充并使用vec4