Изменение в текстурах буферов
This commit is contained in:
parent
17c105ab7d
commit
aa10fbfa8a
36
src/main.cpp
36
src/main.cpp
|
@ -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);
|
||||||
// Подключаем текстуры теней
|
// Подключаем текстуры теней
|
||||||
|
|
Loading…
Reference in New Issue