ディファード シェーディング プロジェクトに取り組んでいますが、すべてのライトを最終的なレンダリングにブレンドする際に問題があります。
基本的には、各ライトをループしてから、ライティングの計算を行うシェーダーでフルスクリーン クワッドをレンダリングするだけですが、最終的な結果は真っ白な画面になります。ブレンディングを無効にすると、シーンはきれいに見えますが、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);
}
でも、基本的にこのブレンドを使用すると、画面全体が真っ白になります。