0001: ; c0     -- {0.0, 0.5, 1.0, 2.0}
0002: ; c1     -- メッシュの色
0003: ; c2     -- ブラーしたメッシュの色
0004: ; c3     -- ブラー用パラメータ (メッシュのサイズ/2.0f, ブラーの長さの倍率, 1, 0)
0005: ; c4-7   -- 透視変換行列
0006: ; c8-11  -- 現在のビュー座標系
0007: ; c12-15 -- 前のビュー座標系
0008: ; c16-19 -- ビュー行列 の逆転置行列
0009: ;
0010: ; v0    頂点の座標値
0011: ; v3    法線ベクトル
0012: ; v7    テクスチャ座標0
0013: 
0014: vs.1.0
0015: 
0016: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
0017: ; 座標変換
0018: 
0019: ; 前のビュー座標系で座標を変換する
0020: dp4 r0.x, v0, c12
0021: dp4 r0.y, v0, c13
0022: dp4 r0.z, v0, c14
0023: 
0024: ; 現在のビュー座標系で座標を変換する
0025: dp4 r1.x, v0, c8
0026: dp4 r1.y, v0, c9
0027: dp4 r1.z, v0, c10
0028: 
0029: ;差を取って、速度ベクトルを求める
0030: add r2.xyz, r1, -r0
0031: 
0032: ; 適当な係数を掛けて、ブラーの長さを調整する
0033: mul r2.xyz, r2, c3.y
0034: 
0035: ; 法線をビュー座標系に変換する
0036: dp3 r3.x, v3, c16
0037: dp3 r3.y, v3, c17
0038: dp3 r3.z, v3, c18
0039: 
0040: ; 速度の法線方向の成分を求める
0041: dp3 r2.w, r2, r3
0042: 
0043: ; (r2.w < 0) ?  r4 = r0 : r4 = r1
0044: slt  r3.w,   r2.w,  c0.x
0045: mad  r4.xyz, r3.w, -r2, r1
0046: mov  r4.w,   c0.z
0047: 
0048: ; r4 を透視変換
0049: dp4 oPos.x, r4, c4
0050: dp4 oPos.y, r4, c5
0051: dp4 oPos.z, r4, c6
0052: dp4 oPos.w, r4, c7
0053: 
0054: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
0055: ; 速度と法線の関係から色を計算する
0056: 
0057: dp3 r2.w, r2,  r2
0058: rsq r1.w, r2.w
0059: mul r2.w, r2.w, r1.w                ; r2.w = 速度ベクトルの長さ
0060: 
0061: mad r2.w, -r2.w, c3.x, c3.z         ; r2.w = 1 - 速度ベクトルの長さ/extent (extent = メッシュのサイズ/2.0f)
0062: 
0063: mul r5, c2, r2.w                    ; c2' = max (ブラーのついた基本色(c2), r2.w)
0064: 
0065: add r5,  r5, - c1
0066: mad oD0, r3.w, r5, c1               ; 色 = c1 + Max(0,N・V)*(c2'-c1)
0067:                                     ;     法線と速度の向きが同じなら color(ブラーの色として設定された色)
0068:                                     ;     法線と速度の向き反対なら メッシュの色
0069: 
0070: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
0071: ; テクスチャーを張る
0072: mov oT0.xy, v7
0073: