日別アーカイブ: 2009年2月3日

Direct2D その(2) インターフェース

ヘッダを読みながら整理してみました。

● RenderTarget

基本となるのが ID2D1RenderTarget です。いわゆるキャンバスのこと。
各種描画命令を使って RenderTarget の上に絵を描いていきます。
次のバリエーションがあります。

ID2D1RenderTarget
 → ID2D1BitmapRenderTarget
 → ID2D1HwndRenderTarget
 → ID2D1GdiInteropRenderTarget
 → ID2D1DCRenderTarget

それぞれ Bitmap (Texture) に描いたり、そのままウィンドウに描いたりできるということ。
ラインなどプリミティブを描画する命令もありますが、パス(Geometry) を使ったり
DirectWrite を併用してテキストも描くことができます。
描画時に SetTransform() で渡した 3×2 matrix が適用されるようです。
2D の回転、拡大縮小、平行移動などが可能。

● Geometry

Direct2D を特徴付ける存在といえるかもしれません。
ID2D1Geometry はパスや形状などジオメトリを格納します。
無理矢理例えれば Direct3D の VertexBuffer/IndexBuffer のような存在でしょうか。

パスを構成する要素、ラインやベジェ(2次、3次)、Arc を使用することができます。
Geometry の段階で Transform したり合成したり交差を考慮して演算したり、
といった操作が可能。結構自由度が高そうです。
ID2D1Geometry を継承しているインターフェースは次の通り。

ID2D1Geometry
 → ID2D1RectangleGeometry
 → ID2D1RoundedRectangleGeometry
 → ID2D1EllipseGeometry
 → ID2D1GeometryGroup
 → ID2D1TransformedGeometry
 → ID2D1PathGeometry

● Brush

ID2D1Brush は描画時に使用する状態を保持します。マテリアルやレンダーステートを
保持した StateBlock のようなイメージでしょうか。GDI にもあります。
下記の種類があります。

ID2D1Brush
 → ID2D1BitmapBrush
 → ID2D1SolidColorBrush
 → ID2D1LinearGradientBrush
 → ID2D1RadialGradientBrush

大きいのがこの 3つのグループです。
その関係は「 Geometry を Brush を使って RenderTarget に描画する 」ということ。

ID2D1RenderTarget, ID2D1Geometry, ID2D1Brush はどれも ID2D1Resource に
属しています。ID2D1Resource を継承しているインターフェースは他にもあります。

ID2D1Resource
 → ID2D1Bitmap
 → ID2D1GradientStopCollection
 → ID2D1Brush
 → ID2D1StrokeStyle
 → ID2D1Geometry
 → ID2D1Mesh
 → ID2D1Layer
 → ID2D1DrawingStateBlock
 → ID2D1RenderTarget

ID2D1Resource に属していないのは ~ Sink 系と ID2D1Factory のみ。

ID2D1SimplifiedGeometrySink
ID2D1GeometrySink
ID2D1TessellationSink

~Sink はまだよく理解していませんが、Geometry を操作する場合のイテレータの
ような存在ではないかと思われます。

関連エントリ
Direct2D と Direct3D10.1 の下位互換