4

編集:問題は解決しました!投稿の最後を参照してください。

DirectX 8 で Photoshop から「スクリーン」描画モードを実装するにはどうすればよいですか?

情報、このトピックで見つけました ( http://www.ziggyware.com/readarticle.php?article_id=228 ):

Result = 1 – (1 – destination) * (1 – source)
Result = 1 – (1 – source – destination + destination * source)
Result = 1 – 1 + source + destination – destination * source
Result = source + destination – destination * source
Result = destination + source – source * destination
Result = destination + source * (1 – destination)

計算が完了したので、あとはブレンド モードを設定するだけです。

BlendOperation = Add
DestinationBlend = One
SourceBlend = InvDestColor

DirectX のブレンディング状態は次のようになっている必要があると思います。

pD3DDevice->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD);
pD3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);
pD3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_INVDESTCOLOR);

それが正しいか?(結果が間違っています)

サンプル プロジェクト:リンク ミラー

Photoshop の結果:

http://img192.imageshack.us/img192/7015/photoshopf.jpg

DirectX での私の結果:

http://img193.imageshack.us/img193/2969/directx.jpg

問題の解決: 式は画像のアルファを考慮していません。これを修正するには、画像の背景を不透明度 100% の黒一色にする必要があります。

4

2 に答える 2

2

次の行は間違っています:

pD3DDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_ADD);

あなたの意図はおそらく、アルファ ブレンダーが ADD を実行する必要があることを示すことですが、D3DTSS_COLOROP 設定は最終的なブレンダーには影響せず、代わりにテクスチャ コンバイナーを設定します。テクスチャからサンプリングした色に何か (前/次の段階の結果、またはそのようなもの) を追加するように設定しますが、これは間違っています。D3DTOP_SELECTARG1 またはデフォルトの D3DTOP_MODULATE が機能します。

代わりに書く必要があるのは次のとおりです。

pD3DDevice->SetRenderState(D3DBLENDOP, D3DBLENDOP_ADD);
于 2009-06-06T19:02:30.990 に答える
0

計算は正しいようで、DirectX関数を設定する方法は機能するはずです。

私のアドバイスは:

  1. Photoshopで使用しているのと同じ画像を使用して、純粋な白(可能性あり)が正しく作成されていないことを確認します。
  2. 他のブレンディングモードを実行できること、およびそれらが正しい出力を生成することを確認してください。

    • すでに両方を行っている場合は、お詫び申し上げます。
于 2009-06-06T18:24:03.300 に答える