java - 将 Matrix4f 加载到 FloatBuffer 中,以便我的着色器可以使用它

标签 java lwjgl

我创建了一个 Matrix4f,它是我的着色器的正交透视图。要存储着色器的上传矩阵,需要将其存储在 FloatBuffer 中。当我想将矩阵放入 FloatBuffer 中时,我从我的数学库 JOML 收到错误。 (我用的是LWJGL3) 以下是错误:

WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.joml.MemUtil$MemUtilUnsafe 
(file:/C:/Dev/Java/Learn%20OpenGL/lib/joml-1.9.6.jar) to field 
java.nio.Buffer.address
WARNING: Please consider reporting this to the maintainers of 
org.joml.MemUtil$MemUtilUnsafe
WARNING: Use --illegal-access=warn to enable warnings of further illegal 
reflective access operations
WARNING: All illegal access operations will be denied in a future release

这是我的代码:

matrix4f =  new Matrix4f().ortho(-2.0f, 2.0f, -1.5f, 1.5f, 1.0f, 1.0f);

FloatBuffer matrixBuffer = BufferUtils.createFloatBuffer(16);
matrix4f.get(matrixBuffer);

GL20.glUniformMatrix4fv(Shader.getLocation(shader, "transformationMatrix"), false, matrixBuffer);

最佳答案

根据评论更新:

该错误是由于使 java.nio.Buffer 类的 address 字段可访问而引起的,以便使用它来使用 填充缓冲区不安全的类。

此问题已通过 this commit 修复,因此应该在最新版本的 JOML 中得到解决。因此,如果可能的话,您应该更新到最新版本。

<小时/>

旧版本的两种解决方法:

  1. JOML 有一个启动选项,可以禁用 Unsafe 类。因此,您可以将 joml.nounsafe=true 传递给您的应用程序。但该标志基本上没有记录,而且还不完全清楚这会产生什么影响。

  2. 另一种解决方法是手动将数据从矩阵移动到缓冲区:

    import java.nio.ByteBuffer;
    import java.nio.ByteOrder;
    import java.nio.FloatBuffer;
    
    import org.joml.Matrix4f;
    
    public class JomlMatrixToBuffer
    {
        public static void main(String[] args)
        {
            Matrix4f matrix4f =
                new Matrix4f().ortho(-2.0f, 2.0f, -1.5f, 1.5f, -1.0f, 1.0f);
    
            FloatBuffer matrixBuffer = createFloatBuffer(16);
            matrix4f.get(matrixBuffer);
    
            System.out.println("Result:");
            for (int i = 0; i < matrixBuffer.capacity(); i++)
            {
                System.out.println(matrixBuffer.get(i));
            }
        }
    
        private static void matrixToBuffer(Matrix4f m, FloatBuffer dest)
        {
            matrixToBuffer(m, 0, dest);
        }
        private static void matrixToBuffer(Matrix4f m, int offset, FloatBuffer dest)
        {
            dest.put(offset, m.m00());
            dest.put(offset + 1, m.m01());
            dest.put(offset + 2, m.m02());
            dest.put(offset + 3, m.m03());
            dest.put(offset + 4, m.m10());
            dest.put(offset + 5, m.m11());
            dest.put(offset + 6, m.m12());
            dest.put(offset + 7, m.m13());
            dest.put(offset + 8, m.m20());
            dest.put(offset + 9, m.m21());
            dest.put(offset + 10, m.m22());
            dest.put(offset + 11, m.m23());
            dest.put(offset + 12, m.m30());
            dest.put(offset + 13, m.m31());
            dest.put(offset + 14, m.m32());
            dest.put(offset + 15, m.m33());
        }
    
        private static FloatBuffer createFloatBuffer(int size)
        {
            return ByteBuffer.allocateDirect(size << 2)
                .order(ByteOrder.nativeOrder())
                .asFloatBuffer();
        }
    }
    

    但这不太好,因为您正在手动执行 JOML 在不使用 Unsafe 时已在内部执行的操作。

关于java - 将 Matrix4f 加载到 FloatBuffer 中,以便我的着色器可以使用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53970962/

相关文章:

java - onPostExecute() 中的 ArrayList 空指针异常

java - 如何创建 JTree ExpansionListener

java - 在 Java 中的文本框上绘制对角线

java - LWJGL/OpenGL 渲染问题(中心渲染/弯曲多边形)

java - Eclipse java lwjgl java.library.path 中没有 lwjgl

java - 沿 X 轴和 Z 轴实现相机旋转时出现问题

java - 难以捉摸的 Java 内存泄漏

java - 我的 Java swing 按钮不起作用

java - Spring登录表单示例

java - glGenVertexArrays() 不应有任何参数