Изменение в текстурах буферов

This commit is contained in:
Ковалев Роман Евгеньевич 2023-06-13 14:35:39 +03:00 committed by re.kovalev
parent 17c105ab7d
commit aa10fbfa8a
1 changed files with 21 additions and 15 deletions

View File

@ -16,8 +16,9 @@
// Указатели на текстуры для изменения размеров окна // Указатели на текстуры для изменения размеров окна
Texture* pgPosition = NULL; Texture* pgPosition = NULL;
Texture* pgNormal = NULL; Texture* pgNormal = NULL;
Texture* pgDiffuseP = NULL; Texture* pgBaseColor = NULL;
Texture* pgAmbientSpecular = NULL; Texture* pgRMS = NULL;
Texture* pgEmittedColor = NULL;
Texture* pgID = NULL; Texture* pgID = NULL;
RBO* pgrbo = NULL; RBO* pgrbo = NULL;
Texture* pssaoTexture = 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); pgPosition->reallocate(width, height, 0, GL_RGB32F, GL_RGB);
if (pgNormal) if (pgNormal)
pgNormal->reallocate(width, height, 1, GL_RGB16F, GL_RGB); pgNormal->reallocate(width, height, 1, GL_RGB16F, GL_RGB);
if (pgDiffuseP) if (pgBaseColor)
pgDiffuseP->reallocate(width, height, 2, GL_RGBA16F); pgBaseColor->reallocate(width, height, 2, GL_RGB);
if (pgAmbientSpecular) if (pgRMS)
pgAmbientSpecular->reallocate(width, height, 3); pgRMS->reallocate(width, height, 3, GL_RGB, GL_RGB);
if (pgEmittedColor)
pgEmittedColor->reallocate(width, height, 8, GL_RGB, GL_RGB);
if (pgID) if (pgID)
pgID->reallocate(width, height, 7, GL_RGB32UI, GL_RGB_INTEGER, GL_UNSIGNED_INT); 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.load(GL_FRAGMENT_SHADER, "shaders/gshader.frag");
gShader.link(); 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*)); gShader.bindTextures(textures_base_shader_names, sizeof(textures_base_shader_names)/sizeof(const char*));
// Загрузка сцены из obj файла // Загрузка сцены из obj файла
@ -180,14 +183,15 @@ int main(void)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); // Использование уменьшенных версий mipmap glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); // Использование уменьшенных версий mipmap
// Создадим G-буфер с данными о используемых привязках // Создадим 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)); FBO gbuffer(attachments, sizeof(attachments) / sizeof(GLuint));
// Создадим текстуры для буфера кадра // Создадим текстуры для буфера кадра
Texture gPosition(WINDOW_WIDTH, WINDOW_HEIGHT, GL_COLOR_ATTACHMENT0, 0, GL_RGB32F, GL_RGB); // Позиция вершины 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 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 gBaseColor(WINDOW_WIDTH, WINDOW_HEIGHT, GL_COLOR_ATTACHMENT2, 2, GL_RGB, GL_RGB); // Базовый цвет материала
Texture gAmbientSpecular(WINDOW_WIDTH, WINDOW_HEIGHT, GL_COLOR_ATTACHMENT3, 3); // Фоновая составляющая и один канал зеркальной 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 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); RBO grbo(WINDOW_WIDTH, WINDOW_HEIGHT);
gbuffer.assignRenderBuffer(grbo.getHandler()); gbuffer.assignRenderBuffer(grbo.getHandler());
@ -197,10 +201,11 @@ int main(void)
// Сохраним указатели на текстуры для изменения размеров окна // Сохраним указатели на текстуры для изменения размеров окна
pgPosition = &gPosition; pgPosition = &gPosition;
pgNormal = &gNormal; pgNormal = &gNormal;
pgDiffuseP = &gDiffuseP; pgBaseColor = &gBaseColor;
pgAmbientSpecular = &gAmbientSpecular; pgRMS = &gRMS;
pgrbo = &grbo; pgrbo = &grbo;
pgID = &gID; pgID = &gID;
pgEmittedColor = &gEmittedColor;
// Шейдер для расчета освещенности // Шейдер для расчета освещенности
ShaderProgram lightShader; ShaderProgram lightShader;
@ -209,7 +214,7 @@ int main(void)
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", "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*)); 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]); glUniform1fv(lightShader.getUniformLoc("camera_cascade_distances"), CAMERA_CASCADE_COUNT, &camera_cascade_distances[1]);
@ -549,9 +554,10 @@ int main(void)
// Подключаем текстуры G-буфера // Подключаем текстуры G-буфера
gPosition.use(); gPosition.use();
gNormal.use(); gNormal.use();
gDiffuseP.use(); gBaseColor.use();
gAmbientSpecular.use(); gRMS.use();
gID.use(); gID.use();
gEmittedColor.use();
// Идентификатор выбранного объекта для обводки // Идентификатор выбранного объекта для обводки
glUniform3uiv(lightShader.getUniformLoc("selectedID"), 1, (GLuint*) &selected); glUniform3uiv(lightShader.getUniformLoc("selectedID"), 1, (GLuint*) &selected);
// Подключаем текстуры теней // Подключаем текстуры теней