我正在进行一个延迟着色项目,我遇到了将所有灯光混合到最终渲染中的问题。
基本上我只是循环遍历每个灯光,然后使用我的着色器渲染全屏四边形,进行光照计算,但最终结果只是一个纯白色的屏幕。如果我禁用混合,我可以看到场景很好,但它会被一盏灯照亮。
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);
}
但是,是的,基本上如果我使用这种混合,整个屏幕只是白色。
答案 0 :(得分:2)
我修好了,现在我觉得自己像个白痴:)
我的opengl设置为
glClearColor(1.0, 1.0, 1.0, 1.0);
(显然)是纯白色。
我刚把它改成黑色背景
glClearColor(0.0, 0.0, 0.0, 1.0);
现在我看到一切都很好。我猜它是与白色背景相加的混合,显然是白色的。