From 9bcd8c06c5d216fe05c9a8499cacb29823f098f0 Mon Sep 17 00:00:00 2001 From: "R.E. Kovalev" Date: Mon, 3 Apr 2023 10:26:47 +0300 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B0=D0=BF=D0=B8=D1=81=D1=8C=20ID=20?= =?UTF-8?q?=D0=BE=D0=B1=D1=8A=D0=B5=D0=BA=D1=82=D0=B0=20=D0=B2=20=D1=82?= =?UTF-8?q?=D0=B5=D0=BA=D1=81=D1=82=D1=83=D1=80=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shaders/gshader.frag | 5 +++++ src/main.cpp | 7 ++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/shaders/gshader.frag b/shaders/gshader.frag index e080f30..140a525 100644 --- a/shaders/gshader.frag +++ b/shaders/gshader.frag @@ -15,6 +15,7 @@ layout (location = 0) out vec3 gPosition; layout (location = 1) out vec3 gNormal; layout (location = 2) out vec4 gDiffuseP; layout (location = 3) out vec4 gAmbientSpecular; +layout (location = 4) out uvec3 gID; in vec3 vertex; // Позиция вершины в пространстве in vec3 N; // Нормаль трансформированноая @@ -31,6 +32,8 @@ uniform sampler2D tex_normal; uniform float parallax_heightScale = 0.1; +uniform uvec3 ID = uvec3(0); + void main() { // Сформируем TBN матрицу @@ -103,4 +106,6 @@ void main() gAmbientSpecular.rgb = texture(tex_ambient, new_texCoord).rgb * ka; // Сохранение зеркальной составляющей gAmbientSpecular.a = texture(tex_specular, new_texCoord).r * ks.r; + // Сохранение идентификатора объекта + gID = ID; } \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index cd9ffb8..4914a45 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -17,6 +17,7 @@ Texture* pgPosition = NULL; Texture* pgNormal = NULL; Texture* pgDiffuseP = NULL; Texture* pgAmbientSpecular = NULL; +Texture* pgID = NULL; RBO* pgrbo = NULL; Texture* pssaoTexture = NULL; Texture* pssaoTexture_raw = NULL; @@ -41,6 +42,8 @@ void framebuffer_size_callback(GLFWwindow* window, int width, int height) pgDiffuseP->reallocate(width, height, 2, GL_RGBA16F); if (pgAmbientSpecular) pgAmbientSpecular->reallocate(width, height, 3); + if (pgID) + pgID->reallocate(width, height, 7, GL_RGB32UI, GL_RGB_INTEGER, GL_UNSIGNED_INT); // И буфера глубины if (pgrbo) pgrbo->reallocate(width, height); @@ -165,13 +168,14 @@ 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 }; + GLuint attachments[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3, GL_COLOR_ATTACHMENT4 }; 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 gID(WINDOW_WIDTH, WINDOW_HEIGHT, GL_COLOR_ATTACHMENT4, 7, GL_RGB32UI, GL_RGB_INTEGER, GL_UNSIGNED_INT); // Идентификатор объекта // Создадим буфер рендера под буфер глубины и привяжем его RBO grbo(WINDOW_WIDTH, WINDOW_HEIGHT); gbuffer.assignRenderBuffer(grbo.getHandler()); @@ -184,6 +188,7 @@ int main(void) pgDiffuseP = &gDiffuseP; pgAmbientSpecular = &gAmbientSpecular; pgrbo = &grbo; + pgID = &gID; // Шейдер для расчета освещенности ShaderProgram lightShader;