我一直在尝试使用 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 调试器,但如果你知道,请随时告诉我。
所以问题是,我怎样才能从我的模型视图矩阵中正确获取正常矩阵?