まず、使用している 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 つの値を平均して結果を返します。
ピクセル シェーダーに関するこの記事もご覧ください。