具有 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
.
我正在尝试以数组的形式将模型视图矩阵发送到顶点着色器。我已经尝试了三种方法来做到这一点;一个浮点数数组,一个 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
.