【问题标题】:OpenGL equivalent of DirectX renderstatesDirectX 渲染状态的 OpenGL 等效项
【发布时间】:2017-04-18 00:30:34
【问题描述】:

我在这里处理的是旧系统,所以着色器不是一个选项。

我需要修改的代码有一个渲染管道,其中大部分显示被渲染到纹理,然后该纹理被绘制到屏幕上。预计它看起来就像一开始就没有渲染到纹理一样。

它在 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 等价物?

我一直在疯狂尝试不同的组合,虽然我可以接近,但我从来没有完全达到它看起来和最初没有渲染到纹理一样的地步——半透明区域无论我尝试什么,要么变暗,要么变亮。

【问题讨论】:

    标签: c++ opengl directx pipeline legacy


    【解决方案1】:

    除非我遗漏了什么,否则您应该能够比较 D3DBLEND enumerationglBlendFunc() 的文档。

    • D3DBLEND_SRCALPHA 转换为 GL_SRC_ALPHA
    • D3DBLEND_INVSRCALPHA 转换为 GL_ONE_MINUS_SRC_ALPHA
    • D3DBLEND_ONE 转换为 GL_ONE

    当您想单独指定 alpha 分量时,您需要使用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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-17
      • 2014-10-19
      • 1970-01-01
      • 2016-07-29
      相关资源
      最近更新 更多