ShaderModel 4.0 では、Shader 内で Texture の画像サイズを簡単に
参照することができます。自前でフィルタリングする場合など、UV 値の
計算に使えます。
3.0 以前のように、わざわざテクスチャサイズを外部から constant で
渡さなくてすむわけです。
取得するには Texture のオブジェクトに対して GetDimensions します。
August 2007 SDK のマニュアルを見るとちょっと説明が不完全で、
引数も足りず使い方もいまいちよくわかりません。メソッド名も微妙に
間違っているようです。
実際にコンパイルしてエラーメッセージから調べてみました。
GetDimensions() が正しい名前で、後述するいくつかのオーバーロードが
あるようです。
例えば Texture2D の場合次のようになります。
Texture2D diffuseTexture; : float4 PS_Main( GS_OUTPUT In ) : SV_Target { float2 size; float level; diffuseTexture.GetDimensions( 0, size.x, size.y, level ); : }
最初の 0 は参照する MipLevel です。
次の2つが受け取る width と height で、texture の pixel サイズに
相当します。例えば 1024 x 1024 のテクスチャを渡すと、
size.xy= float2( 1024, 1024 )
が入ります。最後は MipLevel の個数が返ります。
// Texture2D の場合 GetDimensions( in uint level, out uint width, out uint height, out uint levels ); GetDimensions( in uint level, out float width, out float height, out float levels ); GetDimensions( out uint width, out uint height ); GetDimensions( out float width, out float height );
2D の場合上記 4つのオーバーロードがあり、uint でも受け取れるし
miplevel が不要なら width と height だけ受け取ることもできるようです。
2D 以外は下記のとおり。
// Texture1D の場合 GetDimensions( in uint level, out uint width, out uint levels ); GetDimensions( in uint level, out float width, out float levels ); GetDimensions( out uint width ); GetDimensions( out float width ); // Texture3D の場合 GetDimensions( in uint level, out uint width, out uint height, out uint depth, out uint levels ); GetDimensions( in uint level, out float width, out float height, out float depth, out float levels ); GetDimensions( out uint width, out uint height, out uint depth ); GetDimensions( out float width, out float height, out float depth ); // TextureCube の場合 GetDimensions( in uint level, out uint width, out uint height, out uint levels ); GetDimensions( in uint level, out float width, out float height, out float levels ); GetDimensions( out uint width, out uint height ); GetDimensions( out float width, out float height );
Cube にも height がありますね。事実上 2DArray 相当だからでしょうか。