速度ブラー

nVidiaのソースをよく読むと速度バッファ何て使っていないことに気がついた。
速度をPixelShaderに直接渡してその値で直接摂動してるんですね。


テクスチャに書き込む場合、負の値が書き込めないので書き込むときに変換してあげないといけないし、GeForceFXだと浮動小数点バッファを使えないので書き込む段階で速度が0〜1にクランプされてしまうので色々と情報がなくなってしまう。
といってもPixelShader内部での小数点の扱いもそんなに大きな値は使えなかった気もするのですが、資料がみつからない。


結局直接渡してしまうのがいいみたい。
でもポスト処理ではなくなるので見えないオブジェクトとかも毎回テクスチャ摂動が入ってしまうので場合によっては重くなるような気もする。
テクスチャ摂動はキャッシュを無視してメモリにアクセスすることになるので結構重い。
できればポスト処理で済ませたい所だけど精度の問題(なのかどうかはわからないが)もあるしトレードオフといったところかな。
サンプルも結構重いし。


それからテクスチャの符号設定はXBOXだけでした!
あれがあると明示的に符号を指定できるので間違いが減ってとてもいい感じだ。Windowsでも実装して欲しい。

  • 速度を直接渡す場合に頂点の座標からUVを生成する

摂動するときにスクリーン上での頂点の位置を基準にしないといけない。具体的には頂点の位置を0.0〜1.0に変換する必要がある。
参照するテクスチャのフォーマットがリニアの場合は変換しなくても良いのかもしれない。
変換されたUV座標を入れると今度はパースがかかってしまう。


平面上での変換なのに頂点に奥行き情報があるのでパース補正が逆にパースを生んでしまうのだ。のだとか言っちゃってかっこいいな。


とにかくそれをオフにする必要があるのだけれどもHLSL上だとwを1にしてもパースがかかってしまう。
それから変換するとy方向に縮む。
テクスチャの歪みは心の歪み。y方向に縮むのと歪みは関係あるようなきがしますね。