From 9d0de5ce0fed80fbc0c1fded95e026f7cf0737da Mon Sep 17 00:00:00 2001 From: "re.kovalev" Date: Tue, 31 Oct 2023 11:20:18 +0300 Subject: [PATCH] =?UTF-8?q?=D0=91=D1=83=D1=84=D0=B5=D1=80=20=D1=80=D0=B5?= =?UTF-8?q?=D0=BD=D0=B4=D0=B5=D1=80=D0=B0=20=D1=82=D0=B5=D0=BD=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.cpp | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) 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(); // Подключаем шейдер для прямоугольника