2016-11-20 152 views
2

我見過一些着名的着色器片斷,那個組合的TBN矩陣被用來轉換屬性a_pos.but顯然它不涉及凹凸貼圖或其他任何東西。這可能是由着色器的輸入參數構成的旋轉矩陣嗎?那些向量(正常,副法線,正切)不過是三個基地,不是嗎?是TBN矩陣真的旋轉矩陣嗎?

我的意思是着色器的TBN矩陣並不是用來應用於凹凸貼圖的TBN矩陣(正如您所知,要將矢量轉換爲切線空間中的矢量,或者要使用inverse TBN矩陣),並且在我的腦海裏有一點混淆,沒有光計算。

希望你的傢伙能幫助我渡過難關。對不起,我的英語不好,謝謝!

這裏的着色器,如下:

#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); 
} 
+0

「*這可能是由一些輸入參數構成的旋轉矩陣,只有三個基礎?*」目前還不清楚您的意思。 –

+0

嗨,@ Nicol Bolas。我已經明確說明了這一描述。 – qxsl2000

回答

1

TBN矩陣是transform matrix之間光柵化的原始和世界座標轉換。 3個向量表示您的旋轉矩陣,原點通常放置在(0,0,0)或其中一個頂點。

您的問題的答案取決於TBN的用法。如果您僅將它用於矢量(如用於定向光計算或凹凸貼圖),那麼是TBN可以只是旋轉矩陣。但是如果你需要變換位置,那麼你需要完整的矩陣和原點。

見相關QANormal mapping gone horribly wrong其中TBN用作旋轉3x3矩陣。