2017-04-18 39 views
0

私はここでレガシーシステムを扱っているので、シェーダはオプションではありません。OpenGL相当のDirectXレンダリング

私が修正する必要があるコードには、ディスプレイの大部分がテクスチャにレンダリングされ、そのテクスチャがスクリーンに描画されるレンダリングパイプラインがあります。最初の場所で決してテクスチャにレンダリングされなかったかのように正確に見えることが期待されます。

それは、この関数を呼び出すことにより、DirectXの中でこれを実現:

void RenderTargetChanged(bool isRenderToTexture) 
{ 
    if (!isRenderToTexture) 
    { 
     gDevice->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA); 
     gDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA); 
     gDevice->SetRenderState(D3DRS_SRCBLENDALPHA,D3DBLEND_SRCALPHA); 
     gDevice->SetRenderState(D3DRS_DESTBLENDALPHA,D3DBLEND_INVSRCALPHA); 
     gDevice->SetRenderState(D3DRS_SEPARATEALPHABLENDENABLE,FALSE); 
    } 
    else 
    { 
     gDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); 
     gDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); 
     gDevice->SetRenderState(D3DRS_SRCBLENDALPHA, D3DBLEND_ONE); 
     gDevice->SetRenderState(D3DRS_DESTBLENDALPHA, D3DBLEND_INVSRCALPHA); 
     gDevice->SetRenderState(D3DRS_SEPARATEALPHABLENDENABLE, TRUE); 
    } 
} 

(、二つのブランチ間の唯一の違いはD3DRS_SRCBLENDALPHAとD3DRS_SEPERATEALPHABLENDENABLEの値注意事項です)

のOpenGL同等とは何ですか?

私はさまざまな組み合わせを試してみると夢中になってきました。私はCLOSEを得ることができましたが、最初はテクスチャがレンダリングされていないかのように見えます私が何をしようと、暗くなったり明るくなったりする。

答えて

3

紛失していない限り、D3DBLEND enumerationglBlendFunc()のドキュメントを比較できるはずです。

  • D3DBLEND_SRCALPHAGL_SRC_ALPHA
  • D3DBLEND_INVSRCALPHAに変換GL_ONE_MINUS_SRC_ALPHA
  • D3DBLEND_ONEに変換しますが、個別アルファ成分を指定したい場合は、あなたがglBlendFuncSeparate()を使用する必要がGL_ONE

に変換します。

glEnable(GL_BLEND); 

if (!isRenderToTexture) { 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
    glBlendEquation(GL_FUNC_ADD); 
} else { 
    glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 
    glBlendEquationSeparate(GL_FUNC_ADD, GL_FUNC_ADD); 
} 
関連する問題