Запись ID объекта в текстуру

This commit is contained in:
Ковалев Роман Евгеньевич 2023-04-03 10:26:47 +03:00 committed by re.kovalev
parent 5f9e1f3003
commit 9bcd8c06c5
2 changed files with 11 additions and 1 deletions

View File

@ -15,6 +15,7 @@ layout (location = 0) out vec3 gPosition;
layout (location = 1) out vec3 gNormal; layout (location = 1) out vec3 gNormal;
layout (location = 2) out vec4 gDiffuseP; layout (location = 2) out vec4 gDiffuseP;
layout (location = 3) out vec4 gAmbientSpecular; layout (location = 3) out vec4 gAmbientSpecular;
layout (location = 4) out uvec3 gID;
in vec3 vertex; // Позиция вершины в пространстве in vec3 vertex; // Позиция вершины в пространстве
in vec3 N; // Нормаль трансформированноая in vec3 N; // Нормаль трансформированноая
@ -31,6 +32,8 @@ uniform sampler2D tex_normal;
uniform float parallax_heightScale = 0.1; uniform float parallax_heightScale = 0.1;
uniform uvec3 ID = uvec3(0);
void main() void main()
{ {
// Сформируем TBN матрицу // Сформируем TBN матрицу
@ -103,4 +106,6 @@ void main()
gAmbientSpecular.rgb = texture(tex_ambient, new_texCoord).rgb * ka; gAmbientSpecular.rgb = texture(tex_ambient, new_texCoord).rgb * ka;
// Сохранение зеркальной составляющей // Сохранение зеркальной составляющей
gAmbientSpecular.a = texture(tex_specular, new_texCoord).r * ks.r; gAmbientSpecular.a = texture(tex_specular, new_texCoord).r * ks.r;
// Сохранение идентификатора объекта
gID = ID;
} }

View File

@ -17,6 +17,7 @@ Texture* pgPosition = NULL;
Texture* pgNormal = NULL; Texture* pgNormal = NULL;
Texture* pgDiffuseP = NULL; Texture* pgDiffuseP = NULL;
Texture* pgAmbientSpecular = NULL; Texture* pgAmbientSpecular = NULL;
Texture* pgID = NULL;
RBO* pgrbo = NULL; RBO* pgrbo = NULL;
Texture* pssaoTexture = NULL; Texture* pssaoTexture = NULL;
Texture* pssaoTexture_raw = 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); pgDiffuseP->reallocate(width, height, 2, GL_RGBA16F);
if (pgAmbientSpecular) if (pgAmbientSpecular)
pgAmbientSpecular->reallocate(width, height, 3); pgAmbientSpecular->reallocate(width, height, 3);
if (pgID)
pgID->reallocate(width, height, 7, GL_RGB32UI, GL_RGB_INTEGER, GL_UNSIGNED_INT);
// И буфера глубины // И буфера глубины
if (pgrbo) if (pgrbo)
pgrbo->reallocate(width, height); pgrbo->reallocate(width, height);
@ -165,13 +168,14 @@ 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 }; GLuint attachments[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3, GL_COLOR_ATTACHMENT4 };
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 gDiffuseP(WINDOW_WIDTH, WINDOW_HEIGHT, GL_COLOR_ATTACHMENT2, 2, GL_RGBA16F); // Диффузная составляющая и коэф. глянцевости
Texture gAmbientSpecular(WINDOW_WIDTH, WINDOW_HEIGHT, GL_COLOR_ATTACHMENT3, 3); // Фоновая составляющая и один канал зеркальной 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); RBO grbo(WINDOW_WIDTH, WINDOW_HEIGHT);
gbuffer.assignRenderBuffer(grbo.getHandler()); gbuffer.assignRenderBuffer(grbo.getHandler());
@ -184,6 +188,7 @@ int main(void)
pgDiffuseP = &gDiffuseP; pgDiffuseP = &gDiffuseP;
pgAmbientSpecular = &gAmbientSpecular; pgAmbientSpecular = &gAmbientSpecular;
pgrbo = &grbo; pgrbo = &grbo;
pgID = &gID;
// Шейдер для расчета освещенности // Шейдер для расчета освещенности
ShaderProgram lightShader; ShaderProgram lightShader;