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;