diff --git a/src/main.cpp b/src/main.cpp index 38ab2e3..4fb140b 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -16,8 +16,9 @@ // Указатели на текстуры для изменения размеров окна Texture* pgPosition = NULL; Texture* pgNormal = NULL; -Texture* pgDiffuseP = NULL; -Texture* pgAmbientSpecular = NULL; +Texture* pgBaseColor = NULL; +Texture* pgRMS = NULL; +Texture* pgEmittedColor = NULL; Texture* pgID = NULL; RBO* pgrbo = NULL; Texture* pssaoTexture = NULL; @@ -39,10 +40,12 @@ void framebuffer_size_callback(GLFWwindow* window, int width, int height) pgPosition->reallocate(width, height, 0, GL_RGB32F, GL_RGB); if (pgNormal) pgNormal->reallocate(width, height, 1, GL_RGB16F, GL_RGB); - if (pgDiffuseP) - pgDiffuseP->reallocate(width, height, 2, GL_RGBA16F); - if (pgAmbientSpecular) - pgAmbientSpecular->reallocate(width, height, 3); + if (pgBaseColor) + pgBaseColor->reallocate(width, height, 2, GL_RGB); + if (pgRMS) + pgRMS->reallocate(width, height, 3, GL_RGB, GL_RGB); + if (pgEmittedColor) + pgEmittedColor->reallocate(width, height, 8, GL_RGB, GL_RGB); if (pgID) pgID->reallocate(width, height, 7, GL_RGB32UI, GL_RGB_INTEGER, GL_UNSIGNED_INT); // И буфера глубины @@ -146,7 +149,7 @@ int main(void) gShader.load(GL_FRAGMENT_SHADER, "shaders/gshader.frag"); gShader.link(); // Установим значения текстур - const char* textures_base_shader_names[] = {"tex_diffuse", "tex_ambient", "tex_specular", "tex_heights", "tex_normal"}; + const char* textures_base_shader_names[] = {"tex_albedo", "tex_roughness", "tex_metallic", "tex_specular", "tex_emitted", "tex_heights", "tex_normal"}; gShader.bindTextures(textures_base_shader_names, sizeof(textures_base_shader_names)/sizeof(const char*)); // Загрузка сцены из obj файла @@ -180,14 +183,15 @@ int main(void) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); // Использование уменьшенных версий mipmap // Создадим G-буфер с данными о используемых привязках - GLuint attachments[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3, GL_COLOR_ATTACHMENT4 }; + GLuint attachments[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3, GL_COLOR_ATTACHMENT4, GL_COLOR_ATTACHMENT5 }; FBO gbuffer(attachments, sizeof(attachments) / sizeof(GLuint)); // Создадим текстуры для буфера кадра Texture gPosition(WINDOW_WIDTH, WINDOW_HEIGHT, GL_COLOR_ATTACHMENT0, 0, GL_RGB32F, GL_RGB); // Позиция вершины Texture gNormal(WINDOW_WIDTH, WINDOW_HEIGHT, GL_COLOR_ATTACHMENT1, 1, GL_RGB16F, GL_RGB); // Нормали - Texture gDiffuseP(WINDOW_WIDTH, WINDOW_HEIGHT, GL_COLOR_ATTACHMENT2, 2, GL_RGBA16F); // Диффузная составляющая и коэф. глянцевости - Texture gAmbientSpecular(WINDOW_WIDTH, WINDOW_HEIGHT, GL_COLOR_ATTACHMENT3, 3); // Фоновая составляющая и один канал зеркальной + Texture gBaseColor(WINDOW_WIDTH, WINDOW_HEIGHT, GL_COLOR_ATTACHMENT2, 2, GL_RGB, GL_RGB); // Базовый цвет материала + Texture gRMS(WINDOW_WIDTH, WINDOW_HEIGHT, GL_COLOR_ATTACHMENT3, 3, GL_RGB, GL_RGB); // Шероховатость, металличность, интенсивность блика Texture gID(WINDOW_WIDTH, WINDOW_HEIGHT, GL_COLOR_ATTACHMENT4, 7, GL_RGB32UI, GL_RGB_INTEGER, GL_UNSIGNED_INT); // Идентификатор объекта + Texture gEmittedColor(WINDOW_WIDTH, WINDOW_HEIGHT, GL_COLOR_ATTACHMENT5, 8, GL_RGB, GL_RGB); // Излучаемый свет // Создадим буфер рендера под буфер глубины и привяжем его RBO grbo(WINDOW_WIDTH, WINDOW_HEIGHT); gbuffer.assignRenderBuffer(grbo.getHandler()); @@ -197,10 +201,11 @@ int main(void) // Сохраним указатели на текстуры для изменения размеров окна pgPosition = &gPosition; pgNormal = &gNormal; - pgDiffuseP = &gDiffuseP; - pgAmbientSpecular = &gAmbientSpecular; + pgBaseColor = &gBaseColor; + pgRMS = &gRMS; pgrbo = &grbo; pgID = &gID; + pgEmittedColor = &gEmittedColor; // Шейдер для расчета освещенности ShaderProgram lightShader; @@ -209,7 +214,7 @@ int main(void) lightShader.load(GL_FRAGMENT_SHADER, "shaders/lighting.frag"); lightShader.link(); // Привязка текстур - const char* gtextures_shader_names[] = {"gPosition", "gNormal", "gDiffuseP", "gAmbientSpecular", "sunShadowDepth", "pointShadowDepth", "ssao", "gID"}; + const char* gtextures_shader_names[] = {"gPosition", "gNormal", "gBaseColor", "gRMS", "sunShadowDepth", "pointShadowDepth", "ssao", "gID", "gEmittedColor"}; lightShader.bindTextures(gtextures_shader_names, sizeof(gtextures_shader_names)/sizeof(const char*)); // Загрузка данных о границах каскадов glUniform1fv(lightShader.getUniformLoc("camera_cascade_distances"), CAMERA_CASCADE_COUNT, &camera_cascade_distances[1]); @@ -549,9 +554,10 @@ int main(void) // Подключаем текстуры G-буфера gPosition.use(); gNormal.use(); - gDiffuseP.use(); - gAmbientSpecular.use(); + gBaseColor.use(); + gRMS.use(); gID.use(); + gEmittedColor.use(); // Идентификатор выбранного объекта для обводки glUniform3uiv(lightShader.getUniformLoc("selectedID"), 1, (GLuint*) &selected); // Подключаем текстуры теней