首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL正规阵

OpenGL正规阵
EN

Stack Overflow用户
提问于 2012-06-09 22:20:24
回答 2查看 3.5K关注 0票数 3

我一直在尝试使用OpenGL ES 2.0为安卓创建简单的漫反射光照着色器,并从Java4.0着色语言食谱中获取知识,但它没有告诉太多关于法线矩阵的信息,我非常确定问题来自于它,因为我一直使用的“模型”在WebGL中工作得很好,在那里我可以使用OpenGL中找不到的很好的glMatrix库。

我不确定如何从模型视图矩阵中获得法线矩阵,但我只读到了它的反转3x3模型视图矩阵的转置,太糟糕了,Android matrix类只允许你处理4x4矩阵(对吗?)所以我一直在着色器中拆分矩阵,这可能是我出错的地方。

所以我要做的很简单:

代码语言:javascript
复制
    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);

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

代码语言:javascript
复制
tNorm = normalize(mat3(nMatrix) * vNormal).xyz;

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

正如你所看到的,立方体的一些面是绝对黑暗的,我确信我得到了所有的法线,即使我不知道任何Android GL调试器,但如果你知道一个,请随时告诉我关于它的。

所以问题是,我如何从我的模型视图矩阵中正确地获得法线矩阵?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-09 23:26:18

我不知道在哪里可以找到Java中的Matrix库来帮助您完成这项工作。

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

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

票数 4
EN

Stack Overflow用户

发布于 2013-07-23 16:44:03

这可能是有用的

glm库中一些有用的mat3函数的

移植

代码语言:javascript
复制
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];
}
}

它应该像这样使用-

代码语言:javascript
复制
// Invert + transpose of mvmatrix
    float []temp = new float[18];
    Mat3x3.Mat3(mMVMatrix, temp);
    Mat3x3.inverse(temp, temp, 9);
    Mat3x3.transpose(temp, 9, normalMatrix);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10961746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档