OpenGL着色器顶点矩阵创建

时间:2017-03-17 01:18:28

标签: opengl shader vertex-shader

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

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

如果两者中的任何一个都是着色器中实际发生的那个?

处理杂乱并从我的程序中导入矩阵是否更好,或者我是否可以创建可接受/推荐的着色矩阵?

*使用代码*

进行更新
#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;
}

建议使用哪种方法?

2 个答案:

答案 0 :(得分:1)

做错了

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

甚至

set_matrix_uniform_using(mvp, args);

然后执行上一段代码所做的事情。

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

要在着色器中执行此操作,会产生以下几种结果:您需要多个变量来表达单个矩阵表达的内容,导致着色器加载和统一上载混乱,着色器调试比确保自己的应对程序更难实现它需要做什么。如果您对移动代码进行硬编码,则无法在不更改着色器的情况下使用自由移动的相机替换它。

所有这些甚至都没有触及性能成本。 GPU在统一内存中加载矩阵并将其与向量相乘比在做截头锥和旋转所需的触发函数时要好得多。

答案 1 :(得分:1)

如果你需要为每个顶点使用不同的矩阵,那么,在着色器中完全相同。我无法想象需要的情况。

否则,将矩阵作为制服传递要快得多。不要一次又一次地使GPU计算过载相同的矩阵。