1

ポスト プロセス モーション ベクトル ベースのモーション ブラーを実装しようとしています。なんか「効く」…

2 つの大きな問題が発生しています。

  1. オブジェクトもカメラも移動しない場合、描画は空の画面を生成します。
  2. 画面の境界に沿ってオブジェクトの歪みがあります。

これは 2 パス アプローチです: pass#1 - オブジェクトを FBO テクスチャにレンダリングします。

2 番目のパスの頂点シェーダー:

void main(void){
    // transform previous and current position to eye space
    vec4 P =     MODEL_VIEW_MATRIX * position;
    vec4 Pprev = prevModelView * position;
    vec3 motionVector = P.xyz - Pprev.xyz;

    // calculate window space motion vector
    P =           PROJ  * MODEL_VIEW_MATRIX * position;
    Pprev =       PROJ * prevModelView * position;
    Pprev = mix(P, Pprev, blurScale);

    // choose previous or current position based on dot product between motion vector 
    // and normal
    vec3 N = mat3(MODEL_VIEW_MATRIX) *normal;
    bool flag = dot(motionVector, N) > 0;
    vec4 Pstretch = flag ? P : Pprev;
    gl_Position =  position;

    // do divide by W -> NDC coordinates
    P.xyz = P.xyz / P.w;
    Pprev.xyz = Pprev.xyz / Pprev.w;

    // calculate window space velocity
    vec3 dP = (P.xyz - Pprev.xyz) * halfWindowSize.xyz;
    float len = length (dP)/(halfWindowSize[0]*2);
    len = clamp(len, 0., 1.);
    dP =  normalize(dP);
    dP.z = len; 
    out_velocity = dP;
}

2 番目のパスのフラグメント シェーダー:

void main(void){
    float w = 1.0 / samples;        
    vec4 a=vec4(0.);
    vec2 velocity = out_velocity.xy * blurScale * .05 * out_velocity.z;

    ivec2 tsize = textureSize(COLOR_MAP_0, 0);
    vec2 screntc = gl_FragCoord.xy * (1.0 / vec2(tsize));

    // sample into scene texture along motion vector 
    for(float i=0; i<samples; i+=1) 
    {
        float t = i / (samples-1);
        a = a + texture(COLOR_MAP_0, vec2(screntc)  + velocity * t ) * w;               
    }

    colorOut = a;
 }

これらのシェーダーの何が問題になっていますか?

4

0 に答える 0