Буфер рендера теней

This commit is contained in:
parent 86de8dc102
commit 9d0de5ce0f
1 changed files with 32 additions and 1 deletions

View File

@ -176,7 +176,7 @@ int main(void)
lightShader.load(GL_VERTEX_SHADER, "shaders/quad.vert"); lightShader.load(GL_VERTEX_SHADER, "shaders/quad.vert");
lightShader.load(GL_FRAGMENT_SHADER, "shaders/lighting.frag"); lightShader.load(GL_FRAGMENT_SHADER, "shaders/lighting.frag");
lightShader.link(); lightShader.link();
const char* gtextures_shader_names[] = {"gPosition", "gNormal", "gDiffuseP", "gAmbientSpecular"}; const char* gtextures_shader_names[] = {"gPosition", "gNormal", "gDiffuseP", "gAmbientSpecular", "sunShadowDepth"};
lightShader.bindTextures(gtextures_shader_names, sizeof(gtextures_shader_names)/sizeof(const char*)); lightShader.bindTextures(gtextures_shader_names, sizeof(gtextures_shader_names)/sizeof(const char*));
glm::vec3 quadVertices[] = { {-1.0f, 1.0f, 0.0f} glm::vec3 quadVertices[] = { {-1.0f, 1.0f, 0.0f}
@ -191,6 +191,24 @@ int main(void)
quadModel.load_verteces(quadVertices, 4); quadModel.load_verteces(quadVertices, 4);
quadModel.load_indices(quadIndices, 6); quadModel.load_indices(quadIndices, 6);
// Размер текстуры тени от солнца
const GLuint sunShadow_resolution = 1024;
// Создадим буфер кадра для рендера теней
FBO sunShadowBuffer;
// Создадим текстуры для буфера кадра
Texture sunShadowDepth(sunShadow_resolution, sunShadow_resolution, GL_DEPTH_ATTACHMENT, 4, GL_DEPTH_COMPONENT, GL_DEPTH_COMPONENT);
// Отключим работу с цветом
glDrawBuffer(GL_NONE);
glReadBuffer(GL_NONE);
// Активируем базовый буфер кадра
FBO::useDefault();
// Шейдер для расчета теней
ShaderProgram sunShadowShader;
// Загрузим шейдер
sunShadowShader.load(GL_VERTEX_SHADER, "shaders/sun_shadow.vert");
sunShadowShader.link();
// Шейдер для рисования отладочных лампочек // Шейдер для рисования отладочных лампочек
ShaderProgram bulbShader; ShaderProgram bulbShader;
// Загрузка и компиляция шейдеров // Загрузка и компиляция шейдеров
@ -218,6 +236,19 @@ int main(void)
// Тут производится рендер // Тут производится рендер
scene.render(gShader, material_data); scene.render(gShader, material_data);
// Изменим размер вывода для тени
glViewport(0, 0, sunShadow_resolution, sunShadow_resolution);
// Активируем буфер кадра для теней от солнца
sunShadowBuffer.use();
// Подключим шейдер для расчета теней
sunShadowShader.use();
// Очистка буфера глубины
glClear(GL_DEPTH_BUFFER_BIT);
// Рендерим геометрию в буфер глубины
scene.render(sunShadowShader, material_data);
// Изменим размер вывода для окна
glViewport(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT);
// Активируем базовый буфер кадра // Активируем базовый буфер кадра
FBO::useDefault(); FBO::useDefault();
// Подключаем шейдер для прямоугольника // Подключаем шейдер для прямоугольника