java - 为 glsl 准备模型、 View 和投影矩阵

标签 java matrix glsl

我正在使用 vecmath在我转换 opengl 程序以更好地利用 glsl 时帮助矩阵数学的库。

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

  • 模型矩阵从哪里获取它的值?
  • 我是否需要重置 display() 中的所有模型、 View 和投影矩阵?即每一帧
  • 我是否在绘制每个对象后重置模式、 View 和投影矩阵?

这就是我在 GLEventListenerreshape 函数中计算我的 projectionview 矩阵的方式。

Matrix4f mProjectionMatrix = createPerspectiveProjection(
    60.0f, width / height, 0.1f, 100.0f);
Matrix4f mViewMatrix = new Matrix4f();
mViewMatrix.setIdentity();

辅助函数..

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;
}

GLEventListenerdisplay() 中,我不确定接下来的步骤。

从概念上讲,我脑子里有以下内容,这些是我需要执行的正确步骤吗? ..

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
}

这是我的顶点着色器..

uniform mat4 uMVPMatrix;
attribute vec4 vPosition;
void main() {
    gl_Position = uMVPMatrix * vPosition;
}

最佳答案

我在我的 OpenGL 应用程序中保留了三个矩阵。它们是ModelViewProjection 矩阵。所有这些矩阵都使用制服发送到着色器,着色器执行此操作。

gl_Position = mProj * mView * mModel * vec4(position, 1.0);

即位置默认在局部对象空间。将它与 Model 矩阵相乘应用该模型的平移、旋转和缩放,并且转换后的顶点现在位于世界空间中。

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

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

Where does the model matrix get it's value from?

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

Do I need to reset all model, view and projection matrices inside display()? i.e every frame?

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

Do I reset mode, view and projection matrices after drawing each object?

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

Where do you get your Model matrix values from? i.e what are they generated from?

有一些公式可以创建这些矩阵,例如上面的辅助方法,它根据相机镜头的视野和纵横比生成透视投影矩阵。很难在这里解释所有这些公式,因此您可以查看我的具有此类功能的 Transforms 类的源代码。

查看我的 Transforms 的源代码我的 GitHub 存储库上的类。它没有完整记录,但我认为您可以使用它们。

希望这对您有所帮助。

关于java - 为 glsl 准备模型、 View 和投影矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29879216/

相关文章:

java - 是否可以用数据自动填充数据库

java - 资源 android :style/TextAppearance. 未找到 Material

java - 字符串的字节在字符串的创建和 getBytes() 之间转换

haskell - 为什么 sum == foldl1 (+) 不是?

java - 为什么传递给不同类的方法的值没有反射(reflect)在 Java 中(使用 NetBeans 7.01)?

matrix - 任意精度算术的 CUDA 实现

python - 有效检测大图像中的形状

three.js - 解决 Three.js/webGL 中的 gl_PointSize 限制

opengl - GLSL 扩展在应该可用时不可用

opengl - imageStore 是原子的吗?