【问题标题】:is TBN matrix really rotation matrix in nature?TBN矩阵在本质上真的是旋转矩阵吗?
【发布时间】:2016-11-20 11:04:39
【问题描述】:

我看过 someguy 的着色器 sn-p,组合的 TBN 矩阵用于转换属性 a_pos。但显然它与凹凸贴图或其他任何东西无关。这可能是由着色器的输入参数组成的旋转矩阵吗?那些向量(法线、副法线、切线)只不过是三个基数,不是吗?

我的意思是着色器的 TBN 矩阵从来都不是应用于凹凸贴图的 TBN 矩阵(如您所知,将向量转换为切线空间中的向量,或使用逆向量将切线中的向量转换回TBN 矩阵),并且没有涉及到光计算。我脑子里有点混乱。

希望你的人能帮助我度过难关。对不起我的英语不好,谢谢!

这里是shader,如下:

#ifdef GL_ES
#else
#define highp
#define mediump
#define lowp
#endif
uniform   mat4 u_mvp;

attribute vec3 a_pos;
attribute vec3 a_normal;
attribute vec2 a_uv0;
attribute vec2 a_uv1;

varying   vec2 v_texcoord0;
varying   vec2 v_texcoordMap;

uniform highp float u_time;
uniform mediump float u_1DivLevelWidth;
uniform mediump float u_1DivLevelHeight;

void main()
{
    float mapPos = a_normal.x * 0.1 + a_normal.y * 0.6;
    vec2 v1 = vec2(cos(mapPos + u_time * 0.6), cos(mapPos + u_time * 0.9));
    mapPos = (a_normal.x + a_normal.y + a_pos.x + a_pos.y) * 3.0;
    vec2 v2 = vec2(cos(mapPos + u_time * 3.2 + (a_uv1.y * 0.1)), cos(mapPos + u_time * 2.9 + (a_uv1.y * 0.1))) * 0.02 * a_uv1.y;



    vec3 normal = normalize(vec3(v1 * (a_uv1.x * 0.2), 5.0));
    //vec3 normal = vec3(0.0, 0.0, 1.0);
    vec3 binormal = normalize(cross(normal, vec3(1.0, 0.0, 0.0)));
    vec3 tangent = normalize(cross(binormal, normal));


    // to transform the position using the above TBN matrix
    // what's the TBN matrix meaning for 
    vec4 pos = vec4((a_pos * mat3(tangent, binormal, normal)) + a_normal, 1.0) + vec4(v2 * (a_uv1.y * 0.2), 0.0, 0.0);

    gl_Position = u_mvp * pos;
    v_texcoord0 = a_uv0;
    v_texcoordMap = vec2(pos.x * u_1DivLevelWidth, pos.y * u_1DivLevelHeight);
}

【问题讨论】:

  • "这可能是由一些输入参数组成的旋转矩阵,只有三个基数吗?" 不清楚你的意思。
  • 嗨,@Nicol Bolas。我已经把那个描述说清楚了。

标签: graphics glsl shader


【解决方案1】:

TBN 矩阵是transform matrix 在光栅化原始坐标和世界坐标之间转换。这 3 个向量代表您的旋转矩阵,原点通常放置在 (0,0,0) 或顶点之一。

您的问题的答案取决于 TBN 的使用情况。如果您仅将它用于向量(如定向光计算或凹凸映射),那么是的,TBN 可以只是旋转矩阵。但是,如果您还需要变换位置,那么您需要带有原点的完整矩阵。

查看相关的QANormal mapping gone horribly wrong,其中 TBN 用作旋转 3x3 矩阵。

【讨论】:

    猜你喜欢
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    • 2011-05-01
    相关资源
    最近更新 更多