Я только что реализовал отложенный рендеринг, и у меня возникли проблемы с работой моего скайбокса. Я пытаюсь визуализировать свой скайбокс в самом конце цикла рендеринга, и все, что я получаю, это черный экран. Вот цикл рендеринга:
//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
, чтобы она не прошла тест глубины. Должно ли это не только рисовать скайбокс в местах, где другие объекты еще не были нарисованы? Почему это приводит к черному экрану?
Я знаю, что правильно настроил скайбокс, потому что если я просто нарисую скайбокс сам по себе, он будет отображаться нормально.
GL_DEPTH_TEST
для прохода освещения, либо отрисовка вашей геометрии изменяет значения глубины повсюду. Я не заметил ничего очевидного. Я бы установилgl_FragDepth
, а неgl_Position.z
, потому что я бы предположил, что это испортит отсечение, но если это работает, то работает. - person jozxyqk   schedule 29.03.2015GL_DEPTH_TEST
. Я также пытался установитьgl_FragDepth
, но это все равно приводит к черному экрану. Я действительно не знаю, почему это не работает. Если я не включуGL_DEPTH_TEST
перед рендерингом скайбокса, он появится, но никакая другая геометрия не будет отображаться, потому что скайбокс находится поверх всего. - person theonewhoknocks   schedule 30.03.2015TexCoord
должен гарантировать, что вы не станете черным, предполагая, что ваша текстура не привязана и не привязана, если только координата не равна нулю (что в любом случае поместит геометрию за камеру). Я бы попытался сузить круг причин, вызывающих черный цвет. Может быть, начать с установки постоянного цвета во фрагментном шейдере. - person jozxyqk   schedule 30.03.2015pos.xyww
, но если не происходят какие-то странные операции смешивания, фрагмент должен либо устанавливать, либо не устанавливать пиксель. Не знаю, как он становится черным. Не могли бы вы добавить полную матрицу обзора в скайбокс, чтобы разместить его как объект в мире и посмотреть, как он будет отображаться? - person jozxyqk   schedule 31.03.2015GL_DEPTH_TEST
перед рисованием скайбокса, то я увижу только скайбокс и никакую другую геометрию. Но я думаю, чтоGL_DEPTH_TEST
следует включить перед рисованием скайбокса. Я также должен отметить, что если я не включу тест глубины при рисовании скайбокса, я могу на долю секунды увидеть геометрию, которая должна быть отрисована до того, как скайбокс будет отрисован поверх всего. - person theonewhoknocks   schedule 01.04.2015