【问题标题】:GLSL uniform block with an array of vec3带有 vec3 数组的 GLSL 统一块
【发布时间】:2016-02-20 23:32:31
【问题描述】:

我正在尝试以数组的形式将模型视图矩阵发送到顶点着色器。我尝试了三种方法来做到这一点;一个浮点数组、一个 vec4-s 数组和一个 vec3-s 数组。着色器如下图所示(模型-视图矩阵名为“定位”)。

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 维着色器的最小 3 维示例。在 N 维中,aPosition 变量是 N 个浮点数的数组,模型视图矩阵可以是 (N+1)x3 矩阵。因此,我想将模型视图矩阵作为 N+1 vec3-s 的数组发送。

【问题讨论】:

    标签: opengl glsl


    【解决方案1】:

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

    在这里使用vec3 不会节省内存。因此,您不妨明确填充并使用vec4

    【讨论】:

    • 啊哈。是的。这是块东西。我刚刚尝试将它作为“普通”制服并且它有效。谢谢回复。我不确定自己会挣扎多少小时才考虑使用方块。
    • @Bill:不要以为使用非块统一会使这样的数组更便宜或更小。仅仅因为 API 允许您传递包含 3 个浮点数的数组,并不意味着编译后的着色器会以这种方式访问​​它。
    • 很有趣,谢谢。无论如何,我可能会使用 vec4 填充块方法(#2),纯粹是因为块的便利性。知道这也可能是最好的方法,这令人鼓舞。
    猜你喜欢
    • 2019-05-15
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 2019-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-03
    相关资源
    最近更新 更多