java - 从 javax.vecmath.Matrix4f 创建 float[]

标签 java opengl

在传递到 glUniformMatrix4fv 之前,我应该使用 mMVPMatrix 的内容填充 float[]

我正在使用 javax.vecmath 库。

初始化变量

Matrix4f mMVPMatrix = new Matrix4f();
Matrix4f mProjectionMatrix;
Matrix4f mViewMatrix;

GLEventListener.init()中设置值

mProjectionMatrix = createPerspectiveProjection(60.0f, width / height, 0.1f, 100.0f); // method that returns an object of type `Matrix4f`
mViewMatrix = new Matrix4f();
mViewMatrix.setIdentity();

更新GLEventListener.display()

mMVPMatrix = mProjectionMatrix;
mMVPMatrix.mul(mViewMatrix);

在绘制过程中获取对 glsl 变量的引用

mMVPMatrixHandle = gl2.glGetUniformLocation(shaderProgram, "uMVPMatrix");
gl2.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mMVPMatrix, 0);

uMVPMatrix 是一个 glsl 变量..

#version 120

uniform mat4 uMVPMatrix;
attribute vec4 vPosition;

void main() {
    gl_Position = uMVPMatrix * vPosition;
}

最佳答案

默认情况下,OpenGL 假定矩阵按列主序存储。基于Matrix4f documentation ,矩阵元素的编号是行主数。例如:

m01: The second element of the first row.

因此,如果 mMatrix4f,您可以构建一个 float 组 v,其元素按列主要顺序排列:

float[] v = {m.m00, m.m10, m.m20, m.m30,
             m.m01, m.m11, m.m21, m.m31,
             m.m02, m.m12, m.m22, m.m32,
             m.m03, m.m13, m.m23, m.m33};

glUniformMatrix4fv() 的第三个参数还允许您选择在将矩阵加载到制服中时是否应转置矩阵。如果您的值是列主的,您将使用 false。但是,如果由于某种原因您的值按行主序排列,您也可以使用 true 作为参数,而不是打乱值。

关于java - 从 javax.vecmath.Matrix4f 创建 float[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30089482/

相关文章:

java - 如何从父类(super class)中实例化子类

java - 使用 ConcurrentLinkedQueue 进行一些非原子操作

opengl - OpenGL:缩放然后翻译?如何?

c++ - 无法通过glGetBufferSubData获取缓冲区对象数据

c++ - Pre Z 缓冲区通过 OpenGL?

c++ - 使用 OpenGL VBO 绘制数千个多边形

openGL-绘制四边形网格并手动绘制它们

java - Android 如何将变量分配给按钮?

java - 密封类是否在 Java 中强制执行,如果是,如何执行?

java - 最新的 Java/OS X 更新破坏了 My Ant