コンピュータグラフィックスでは、目に見えるサンプリングパターンを回避するために、サンプリング位置にジッターを適用するのが一般的な手法です。
フラグメントシェーダーのサンプル位置にジッターを適用する適切な方法は何ですか?私が考えることができる1つの方法は、ノイズテクスチャをシェーダーにフィードし、このノイズテクスチャのtexlvalueに応じて、サンプリングしたいもののサンプリング位置を変更することです。
ジッタを実装するためのより良い方法はありますか?
さまざまなハードウェアドライバーのAAスキームは通常、すでにジッターベースです。各ベンダーには独自のパターンがあります。そして残念ながら、ユーザー/プレーヤーはしばしば設定を台無しにし、物事のオンとオフを切り替えることができます。
これはあなたに「正しい」方法がないと思わせるかもしれません-そしてあなたは正しいでしょう!いくつかの方法があり、そのいくつかはいくつかのタスクに適しています。あなたが好きなものを学び、使用してください。
表面テクスチャのジッターについては、次のように試してみてください。
フォトショップで、256x512 rgbイメージ(またはNVIDIA DDSエクスポーターの一部のバージョンでは256x511)を作成し、すべてをランダムノイズで埋め、「既存のミップマップを使用」してDDSとして保存します。これにより、テクスチャがどれだけスケーリングされているかに関係なく、ほぼ均一なノイズが得られます(少なくとも多くの有用なサイズ範囲で)。
シェーダーで、ノイズテクスチャを読み取り、それをUVに適用してから、他のテクスチャを読み取ります。
float4ノイズ=tex2D(noiseSampler、OriginalUV);
float2 newUV = OriginalUV + someSmallScale *(noise.xy-0.5);
float4 jitteredColor = tex2D(colorSampler、newUV);
好きなように他のバリエーションを試してください。強いテクスチャジッターは多くのテクスチャキャッシュミスを引き起こす可能性があることに注意してください。これはパフォーマンスコストを伴う可能性があります。また、すでにフィルタリングされた信号に高周波成分を導入しているため、法線マップには注意してください。