3

Direct2D を使用して 2 つの画像をブレンドしようとしていますが、最新の Direct2D のみがエフェクトとブレンド オプションをサポートしています。しかし、互換性の問題から最新バージョンの使用は避けたいと考えています。

  1. そうは言っても、エフェクト クラスを使用せずに Direct2D でブレンディング モード (ハードライト) を再作成し、ハードウェア アクセラレーションを維持する方法はありますか。

  2. そうでない場合、純粋にソフトウェア側のレンダリングはパフォーマンスに悪影響を及ぼしますか?

  3. D2D のピクセルにアクセスし、ピクセル単位の操作を行うにはどうすればよいですか?

ありがとうございました

4

1 に答える 1

2

まず、使用している DirectX のバージョンを教えてください。

1- 独自のシェーダーを作成し、シェーダーを使用するようにレンダリング パイプラインを変更できますが、これまでにこれを行ったことがない場合、これは大変な作業になる可能性があります。このリンクでは、DX11のレンダリング パイプラインについて説明し、このリンクでは DX 9 で説明しています。DX9 で作業している場合は、これを参照してください。

2- 1 回限りの操作でない限り、純粋なソフトウェア操作は非常に遅くなります。しかし、シェーディングやライティングを行おうとしているのであれば、ソフトウェア レンダリングは問題外です。これは、画像の数と各画像のサイズにも大きく依存します。つまり、フレームごとに小さな 16x16 の画像でそれを行う場合、それは可能です。しかし、フレームあたり 128x128 について話している場合、特にメモリ内グラフィックスの操作にはロックとクリティカル セクションが含まれるため、これは多くの時間のかかるプロセスになります。

3-これは、使用しているDXのバージョンと、どのように進めているかによって大きく異なりますが、DirectXに関するMSDNのAPIリファレンス記事を確認してください. 少しグーグルでこれを見つけることができることを保証します。

ご要望に応じて、2 つの画像をブレンドするピクセル シェーダーの擬似コードを次に示します。

// shader file start
sampler2D firstImage
sampler2D secondImage

PS_OUTPUT EvenBlendPixelShader( float4 position : POSITION0, float4 color : COLOR )
    float4 firstSample = firstImage( position )
    float4 secondSample = secondImage( position )
    float4 output = 0;
    output.x = (firstSample.x + secondSample.x) / 2;
    output.y = (firstSample.y + secondSample.y) / 2;
    output.z = (firstSample.z + secondSample.z) / 2;
    output.w = (firstSample.w + secondSample.w) / 2;
    return { position, output }

アイデアは、サンプラーを使用して各画像から特定のピクセルをサンプリングすることです。次に、2 つの値を平均して結果を返します。

ピクセル シェーダーに関するこの記事もご覧ください。

于 2013-09-24T15:13:52.197 に答える