gpt4 book ai didi

c++ - OpenGL Additive混合导致白屏

转载 作者:行者123 更新时间:2023-11-28 03:11:12 30 4
gpt4 key购买 nike

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

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

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 之外,我无法想象在着色器中有什么特别的事情要做?

这是点光源片段着色器的主要部分:

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

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

最佳答案

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

我的 opengl 设置为

glClearColor(1.0, 1.0, 1.0, 1.0); 

(显然)是纯白色的。

我只是把它改成了黑色背景

glClearColor(0.0, 0.0, 0.0, 1.0);

现在我看到一切都很好。我猜它是与白色背景相加混合的,而白色背景显然是白色的。

关于c++ - OpenGL Additive混合导致白屏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18420063/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com