【问题标题】:OpenGL Additive blending causes white screenOpenGL加法混合导致白屏
【发布时间】:2013-08-26 22:25:41
【问题描述】:

我正在处理一个延迟着色项目,但在将所有灯光混合到最终渲染中时遇到了问题。

基本上,我只是在每个灯光上循环,然后用我的着色器渲染全屏四边形,该着色器进行光照计算,但最终结果只是一个纯白的屏幕。如果我禁用混合,我可以很好地看到场景,但它会被一盏灯照亮。

void Render()
{
    FirstPass();
    SecondPass();
}

void FirstPass()
{
    glDisable(GL_BLEND);
    glEnable(GL_DEPTH);
    glDepthMask(GL_TRUE);

    renderTarget->BindFrameBuffer();
    gbufferShader->Bind();

    glViewport(0, 0, renderTarget->Width(), renderTarget->Height());
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    for (int i = 0; i < meshes.size(); ++i)
    {
        // set uniforms and render mesh
    }
    renderTarget->UnbindFrameBuffer();
}

编辑:我不是在渲染光量/几何,我只是根据光(点/点/方向)计算最终像素颜色。

void SecondPass()
{
    glDepthMask(GL_FALSE);
    glDisable(GL_DEPTH_TEST);
    glEnable(GL_BLEND);
    glBlendFunc(GL_ONE, GL_ONE);

    renderTarget->BindTextures();

    pointLightShader->Bind();

    glViewport(0, 0, renderTarget->Width(), renderTarget->Height());
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    for (int i = 0; i < lights.size(); ++i)
    {
        // set uniforms
        // shader does lighting calculations 
        screenQuad->Render();
    }
    renderTarget->UnbindTextures();
}

除了每次输出最终片段颜色的 vec4 之外,我无法想象在着色器中还有什么特别的事情要做?

这是pointLight片段着色器的主要部分:

out vec4 FragColour;

void main() 
{
    vec4 posData = texture(positionTexture, TexCoord);
    vec4 normData = texture(normalTexture, TexCoord);
    vec4 diffData = texture(diffuseTexture, TexCoord);

    vec3 pos = vec3(posData);
    vec3 norm = vec3(normData);
    vec3 diff = vec3(diffData);

    float a = posData.w;
    float b = normData.w;
    float c = diffData.w;

    FragColour = vec4(shadePixel(pos, norm, diff), 1.0);
}

但是,是的,基本上如果我使用这种混合,整个屏幕都是白色的。

【问题讨论】:

  • 您是否只输出了第二遍以查看它是否产生了全白的东西?如果你把灯光的强度调低,你看到场景了吗?
  • 写入的像素是什么?您要渲染到哪种图像缓冲区?您是否使用 HDR 和色调映射?如果没有,您为什么认为没有它们的加法混合有任何意义?
  • 是的,如果我关闭混合,我可以很好地看到场景(只有一盏灯)。我将使用有关如何创建屏幕外渲染目标的代码来更新我的问题。
  • 我不认为您正在清除所有附件的颜色缓冲区。我需要看到你的BindFrameBuffer (...) 函数才能确定。
  • @tempvar 这不是我问的。我没有问你是否可以看到融合关闭的场景。我问第二遍是否产生了除白色以外的东西。当您关闭混合时,听起来您看到的是第一遍,而不是第二遍。我的观点与尼可波拉斯的观点基本相同。如果第二遍产生过亮(或第一遍和第二遍的叠加组合),那么您会看到全白。

标签: c++ opengl


【解决方案1】:

好吧,我修好了,现在我觉得自己像个白痴:)

我的opengl设置为

glClearColor(1.0, 1.0, 1.0, 1.0); 

它(显然)是纯白色的。

我只是把它改成黑色背景

glClearColor(0.0, 0.0, 0.0, 1.0);

现在我看到一切正常。我猜它是与白色背景相加混合的,这显然是白色的。

【讨论】:

    猜你喜欢
    • 2021-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多