2017-07-13 25 views
0

私は、ここに開始する前に、この質問の良い検索を持っていた:dev-> SetRenderState(D3DRS_ALPHAREF、value)と同等のDirectX 11とは何ですか?

How to set RenderState in DirectX11?

があまりにも一般的です。最初の答えを調べるには、私はブレンドステートが必要だと思うが、アルファ比較を設定する方法は明白ではない。

D3DRS_ALPHAREFのスタックオーバーフローを検索すると、他にもわずか7つの質問が発生しました。https://stackoverflow.com/search?q=D3DRS_ALPHAREFどれもリモートでも近くにありません。

私はこれを、1パスの画像から2パスへの2パスレンダリングを行うプログラムに使用しています。私はレンダリングしているテクスチャと同じサイズのコントロールテクスチャを持っており、シングルチャンネルの輝度です。私のピクセルシェーダの

最後の行は、次のとおりです。

// Copy rgb from the source texture 
out.color.rgb = source.color.rgb; 
// copy alpha from the control texture. 
out.color.a = control.color.r; 
return out; 

その後、私は持っている私のレンダリングセットアップに:

frameNumは、移行の現在のフレーム番号である
DWORD const reference = static_cast<DWORD>(frameNum); 
D3DCMPFUNC const compare = pass == 0 ? D3DCMP_GREATEREQUAL : D3DCMP_LESS; 
m_pd3dDevice->SetRenderState(D3DRS_ALPHAREF, reference); 
m_pd3dDevice->SetRenderState(D3DRS_ALPHAFUNC, compare); 

:0〜255。

- 編集 - DirectX 9のこの特定の機能に精通していない人にとって、最終段階では、比較機能を使用してpiからのアルファ出力を比較しますxelシェーダを参照値と比較し、比較が真の値を返す場合は実際にピクセルを描画します。

この結果はすべて、コントロールテクスチャの輝度レベルが、トランジションの各ピクセルの変化の早さまたは遅さを制御することです。

DirectX 11ではどのように正確にこれを行うのですか?

はい、私は同じ結果を達成するための他の方法があることを認識しています。適切に細工されたピクセルシェーダにframeNumを渡すと、同じ場所に移動できます。

これは重要なことではありませんが、代替実装を探しているわけではありません.DirectX 9で随時有用なツールとして実証されているため、DirectX 11でアルファ比較を行う方法を学びたいと考えています。

答えて

1

Direct3D 9からDirect3D 11に移行する場合は、Direct3D 10の変更点を簡単に取り上げると便利です。これについては、MSDNで詳しく説明しています。その記事のポイントの一つは次のとおりです。固定機能

取り外しそれも、完全にプログラム可能なパイプラインを活用するのDirect3D 9エンジンでは、その領域の数が残っていること、時には驚くべきことです固定機能(FF)パイプラインに依存する。最も一般的な領域は、通常、UI用の画面スペースに合わせたレンダリングに関連しています。この理由から、FFエミュレーションシェーダまたは必要な置換動作を提供するシェーダのセットを構築する必要がある可能性が高いです。

このドキュメントには、最も一般的なFF動作(固定機能EMUサンプルを参照)の代替シェーダソースが含まれているホワイトペーパーが含まれています。アルファテストを含むいくつかの固定機能ピクセル動作がシェーダに移動さ​​れました。

IOW:あなたが後でのDirect3D 10またはプログラマブルシェーダでこれを行います。

、特にAlphaTestEffect(このcppshaderファイルで実装されています)をご覧ください。

関連する問題