【问题标题】:Opengl Camera * Projection * Coord = NothingOpengl 相机 * 投影 * 坐标 = 无
【发布时间】:2014-02-14 17:05:17
【问题描述】:

我有以下代码来初始化我在 lwjgl 中的两个矩阵:

GL20.glUseProgram(shaderProgramID);
        Matrix4f camera = new Matrix4f();
        Matrix4f.translate(new Vector3f(0, 0, 0), camera, camera);
        FloatBuffer buffer = BufferUtils.createFloatBuffer(16);
        camera.store(buffer);
        buffer.flip();
        GL20.glUniformMatrix2(GL20.glGetUniformLocation(shaderProgramID, "camera"), false, buffer);
        GL20.glUseProgram(0);

        float near = 0.1f, far = 100.0f, top = 300, bottom = -300, left = -400, right = 400;  
        Matrix4f projection = new Matrix4f();
        projection.setIdentity();
        projection.m00 = 2*near/(right - left);
        projection.m11 = 2*near/(top - bottom);
        projection.m22 = -(far +near)/(far - near);
        projection.m23 = -1;
        projection.m32 = -2*far*near/(far - near);
        projection.m20 = (right+left)/(right -left);
        projection.m21 = (top + bottom)/(top-bottom);
        projection.m33 = 0;
        FloatBuffer buffer2 = BufferUtils.createFloatBuffer(16);
        projection.store(buffer2);
        buffer.flip();
        GL20.glUniformMatrix2(GL20.glGetUniformLocation(shaderProgramID, "projection"), false, buffer);
        GL20.glUseProgram(0);

顶点着色器执行以下操作:

gl_Position = projection * camera * vec4(vert, 1);

我不知道它可能有什么问题......有人有想法吗?

【问题讨论】:

  • 如果您的Matrix4f 类有一个名为setIdentity (...) 的函数并且这不是在构造时执行的操作,那么您为什么只为您的投影矩阵调用它?翻译 identity 相机矩阵也是有意义的。
  • 它不是我的类,它来自 org.lwjgl.util ...是的,它有方法 setIdentity() 但这实际上是什么意思?我也将它添加到camery,但它没有帮助......
  • setIdentity (...) 设置矩阵,使其在主对角线上具有 1.0 值(m00m11m22m33)并且所有其他值为 0.0。最重要的是,这会将 1.0 分配给 m33。对于正确的平移和缩放,这一点很重要,但经常被忽视。
  • 是的,我也在 Matrix4f 的源代码中找到了这个。但是我也看到这个类的构造函数调用了setIdentity(),所以再次调用它没有意义......所以这不会是错误......

标签: opengl matrix lwjgl projection


【解决方案1】:

我知道这已经晚了,但为了完整起见:

上面的代码在调用 glUseProgram(0): 时没有程序绑定,因此后面的 glUniform* 调用会创建一个 GL_INVALID_OPERATION,因为没有程序对象存在。这也意味着投影实际上从未为您的程序设置,因此在渲染时它是一个空矩阵,它与一个矩阵相乘,而一个向量仍然会产生空向量。

您也可以考虑在加载着色器后保存一次统一位置并检查它是否真的可用。

【讨论】:

    猜你喜欢
    • 2016-06-26
    • 2015-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多