2017-04-18 54 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_SRCALPHA轉化爲GL_SRC_ALPHA
  • D3DBLEND_INVSRCALPHA轉化爲GL_ONE_MINUS_SRC_ALPHA
  • D3DBLEND_ONE如果要單獨指定alpha分量,那麼你需要使用轉換爲GL_ONE

glBlendFuncSeparate()

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); 
}