0

ディファード シェーディング プロジェクトに取り組んでいますが、すべてのライトを最終的なレンダリングにブレンドする際に問題があります。

基本的には、各ライトをループしてから、ライティングの計算を行うシェーダーでフルスクリーン クワッドをレンダリングするだけですが、最終的な結果は真っ白な画面になります。ブレンディングを無効にすると、シーンはきれいに見えますが、1 つのライトで照らされます。

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

でも、基本的にこのブレンドを使用すると、画面全体が真っ白になります。

4

1 に答える 1

2

さて、私はそれを修正しました、そして私は今ばかのように感じます:)

私のopenglはに設定されていました

glClearColor(1.0, 1.0, 1.0, 1.0); 

これは(明らかに)真っ白です。

黒背景に変えてみました

glClearColor(0.0, 0.0, 0.0, 1.0);

そして今、私はすべてがうまく見えます。明らかに白である白い背景と相加的にブレンドされていたと思います。

于 2013-08-25T12:44:55.983 に答える