2022年11月24日木曜日

サンプラー見本

サンプラーはテクスチャを貼り付けるときに必要なリソースで、主にフィルターと、アドレスモードを設定する。(そのほかの値は比較関数以外は固定値で使いこなせてない)

フィルター


D3D12_FILTERのenum値で、定義値を見るとごちゃごちゃしていてよくわからない。
最初に定義されているのが「D3D12_FILTER_MIN_MAG_MIP_POINT」で、D3D12_FILTERの後に、MIN、MAG、MIP、POINTという名前がついている。
MINがテクスチャの縮小時の挙動、MAGがテクスチャの拡大時の挙動、MIPがミップレベルの挙動を指していて、最後のPOINTがその挙動。
挙動にはPOINTとLINERとANISOTROPICがあり、ANISOTROPICはちょっと特殊。
POINTはポイントサンプリング、LINERはサンプリングに線形補間を使用。

改めて「D3D12_FILTER_MIN_MAG_MIP_POINT」を見ると、拡大縮小、ミップレベルですべてポイントサンプリングするということになる。
別の定義「D3D12_FILTER_MIN_LINEAR_MAG_POINT_MIP_LINEAR」は、縮小時は線形補間、拡大時はポイントサンプリング、ミップレベルは線形補間を利用する。
ただリファレンスには「拡大または縮小のどちらを行うかの選択があいまいな場合に、未定義の動作が発生します。」とあるので、実質使うのは「D3D12_FILTER_MIN_MAG_MIP_POINT」と「D3D12_FILTER_MIN_MAG_MIP_LINER」だけでいいのではないか?

残りのANISOTROPICは異方性補完という方法で、視線も考慮した補完方法らしい。
線形補間よりも品質は良くなるがパフォーマンスも落ちるので、今のところは未使用。
定義も、「D3D12_FILTER_ANISOTROPIC」で、拡大縮小、ミップレベルの補完をいい具合にしてくれるみたい。

アドレスモード


D3D12_TEXTURE_ADDRESS_MODEのenum値で全部で5種類ある。

D3D12_TEXTURE_ADDRESS_MODE_WRAP

並べて表示

D3D12_TEXTURE_ADDRESS_MODE_MIRROR

反転して表示

D3D12_TEXTURE_ADDRESS_MODE_CLAMP

範囲外は端の色が続く

D3D12_TEXTURE_ADDRESS_MODE_BORDER

範囲外はD3D12_SAMPLER_DESCの色で塗りつぶされる
アルファを0にすると、範囲外は何も描かれなくなる

D3D12_TEXTURE_ADDRESS_MODE_MIRROR_ONCE

1回だけ反転して、それ以降はCLAMPの動作


アドレスモードはD3D12_SAMPLER_DESCに3つ指定することになる。
1つ目は横方向、2つ目は縦方向、3つ目はよくわからない。


横と縦に同じアドレスモードを指定した見本


貼り付けるテクスチャ画像はこれ。
テクスチャ画像

このテクスチャを5×5で表示(UVの値は-2~2を指定)

WRAP/LINER

ドットがしっかりした画像の場合は、線形補間するとぼやけてしまう。
以降はポイントサンプリング。

WRAP/POINT

MIRROR/POINT

CLAMP/POINT

BORDER/POINT

MIRROR ONE/POINT



横と縦に別のアドレスモードを指定した見本


横にWRAPを指定


WRAP/MIRROR/POINT

WRAP/CLAMP/POINT

WRAP/BORDER/POINT

WRAP/MIRROR ONE/POINT


横にMIRRORを指定


MIRROR/WRAP/POINT

MIRROR/CLAMP/POINT

MIRROR/BORDER/POINT

MIRROR/MIRROR ONE/POINT


横にCLAMPを指定


CLAMP/WRAP/POINT

CLAMP/MIRROR/POINT

CLAMP/BORDER/POINT

CLAMP/MIRROR ONE/POINT


横にBORDERを指定



BORDER/WRAP/POINT

BORDER/MIRROR/POINT

BORDER/CLAMP/POINT

BORDER/MIRROR ONE/POINT


横にMIRROR ONEを指定


MIRROR ONE/WRAP/POINT

MIRROR ONE/CLAMP/POINT

MIRROR ONE/BORDER/POINT

MIRROR ONE/MIRROR/POINT


0 件のコメント:

コメントを投稿