UV座標系では画像は全て0~1の間にスケーリングされます。では、もしも1以上の数値を指定した場合はどうなるのでしょうか?下はその結果です。
verts[0].Position =new Vector3(1, 1,0); verts[0].Tu = 0; verts[0].Tv =0; verts[1].Position =new Vector3(-1, 1,0); verts[1].Tu = 2; verts[1].Tv =0; verts[2].Position =new Vector3(1, -1,0); verts[2].Tu = 0; verts[2].Tv =2; verts[3].Position =new Vector3(-1, -1,0); verts[3].Tu = 2; verts[3].Tv =2;
と、こんな感じになります。ちなみにマイナスの値を指定することもできますが、あんまりにも大きな値(または小さな値)を指定すると失敗することがあるので注意です(そこら辺についてはMSDNでお願いします)。
public void SetSamplerState( int stage, SamplerStageStates state, int value );
「Sampler」は簡単に言うと「Sampl」つまり「サンプル(取り出す)」のことです。つまりテクスチャから特定のピクセルを拾い上げるときにどういう拾い上げをするかを設定するものです。「stage」は0番からです。「state」については下の表にまとめておきます。「value」の型はオーバーライドで「float、bool、int」があります。
DMapOffset |
ElementIndex |
SrgbTexture |
MaxMipLevel |
MipMapLevelOfDetailBias |
BorderColor |
AddressW |
AddressV |
AddressU |
MinFilter |
MagFilter |
MaxAnisotropy |
MipFilter |
いくつかのものについてはここでも触れますが、マイナーであったり、私の環境でサポートされていないものについては説明しないかもしれません。
標準ではUV座標に0~1以外の値をセットすると繰り返しになります。ですが、設定によってはミラーしながらテクスチャを貼り付ける事なんかも可能です。
列挙型 | 説明 |
---|---|
AddressU | u座標で使うアドレッシングモード。デフォルト値はTextureAddress.Wrap。「TextureAddress」を利用して設定します。 |
AddressV | v座標で使うアドレッシングモード。詳細は上を同じ。 |
AddressW | w座標で使うアドレッシングモード。詳細は上と同じ。キューブテクスチャで使います。 |
BorderColor | 境界色。特定のアドレッシングモードで利用します。 |
verts[0].Position =new Vector3(1, 1,0); verts[0].Tu = -1; verts[0].Tv =-1; verts[1].Position =new Vector3(-1, 1,0); verts[1].Tu = 2; verts[1].Tv =-1; verts[2].Position =new Vector3(1, -1,0); verts[2].Tu = -1; verts[2].Tv =2; verts[3].Position =new Vector3(-1, -1,0); verts[3].Tu = 2; verts[3].Tv =2;
デフォルトの設定です。設定方法は次の通りです。
device_.SetSamplerState(0,SamplerStageStates.AddressU ,(int)TextureAddress.Wrap); device_.SetSamplerState(0,SamplerStageStates.AddressV ,(int)TextureAddress.Wrap);
表示すると上のような感じになります。微妙なゆがみは補正をかけていないからです。
device_.SetSamplerState(0,SamplerStageStates.AddressU ,(int)TextureAddress.Mirror); device_.SetSamplerState(0,SamplerStageStates.AddressV ,(int)TextureAddress.Mirror);
まあ、見ての通りです。画像を反転コピーさせながら表示させます。
device_.SetSamplerState(0,SamplerStageStates.AddressU ,(int)TextureAddress.Clamp); device_.SetSamplerState(0,SamplerStageStates.AddressV ,(int)TextureAddress.Clamp);
0~1以外は端っこの色を引き延ばして表示します。
device_.SetSamplerState(0,SamplerStageStates.AddressU ,(int)TextureAddress.Border); device_.SetSamplerState(0,SamplerStageStates.AddressV ,(int)TextureAddress.Border); device_.SetSamplerState(0,SamplerStageStates.BorderColor ,Color.Black.ToArgb());
設定した境界色で0~1以外を塗りつぶします。境界色も同じ方法で設定します。
device_.SetSamplerState(0,SamplerStageStates.AddressU ,(int)TextureAddress.MirrorOnce); device_.SetSamplerState(0,SamplerStageStates.AddressV ,(int)TextureAddress.MirrorOnce);
これだけはテクスチャの座標が[-2,2]になっています。この機能は説明しにくいです。とりあえず図の通り。使い所がよく分からない。
設定は「U,V」別々になっているためそれぞれ別々に指定できます。工夫して使ってみて下さい。
包むようなサンプルを行いたいときに使うものです。これを設定するとアドレッシングは無視されます。
これはたとえば、[0.6,0.4]と指定した場合に[0.6,1.4]とWrapでラッピングするのと同じ事をしてくれます。どうしてこの機能があるのかよく分かりませんが、一応紹介しておきます。設定は「Device.RenderState.Wrap0」に設定します。数字の部分はステージ番号と対応しているのでそれにあわせて使って下さい。ここには列挙型を指定します。「WrapCoordinates」というものです。
Zero | Uテクスチャのラッピング(1次元方向のラッピング)。 |
One | Vテクスチャのラッピング(2次元方向のラッピング)。 |
Two | Wテクスチャのラッピング(3次元方向のラッピング)。 |
Three | 4次元方向のラッピング。 |
とりあえず、それぞれ指定するとラッピングを行ってくれます。それと無効にしたい場合は「0」を代入してあげればOKです。
他にも拡大縮小時のサンプリングフィルタに関する設定もありますが、それはまた後の機会にということで。