Я только что реализовал отложенный рендеринг, и у меня проблемы с работой моего skybox. Я пытаюсь сделать свой skybox в самом конце цикла рендеринга, и все, что я получаю, это черный экран. Вот цикл рендеринга:Отложенный рендеринг Skybox OpenGL
//binds the fbo
gBuffer.Bind();
//the shader that writes info to gbuffer
geometryPass.Bind();
glDepthMask(GL_TRUE);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glDisable(GL_BLEND);
//draw geometry
geometryPass.SetUniform("model", transform.GetModel());
geometryPass.SetUniform("mvp", camera.GetViewProjection() * transform.GetModel());
mesh3.Draw();
geometryPass.SetUniform("model", transform2.GetModel());
geometryPass.SetUniform("mvp", camera.GetViewProjection() * transform2.GetModel());
sphere.Draw();
glDepthMask(GL_FALSE);
glDisable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glBlendEquation(GL_FUNC_ADD);
glBlendFunc(GL_ONE, GL_ONE);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glClear(GL_COLOR_BUFFER_BIT);
//shader that calculates lighting
pointLightPass.Bind();
pointLightPass.SetUniform("cameraPos", camera.GetTransform().GetPosition());
for (int i = 0; i < 2; i++)
{
pointLightPass.SetUniformPointLight("light", pointLights[i]);
pointLightPass.SetUniform("mvp", glm::mat4(1.0f));
//skybox.GetCubeMap()->Bind(9);
quad.Draw();
}
//draw skybox
glEnable(GL_DEPTH_TEST);
skybox.Render(camera);
window.Update();
window.SwapBuffers();
Ниже приводится скайбокс визуализирует функцию
glCullFace(GL_FRONT);
glDepthFunc(GL_LEQUAL);
m_transform.SetPosition(camera.GetTransform().GetPosition());
m_shader->Bind();
m_shader->SetUniform("mvp", camera.GetViewProjection() * m_transform.GetModel());
m_shader->SetUniform("cubeMap", 0);
m_cubeMap->Bind(0);
m_cubeMesh->Draw();
glDepthFunc(GL_LESS);
glCullFace(GL_BACK);
А вот скайбокс в вершинном шейдер:
layout (location = 0) in vec3 position;
out vec3 TexCoord;
uniform mat4 mvp;
void main()
{
vec4 pos = mvp * vec4(position, 1.0);
gl_Position = pos.xyww;
TexCoord = position;
}
пиксельный шейдер скайбокс просто устанавливает выходной цвет до texture(cubeMap, TexCoord)
. Как вы можете видеть из вершинного шейдера, я устанавливаю компонент z
позиции w
так, чтобы он всегда имел глубину 1. Я также устанавливаю функцию глубины GL_LEQUAL
, чтобы она не прошла проверку глубины , Должно ли это не только рисовать skybox в местах, где другие объекты еще не были нарисованы? Почему это приводит к черному экрану?
Я знаю, что я правильно установил skybox, потому что, если я просто рисую skybox сам по себе, это проявляется просто отлично.
Я думаю, ваше последнее предложение говорит все это. Он работает без рисования ранее. Либо предыдущие обратные вызовы меняют состояние GL, такие как включение GL_DEPTH_TEST для пропуска освещения, или рисование вашей геометрии меняет значения глубины во всем мире. Я не заметил ничего очевидного. Я бы установил 'gl_FragDepth', а не' gl_Position.z', потому что я предполагал, что это будет беспорядок с отсечением, но если он работает, он работает. – jozxyqk
Я не знаю, как геометрия меняет значения глубины всюду, но пропуска света или любой проход после прохождения геометрии не изменяет 'GL_DEPTH_TEST'. Я также попытался установить 'gl_FragDepth', но это все еще приводит к черному экрану. Я не знаю, почему он не работает. Если я не включил 'GL_DEPTH_TEST' перед отображением skybox, он появляется, но ни одна из других геометрий не показывает, потому что skybox находится поверх всего. – theonewhoknocks
О, право. Дело в черном экране довольно странно (я предположил, что вы имели в виду, что фон был черным). Если вы рисуете что-то, что перезаписывает предыдущие значения черным, то что-то действительно рисует. Если вы видите небо без глубины, я могу предположить, что небо перезаписывает черную геометрию. Хотя 'TexCoord' должен гарантировать, что вы не получите черное, если ваша текстура не будет и связана, если координата не равна нулю (что поместило бы геометрию за камеру в любом случае). Я бы попытался сузить то, что вызывает черный цвет. Возможно, начните с установки постоянного цвета в шейдере фрагмента. – jozxyqk