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