我正在尝试以数组的形式将模型视图矩阵发送到顶点着色器。我尝试了三种方法;一系列浮点数,一组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的数组发送。
答案 0 :(得分:0)
vec3
在GLSL中是一个奇怪的事情,特别是在buffer-backed block布局中。 总是占用的空间与vec4
一样多。总是。无论是vec3 someName
还是vec3 someArrray[30]
,就布局而言,每个vec3
也可能是vec4
。
此处使用vec3
可以节省内存。因此,您也可以明确填充并使用vec4
。