レンダー ターゲットとレンダー ターゲット マネージャ

ハードウェア(GPU)レンダー ターゲットの作成と管理の統合メカニズムは、API で公開されます。すべてのレンダー ターゲットは、リソース マネージャによって管理され、再利用できるようにキャッシュされます。ターゲットのサイズを変更するどの種類のリソース管理も、リソース マネージャによって処理されます。他の GPU リソースと同様に、インタフェースは、描画 API に依存せずにリソースをカプセル化できます。

レンダー ターゲットは、レンダリングが行われるピクセルのターゲット ブロック(バッファ)として表すことができます。

レンダー ターゲットは、DirectX SwapChain などのスクリーン上の出力バッファ、またはオープン フレーム バッファや OpenGL コンテキストとしてみなされません。これは、レンダラは必ずしもビューポートであるとは限らないという概念に戻るもので、ビューポートへのレンダリングは OpenGL コンテキストへのレンダリングと同じという前提に基づきます。

API では、レンダー ターゲットは MRenderTarget で表されます。

次のようなターゲットを使用することができます。

  1. カラー値を保持する。これをカラー ターゲットと呼びます。
  2. 深度値を保持する。これを深度ターゲットと呼びます。
  3. 深度とステンシルの値を保持する。これを深度 + ステンシル ターゲットと呼びます。

カラー ターゲットと深度ターゲットを最も正確に説明すると、ターゲットはレンダリング先にすることができるテクスチャであるといえます。1 つまたは複数のカラー ターゲットまたは深度ターゲット(あるいはその両方)を設定して、レンダリングをアクティブに送信している場所を示すことができます。

旧式のインタフェースでは、カラーと深度に対してそれぞれ 1 つのフォーマットのみサポートされていました。これは、固定 RGBA 24 ビット カラーと固定 24 ビット深度でした。ステンシル フォーマットのサポートは、現在でも単一チャネルの 8 ビットの固定点のままです。現在使用可能なバリエーションは、MRenderTargetDescription を使用して表されます。この記述子には次のオプションがあります。

レンダーターゲットを取得するプロセスは、次のとおりです。

  1. レンダー ターゲットの記述子(MRenderTargetDescription)を作成し、入力します。
  2. ターゲット マネージャ(MRenderTargetManager)からターゲットの取得を試みます。
  3. この取得は失敗する可能性があり、ビデオ カード、カードのドライバ、および使用できるリソースによります。たとえば、レンダー ターゲットは大量の GPU メモリを使い果たす可能性があり、大きな寸法、高ビットの深度、およびマルチサンプリング パラメータ値を使用してターゲットを作成しようとして失敗する可能性があります。

ターゲット管理の複雑さを解消するために、ターゲットに、新しい記述子を設定することができる便利なメソッドが用意されています。このメソッドが呼び出されるたびに、フォーマットの変更やサイズの変更が行われます。最初の取得と同様に、サイズの変更は失敗する可能性があります。

図 32: 左側に、2 つの潜在的なレンダー ターゲットがあります。「MyColorTarget」という名前のターゲットは、R16G16_Float を使用するカラー ターゲットです。「MyDepthTarget」という名前の 2 番目のターゲットは、32 ビット浮動小数点深度ターゲットです。これらの名前は、GPU の実際のレンダー ターゲットを参照するために使用されます。右側は、取得と更新のレイアウトです。「説明の更新」アクションでは、別の取得を通して GPU リソースを更新しようとします。

カラー レンダー ターゲットと深度レンダー ターゲットのリソース ハンドルにアクセスすることはできますが、深度 + ステンシル ターゲットには必ずしもアクセスできると限りません。DirectX 11 の場合、カラー ターゲットと深度ターゲットは、ターゲットのビュー(ID3D11RenderTargetView)への参照として返されます。深度 + ステンシル ターゲットは深度ステンシル(ID3D11DepthStencilView)ビューとして返されます。OpenGL では、カラー ターゲットと深度ターゲットがテクスチャへの参照(整数のテクスチャ識別子)として返されます。深度 + ステンシル ターゲットにはアクセスできません。ターゲットの内容を直接変更することはできますが、一般的にはお勧めできません。プラグインでは、基盤となるリソースは削除されません。

MRenderTarget とも呼ばれる旧式のインタフェースは、ここで説明している、MHWRender ネームスペース(MHWRender::MRenderTarget)内にあるコンストラクトとは異なりますので、混同しないようにしてください。前の定義は、単なるビューポート OpenGL コンテキストのラップ元であり、このフレームワークには関係ありません。