【问题标题】:OpenGL Normal MatrixOpenGL法线矩阵
【发布时间】:2012-06-09 14:20:23
【问题描述】:

我一直在尝试使用 OpenGL ES 2.0 为 Android 创建简单的漫反射光照着色器,并从 OpenGL 4.0 着色语言食谱中获取知识,但它并没有说明多少关于普通矩阵的信息,我很确定问题来自它,因为我一直在使用的“模型”在 WebGL 中运行良好,我可以使用我在 Java 中找不到的漂亮 glMatrix 库。

我不确定如何从模型视图矩阵中获取正常矩阵,但我读到它只是倒置 3x3 模型视图矩阵的转置,太糟糕的 Android Matrix 类只能让你使用 4x4 矩阵(对吗?)所以我'一直在着色器中拆分矩阵,这可能是我出错的地方。

所以我所做的就是这样:

    float[] nMatrix = new float[4 * 4];
    Matrix.invertM(nMatrix, 0, mvMatrix, 0);
    Matrix.transposeM(nMatrix, 0, nMatrix, 0);

    glUniformMatrix4fv(shader.getUniformPointer("nMatrix"), 1, false, nMatrix, 0);

然后在我的顶点着色器中我这样做:

tNorm = normalize(mat3(nMatrix) * vNormal).xyz;

剩下的代码基本上都是书上的,结果如下

正如你所看到的,立方体的某些侧面完全是黑暗的,我确信我得到了所有的法线,即使我不知道任何 Android GL 调试器,但如果你知道,请随时告诉我.

所以问题是,我怎样才能正确地从我的模型视图矩阵中获取正常矩阵?

【问题讨论】:

    标签: android opengl-es opengl-es-2.0


    【解决方案1】:

    我在哪里可以找到 Java 中的 Matrix 库来帮助您解决这个问题。

    但是,只要您的 modelView 矩阵不包含非均匀比例,您就可以安全地使用您的 modelView 矩阵而不是 normalMatrix。

    这可以帮助您开始并确保您的问题没有隐藏在其他地方。

    【讨论】:

    • 感谢您的提醒,我会看到的。
    【解决方案2】:

    这可能有用

    glm库一些有用的mat3函数移植

    package com.CosmicCreations;
    
    public class Mat3x3 {
    public static float determinant(float []m){
    return 
            + m[0] * (m[4] * m[8] - m[7] * m[5])
            - m[3] * (m[1] * m[8] - m[7] * m[2])
            + m[6] * (m[1] * m[5] - m[4] * m[2]);
    }
    public static void Mat3(float []m4, float[]m){
    m[0]=m4[0]; m[1]=m4[1]; m[2]=m4[2];
    m[3]=m4[4]; m[4]=m4[5]; m[5]=m4[6];
    m[6]=m4[8]; m[7]=m4[9]; m[8]=m4[10];
    }
    /*
        Inverse[0][0] = + (m[1][1] * m[2][2] - m[2][1] * m[1][2]);
        Inverse[1][0] = - (m[1][0] * m[2][2] - m[2][0] * m[1][2]);
        Inverse[2][0] = + (m[1][0] * m[2][1] - m[2][0] * m[1][1]);
        Inverse[0][1] = - (m[0][1] * m[2][2] - m[2][1] * m[0][2]);
        Inverse[1][1] = + (m[0][0] * m[2][2] - m[2][0] * m[0][2]);
        Inverse[2][1] = - (m[0][0] * m[2][1] - m[2][0] * m[0][1]);
        Inverse[0][2] = + (m[0][1] * m[1][2] - m[1][1] * m[0][2]);
        Inverse[1][2] = - (m[0][0] * m[1][2] - m[1][0] * m[0][2]);
        Inverse[2][2] = + (m[0][0] * m[1][1] - m[1][0] * m[0][1]);
        Inverse /= Determinant;
     */
    public static void inverse(float []m, float[] Inverse, int offset){
    
    float Determinant = Mat3x3.determinant(m);
    Inverse[offset+0] = + (m[4] * m[8] - m[7] * m[5])/ Determinant;
    Inverse[offset+3] = - (m[3] * m[8] - m[6] * m[5])/ Determinant;
    Inverse[offset+6] = + (m[3] * m[7] - m[6] * m[4])/ Determinant;
    Inverse[offset+1] = - (m[1] * m[8] - m[7] * m[2])/ Determinant;
    Inverse[offset+4] = + (m[0] * m[8] - m[6] * m[2])/ Determinant;
    Inverse[offset+7] = - (m[0] * m[7] - m[6] * m[1])/ Determinant;
    Inverse[offset+2] = + (m[1] * m[5] - m[4] * m[2])/ Determinant;
    Inverse[offset+5] = - (m[0] * m[5] - m[3] * m[2])/ Determinant;
    Inverse[offset+8] = + (m[0] * m[4] - m[3] * m[1])/ Determinant;
    }
    public static void transpose(float []m, int offset, float[]result){
    result[0] = m[offset+0];
    result[1] = m[offset+3];
    result[2] = m[offset+6];
    
    result[3] = m[offset+1];
    result[4] = m[offset+4];
    result[5] = m[offset+7];
    
    result[6] = m[offset+2];
    result[7] = m[offset+5];
    result[8] = m[offset+8];
    }
    }
    

    应该这样使用-

    // Invert + transpose of mvmatrix
        float []temp = new float[18];
        Mat3x3.Mat3(mMVMatrix, temp);
        Mat3x3.inverse(temp, temp, 9);
        Mat3x3.transpose(temp, 9, normalMatrix);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-05
      相关资源
      最近更新 更多