OpenGL 着色器内顶点矩阵创建

OpenGL In-shader Vertex Matrix Creation

我正在尝试在我的顶点着色器中生成我的投影和变换矩阵函数,例如根据 GLSL 定义变换、旋转和透视矩阵函数。我这样做是为了通过将矩阵的所有 loading/importing 等绕过着色器来提高程序的可读性,除了相机位置、旋转和 FOV。

我唯一担心的是每次着色器调用或每个顶点计算都会计算矩阵。

如果两者中的任何一个,着色器中实际发生了什么?

是处理混乱并从我的程序导入矩阵更好,还是我在着色器中创建矩阵的捷径acceptable/recommended?

*更新代码*

#version 400

in vec4 position;
uniform vec3 camPos;
uniform vec3 camRot;

mat4 calcMatrix(
    vec3 pos,
    vec3 rot,
) {
    float foo=1;
    float bar=0;
    return mat4(pos.x,pos.y,pos.z,0,
                rot.x,rot.y,rot.z,0,
                foo,bar,foo,bar,
                0,0,0,1);
}

void main()
{
    gl_Position = calcMatrix(camPos, camRot) * position;
}

对比:

#version 400

in vec4 position;
uniform mat4 viewMatrix;

void main()
{
    gl_Position = viewMatrix * position;
}

推荐哪种方法?

做错了什么

float[16] matrix;
calculate_transform(matrix, args);
glUniformMatrix4fv(mvp, 1, false, matrix);

甚至

set_matrix_uniform_using(mvp, args);

然后执行前面代码的操作。


如果你担心混乱,那么提取一个函数并给它一个好名字。

要在着色器中执行此操作会产生多种后果:您将需要多个变量来表达单个矩阵所表达的内容,从而导致着色器加载和统一上传时出现混乱,着色器调试比确保您自己的要困难得多cope 做它需要做的事情。如果硬编码移动代码,则在不更改着色器的情况下无法将其替换为自由移动的相机。

所有这些甚至都没有涉及性能成本。 GPU 在从统一内存加载矩阵并将其与向量相乘方面比在执行平截头体和旋转所需的三角函数方面要好得多。

如果您需要为每个顶点使用不同的矩阵,那么,在着色器中公平地进行。我无法想象需要这样做的情况。

否则,将矩阵作为统一传递要快得多。不要让 GPU 重复计算同一个矩阵。