Запись ID объекта в текстуру
This commit is contained in:
parent
5f9e1f3003
commit
9bcd8c06c5
|
@ -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;
|
||||||
}
|
}
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue