2017-04-18 73 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); 
}