diff --git a/src/main.cpp b/src/main.cpp index 6d47cb3..f7da71e 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -176,7 +176,7 @@ int main(void) lightShader.load(GL_VERTEX_SHADER, "shaders/quad.vert"); lightShader.load(GL_FRAGMENT_SHADER, "shaders/lighting.frag"); 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*)); glm::vec3 quadVertices[] = { {-1.0f, 1.0f, 0.0f} @@ -191,6 +191,24 @@ int main(void) quadModel.load_verteces(quadVertices, 4); 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; // Загрузка и компиляция шейдеров @@ -218,6 +236,19 @@ int main(void) // Тут производится рендер 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(); // Подключаем шейдер для прямоугольника