2016-11-20 4 views
2

Я видел фрагмент шейдера someguy, что составленная матрица TBN использовалась для преобразования атрибута a_pos.but, очевидно, это не связано с отображением рельефа или с чем-либо еще. может ли это быть матрицей вращения из входных параметров шейдера? эти векторы (нормальные, бинормальные, касательные) суть не более трех оснований, не так ли?есть матрица TBN действительно матрица вращения в природе?

Я имею в виду, что матрица TBN шейдера не используется как матрица TBN, применяемая при отображении рельефа когда-либо (как вы знаете, для преобразования вектора в вектор в касательном пространстве или для преобразования вектора в касательную назад с использованием инверсного из матрицы 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

привет, @ Никол Болас. Я сделал это описание понятным и недвусмысленным. – qxsl2000

ответ

1

TBN матрица transform matrix преобразования между rasterised примитивно и мировых координат. 3 вектора представляют вашу матрицу вращения, а начало координат обычно помещается в (0,0,0) или в одну из вершин.

Ответ на ваш вопрос зависит от использования TBN. Если вы используете его только для векторов (например, для вычисления направленного света или bump mapping), то да TBN может быть просто матрицей вращения. Но если вам нужно преобразовать и позиции, вам нужна полная матрица с источником.

см связанные QA: Normal mapping gone horribly wrong где TBN используется как вращение матрицы 3х3.

Смежные вопросы