为glsl准备模型,视图和投影矩阵

bob*_*e01 5 java glsl matrix

我正在使用vecmath库来帮助处理矩阵数学,而我正在转换opengl程序以glsl更好地利用它.

在写完问题之后我想我有3个小问题:

  • 模型矩阵从哪里获得它的价值?
  • 我是否需要重置内部的所有模型,视图和投影矩阵display()?即每一帧
  • 绘制每个对象后,我是否重置模式,视图和投影矩阵?

这就是我在我的函数中计算我projectionview矩阵的reshape方法GLEventListener..

Matrix4f mProjectionMatrix = createPerspectiveProjection(
    60.0f, width / height, 0.1f, 100.0f);
Matrix4f mViewMatrix = new Matrix4f();
mViewMatrix.setIdentity();
Run Code Online (Sandbox Code Playgroud)

辅助功能..

private Matrix4f createPerspectiveProjection(float fov, float aspect, float zNear, float zFar){

    Matrix4f mat = new Matrix4f();

    float yScale = (float) (1 / (Math.tan(Math.toRadians(fov / 2))));
    float xScale = yScale / aspect;
    float frustrumLength = zFar - zNear;

    mat.m00 = xScale;
    mat.m11 = yScale;
    mat.m22 = -((zFar + zNear) / frustrumLength);
    mat.m23 = -1;
    mat.m32  = -((2 * zFar * zNear) / frustrumLength);
    mat.m33 = 0;

    return mat;
}
Run Code Online (Sandbox Code Playgroud)

里面display()GLEventListener,我不确定接下来的步骤.

从概念上讲,我有以下几点,这些是我需要执行的正确步骤吗?..

public void display(GLAutoDrawable gLDrawable){

    // reset view matrix, needed?

    // Calculate the model view projection matrix .. where does model matrix get it's values from?

    // translate to Square1's position?
    // rotate to Square1's angle?
    // draw Square1 .. passing MVP matrix

    // translate to Square2's position?
    // rotate to Square2's angle?
    // draw Square2 .. passing MVP matrix
}
Run Code Online (Sandbox Code Playgroud)

这是我的顶点着色器..

uniform mat4 uMVPMatrix;
attribute vec4 vPosition;
void main() {
    gl_Position = uMVPMatrix * vPosition;
}
Run Code Online (Sandbox Code Playgroud)

Sri*_*ati 7

我在OpenGL应用程序中保留了三个矩阵.它们是模型,视图投影矩阵.使用制服将所有这些矩阵发送到着色器,着色器执行此操作.

gl_Position = mProj * mView * mModel * vec4(position, 1.0);
Run Code Online (Sandbox Code Playgroud)

也就是说,默认情况下位置在本地对象空间中.将它与模型矩阵相乘可应用该模型的平移,旋转和缩放,并且变换后的顶点现在位于世界空间中.

现在顶点乘以View矩阵,它应用摄像机的变换,如摄像机位置和方向.现在顶点将在眼睛空间中.

最后,顶点与Projection矩阵相乘,应用透视或正交的效果,这取决于我选择使用的内容.最后,在变换之后,顶点将处于规范化的设备坐标(范围从-1+1)并且将由OpenGL渲染.

模型矩阵从哪里获得它的价值?

默认情况下,模型矩阵是一个单位矩阵.每当您只想变换实体而不是整个世界时,您将变换矩阵与模型矩阵相乘,并将结果设置为新的模型矩阵.这允许您为场景中的每个模型实例保留单独的属性.

我是否需要重置内部的所有模型,视图和投影矩阵display()?即每一帧?

不,你没有.您可以创建一次矩阵,但只要客户端(即程序)上的矩阵值发生变化,您就必须更新着色器程序中的制服.

绘制每个对象后,我是否重置模式,视图和投影矩阵?

不,你没有.通常,您将保留一个投影和一个视图矩阵,但场景中每个对象都有几个模型矩阵.投影通常不会在应用程序的整个过程中发生变化,因此无需重新更新.视图矩阵与您的相机一起使用,因此通常它也适用于整个场景.然而,模型矩阵对于每个对象将是不同的,因此您必须每帧更新它.

您从哪里获得模型矩阵值?即他们从中产生了什么?

有一些公式可以创建这些矩阵,就像上面的辅助方法一样,它根据视场和摄像机镜头的纵横比生成透视投影矩阵.这里很难解释所有这些公式,所以你可以看到我的TransformUtils类的源代码具有这样的功能.

在我的GitHub存储库中查看我的TransformUtils类的源代码.它没有完整记录,但我认为你可以使用它们.

希望这可以帮助.