ジオメトリ実現の例
このトピックは次のセクションで構成されます。
- 目的
- 説明
- アンチエイリアスされたジオメトリのパフォーマンスを向上するための不透明度マスクと A8 ターゲットの使用
- エイリアスされたジオメトリのパフォーマンスを向上するためのメッシュの使用
- ユーザー シナリオ
- 詳細
- オプション
- 実装の詳細
- 要件
- サンプルのダウンロード
- サンプルのビルド
- コマンド プロンプトを使用したサンプルのビルド
- Visual Studio 2008 を使用したサンプルのビルド (推奨される方法)
目的
- 従来のジオメトリのレンダリングの代替方法として不透明度マスクとメッシュを利用した場合のメリットとコストを説明すること。
- 上記の機能を提供するために他のアプリケーションで使用できる自己完結型パッケージを提供すること。
説明
Direct2D では、ジオメトリは、すべてのターゲットで無限に拡張できる、デバイス非依存のリソースです。実際、ジオメトリはベクトルとしてレンダリングされます。これにより、実際のジオメトリのレンダリング時には処理も増加します。多くのアプリケーションでは、その背後でターゲットに依存しないようにする必要はありません。このようなシナリオでは、ジオメトリ データのキャッシュによってパフォーマンスを大幅に向上できます。
このサンプルでは、ジオメトリのキャッシュを使用できる複数のシナリオに対応しています。シナリオは次のとおりです。
- 塗りつぶされたジオメトリまたは描画されたジオメトリ
- エイリアスされたジオメトリまたはアンチエイリアスされたジオメトリ
- ハードウェアとソフトウェアのパフォーマンス
このサンプルでは、実際にはジオメトリである多数のオブジェクトがアニメーション化されているシーンを表示します。このサンプルでは、次の出力が生成されます。
重要な概念を次に示します。
アンチエイリアスされたジオメトリのパフォーマンスを向上するための不透明度マスクと A8 ターゲットの使用
不透明度マスクとは、アルファ チャネルで表されるカバレッジ情報を提供するという目的のみを持つビットマップです。つまり、不透明度マスクは、レンダリングされているコンテンツの透明度を制御します。
Direct2D により、アプリケーションは、ID2D1RenderTarget::FillGeometry の呼び出しと同様に、Brush を使用して Bitmap (アルファがマスクとして扱われる場所) を塗りつぶすことができます。ビットマップのアルファ チャネルは、ジオメトリの各ピクセルのカバレッジを表すために使用されるため、これは、ブラシで適切に塗りつぶされた後、不透明度ブラシで調節されます。通常、アプリケーションでは、ID2D1RenderTarget::CreateCompatibleRenderTarget で作成された中間のレンダー ターゲットに描画することで、この AlphaMask ビットマップを生成します。
エイリアスされたジオメトリのパフォーマンスを向上するためのメッシュの使用
ID2D1Mesh は、Direct2D で FillMesh を使用して描画できる、一連のレンダー ターゲットの頂点を表すために使用されます。このようなレンダー ターゲットの頂点は、三角形リストを形成する単純な X または Y の位置です。メッシュ表現は、ビデオ カードに保存される内容に近似しています。すべてのジオメトリがテセレートされ、三角形を形成するレンダー ターゲットの頂点のリストがビデオ カードに格納された後、ジオメトリがレンダリングされます。メッシュ表現は既にその形式になっているため、レンダリングの処理速度は非常に高速になり、パフォーマンスが向上します。メッシュは、レンダリング モードがエイリアスに設定されている場合にのみ使用可能です。
ユーザー シナリオ
最も起こりうるシナリオとして、アプリケーションによって同一の複雑なパスが多数描画されるシナリオが考えられます。このようなシナリオでは、ジオメトリを一度キャッシュすると、繰り返し描画できます。たとえば、2D のスロット マシーン ゲームでは、同じアイテムがさまざまな色を使用して何度も表示されます。
ただし、実現について次の点に注意してください。
- アンチエイリアスされた実現では、膨大の量のメモリが消費される場合があります。
- これは、基になるビットマップの領域によって異なります。
- アルファのみのビットマップを使用することで、若干 (25%) 軽減できます。
- パフォーマンス上のメリットがあるのは、ハードウェア レンダー ターゲットを使用する場合のみです。
- 変換はその場で変更できますが、その結果、品質が低下します。
- 不透明度マスクは、拡大表示されると "ムラ" になります。
- メッシュが拡大表示されると、ベジエにファセットが現れるようになります。
詳細
オプション
このサンプルは、複数の設定を使用して実行し、レンダリング モードおよびシーンの複雑さを変更できます。
次の表では、各種オプションについて説明します。
コントロール | 動作 |
---|---|
上方向キー | レンダリングされるプリミティブの数を増やします。 |
下方向キー | レンダリングされるプリミティブの数を減らします。 |
Space キー | アニメーションを一時停止または再開します。 |
T キー | ハードウェア レンダリングとソフトウェア レンダリングを切り替えます。 |
R キー | ジオメトリのレンダリング時における実現の有無を切り替えます。 |
A キー | アンチエイリアシング モードを切り替えます。 |
マウス ホイール | マウスのカーソルをアプリケーションの領域の上に置いている間に拡大および縮小します。拡大表示するときに、フォーカスはマウスに従います。実現は再生成されません。 |
このサンプルの目的は、ズームの実装方法を示すことではなく、実現には制限があり、無制限に拡大表示できないことを示すことです。品質の大幅な低下を回避するために、ズーム レベルを高くすると実現を再作成できることに注意してください。ただし、このサンプルでは、そのケースは示されません。
実装の詳細
既に説明したとおり、このサンプルの目的の 1 つは、事前に設定された実現パッケージを開発者に提供することです。
実現パッケージは、2 つのインターフェイスに分割されています。そのインターフェイスとは、IGeometryRealizationFactory と IGeometryRealization です。
その趣旨は、ユーザーがリソース ドメインごとに 1 つの実現ファクトリを作成することです。つまり、レンダー ターゲットおよびそれと互換性のあるレンダー ターゲットごとに 1 つの実現ファクトリが作成されます。ファクトリの目的は、不透明度マスクのアトラスなど、実現間で共有されるリソースを追跡することです。ただし、現時点では、パッケージでアトラスはサポートされていません。
ユーザーは、実現ファクトリから IGeometryRealization を作成し、この実現の使用方法として、描画、塗りつぶし、またはその両方を行うかどうか、また、描画が行われる場合は使用するパラメーターを指定します。その後、この実現には、このようなコンテキストでレンダリングするために必要なすべてのサブリソースが格納されます。作成時に指定されていないコンテキストでリソースが使用されると、エラーが返されます。ただし、ワールド変換は例外です。RT 上のワールド変換が作成時に指定された変換と異なる場合、この違いが相殺されるように実現が適切に変換されます。たとえば、現在のワールド変換が 3x3 スケールであるときに 2x2 スケール変換で実現が作成された場合、実現は 3/2x3/2 だけ拡張されます。これにより、実現されていない部分と同じサイズのジオメトリが作成されます。ただし、品質は低下します (この品質低下の本質は実現の種類によって異なります)。
ユーザーがなんらかの方法で実現を変更する (たとえば、新しいワールド変換を考慮する) 場合は、IGeometryRealization::Update を呼び出すことができます。これにより、可能な場合は、既存のリソースを再利用できます。
疑似コードでは、パッケージは次のようになります。
GeometryRealizationFactory::CreateGeometryRealization
{
if (alisased)
{
if (filled)
{
// Create mesh
// Tessellate geometry into mesh
}
if (stroked)
{
// Widen geometry
// Create mesh
// Tessellate widened geometry into mesh
}
// Store creation-time world transform and inverse
}
if (antialiased)
{
if (filled)
{
// Get bounds of geometry
// Create bitmap render target with size = size of computed bounds and with
// alpha-only pixel format.
// Render geometry into RENDER TARGET
// Store creation-time world transform + translation to position
// bitmap and inverse.
}
if (stroked)
{
// Widen geometry
// Get bounds of widened geometry
// Create bitmap RENDER TARGET with size = size of computed bounds and with
// alpha-only pixel format.
// Render geometry into RENDER TARGET
// Store creation-time world transform + translation to position
// bitmap and inverse
}
}
};
GeometryRealizationFactory::Fill
{
//
// Determine if the target is HW/SW.
if (inSoftware || renderMode == ForceUnealized)
{
m_pRENDER TARGET->FillGeometry(m_unrealizedGeometry);
}
else
{
//
// Get RENDER TARGET transform
//
// Set RENDER TARGET transform = inverse(creationTransform) * currentTransform
//
// Get RENDER TARGET antialias mode
//
if (AAmode == aliased)
{
m_pRENDER TARGET->FillMesh();
}
else
{
m_pRENDER TARGET->FillOpacityMask();
}
// Reset RENDER TARGET transform
}
}
要件
クライアントの最小要件 | Windows 7 または Windows Vista with Service Pack 2 (SP2) および Platform Update for Windows Vista |
サーバーの最小要件 | Windows Server 2008 R2 または Windows Server 2008 with Service Pack 2 (SP2) および Platform Update for Windows Server 2008 |
Windows SDK | Windows 7 用 Windows ソフトウェア開発キット (SDK) (英語の可能性あり) |
サンプルのダウンロード
このサンプルは、次の場所で入手できます。
場所 | パス/URL |
---|---|
Windows SDK | \Program Files\Microsoft SDKs\Windows\v7.0\Samples\Multimedia\Direct2D\GeometryRealizationSample |
コード ギャラリー | MSDN コード ギャラリーからダウンロード (英語の可能性あり) |
サンプルのビルド
コマンド プロンプトを使用したサンプルのビルド
- コマンド プロンプト ウィンドウを開き、サンプル ディレクトリに移動します。
- 「
msbuild GeometryRealizationSample.sln
」と入力します。
Visual Studio 2008 を使用したサンプルのビルド (推奨される方法)
- エクスプローラーを開き、サンプル ディレクトリに移動します。
- .sln (ソリューション) ファイルのアイコンをダブルクリックし、Visual Studio でプロジェクトを開きます。
- [ビルド] メニューの [ソリューションのビルド] をクリックします。アプリケーションは、既定の \Debug ディレクトリまたは \Release ディレクトリにビルドされます。