日別アーカイブ: 2007年10月14日

Direct3D 10 DXGI_FORMAT の機能対応一覧

DXGI_FORMAT_R11G11B10_FLOAT は RenderTarget として使えましたが、
DXGI_FORMAT_R9G9B9E5_SHAREDEXP はレンダリングできませんでした。
Direct3D 10 DXGI_FORMAT_R11G11B10_FLOAT の実験(2)
Direct3D 10 DXGI_FORMAT_R11G11B10_FLOAT の実験

また Direct3D10/DirectX10 では Pixel 形式も頂点形式もインデックスも
統合されています。BC1 (DXT1) は画像圧縮用フォーマットなので、
これは頂点形式に使えるのでしょうか。

フォーマット Type 毎に対応している機能や、どの用途に使えるのか
ID3D10Device::CheckFormatSupport() で調べることができます。

各フォーマットの機能一覧を作成してみました。

Direct3D 10.0 DXGI_FORMAT 機能対応一覧

表の BF は CreateBuffer() で作成できるかどうか、
1D ~ 3D はそれぞれ CreateTexture1D() ~ 3D() で作成できるかどうか、
Texture として使えるかどうかを意味しています。

BF = ID3D10Buffer
1D = ID3DTexture1D
2D = ID3DTexture2D
3D = ID3DTexture3D

VB, IB, SO は、VertexBuffer, IndexBuffer, StreamOutput や
InputLayout の定義に使えるかどうかです。これを見ると、やはり
BC1~BC5 (DXT) や、R8G8_B8G8/G8R8_G8B8 (YUV) などの圧縮形式は
画像以外に使えないことがわかります。

R9G9B9E5_SHAREDEXP はだめですが、R11G11B10_FLOAT は頂点でも
使用できるようです。

IndexBuffer に使えるのは
R32_UINT (32bit), R16_UINT (16bit) しかありませんでした。

VB = InputLayout (VertexBuffer)
IB = IndexBuffer
SO = StreamOutput

SL, SS, SC は、シェーダー中のリソースアクセス手段を示しています。
SL は Sampler を使わないで直接 Load() 命令が使えるかどうか、
SS は Sampler 経由の Sample() 命令が使えるかどうかです。

同じように SC は SampleCmp() 系命令に対応しています。わかりやすく
言えば、SC が付いたフォーマットはハードウエアシャドウマップ
(NVIDIA ShadowMap) に使えるということです。

SL = Load()
SS = Sample() / SampleGrad() / SampleLevel()
SC = SampleCmp() / SampleCmpLevelZero()

MI は MipMap です。ほとんどすべてのフォーマットが使用可能に
なっています。MA は Mipmap の自動生成対応かどうか。

MI = MipMap
MA = MipMap 自動生成

RT が付いたものは RenderTarget に使えます。整数形式を含めて
レンダリング可能な形式は結構多いようです。ただし Blend 可能な
なのは BL が付いたものだけです。Blend 対応フォーマットはそれほど
多くありませんが、32bit FLOAT もしっかり blend 対応になっている
など D3D9 世代と比べたらかなりの贅沢さです。

DS は DepthStencil 用フォーマットです。DepthStencil はまだまだ
特殊なフォーマットであることがわかります。

MT が付いたものはさらに MultiSample 対応になります。
DI (Display) は単なる RenderTarget ではなく、FrontBuffer として
使用可能なフォーマットを意味しているようです。

RT = RenderTarget
BL = Blend 対応
DS = DepthStencil
MT = MultiSample RenderTarget
DI = Display

その他の機能シンボルの意味は下記のとおりです。

CL = CPU で Lock (Map)できる
CW = 他の format に cast できる
MR = MultiSample Resolution 対応
ML = Multisample テクスチャを Load() 可能

表を見ていると 1bit 形式の DXGI_FORMAT_R1_UNORM はかなり特殊な
フォーマットであることがわかります。2D Texture にしか使えず
Mipmap もありません。RenderTarget もだめ。

またこのフォーマット機能表を確認しておくと、Direct3D 10.1 の
機能拡張の意味が見えてきます。
まず block-compressed (BC?) texture へのレンダリングができる
ようになるとのこと。

さらに Blend 対応の拡張があります。10.0 だと下記のものだけですが、
これが DirectX 10.1 ではすべての UNORM、SNORM で使えるように
なるそうです。

R32G32B32A32_FLOAT
R32G32_FLOAT
R32_FLOAT
R16G16B16A16_FLOAT
R16G16_FLOAT
R16_FLOAT
R11G11B10_FLOAT
R10G10B10A2_UNORM
R8G8B8A8_UNORM
R8G8B8A8_UNORM_SRGB
R8G8_UNORM
R8_UNORM
A8_UNORM