Compare commits
4 Commits
Author | SHA1 | Date |
---|---|---|
Ковалев Роман Евгеньевич | 754490b7a0 | |
Ковалев Роман Евгеньевич | 51bb5db495 | |
Ковалев Роман Евгеньевич | 0d95b6364d | |
Ковалев Роман Евгеньевич | 48e9973a48 |
|
@ -98,7 +98,7 @@ class Sun
|
||||||
// Данные для SSAO
|
// Данные для SSAO
|
||||||
struct SSAO_data
|
struct SSAO_data
|
||||||
{
|
{
|
||||||
float radius = 0.5f;
|
float radius = 0.05f;
|
||||||
float bias = 0.025f;
|
float bias = 0.025f;
|
||||||
int size = MAX_SSAO;
|
int size = MAX_SSAO;
|
||||||
alignas(16) glm::vec2 scale;
|
alignas(16) glm::vec2 scale;
|
||||||
|
|
|
@ -38,6 +38,7 @@ void main()
|
||||||
float sampleDepth; // Значение глубины образца выборки
|
float sampleDepth; // Значение глубины образца выборки
|
||||||
vec3 samplePos; // Выборка, ориентированная в пространстве вида камеры
|
vec3 samplePos; // Выборка, ориентированная в пространстве вида камеры
|
||||||
vec4 sampleCoord; // Выборка, преобразованная к текстурным координатам
|
vec4 sampleCoord; // Выборка, преобразованная к текстурным координатам
|
||||||
|
float rangeCheck; // Проверка диапазона
|
||||||
|
|
||||||
// Проинициализируем значение счетчика и запустим цикл по выборкам
|
// Проинициализируем значение счетчика и запустим цикл по выборкам
|
||||||
occlusion = 0;
|
occlusion = 0;
|
||||||
|
@ -53,7 +54,8 @@ void main()
|
||||||
// Получаем значение глубины по образцу выборки
|
// Получаем значение глубины по образцу выборки
|
||||||
sampleDepth = (camera.view * vec4(texture(gPosition, sampleCoord.xy).rgb, 1)).z;
|
sampleDepth = (camera.view * vec4(texture(gPosition, sampleCoord.xy).rgb, 1)).z;
|
||||||
|
|
||||||
occlusion += (sampleDepth >= samplePos.z + ssao.bias ? 1.0 : 0.0);
|
rangeCheck = smoothstep(0.0, 1.0, ssao.radius / abs(fragPos.z - sampleDepth));
|
||||||
|
occlusion += (sampleDepth >= samplePos.z + ssao.bias ? 1.0 : 0.0) * rangeCheck;
|
||||||
}
|
}
|
||||||
|
|
||||||
occlusion = 1 - (occlusion / ssao.size);
|
occlusion = 1 - (occlusion / ssao.size);
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
#version 330 core
|
||||||
|
|
||||||
|
in vec2 texCoord;
|
||||||
|
|
||||||
|
out float occlusion;
|
||||||
|
|
||||||
|
uniform sampler2D ssao;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
vec2 texelSize = 1.0 / vec2(textureSize(ssao, 0));
|
||||||
|
vec2 offset;
|
||||||
|
occlusion = 0.0;
|
||||||
|
for (int x = -2; x < 2; x++)
|
||||||
|
{
|
||||||
|
for (int y = -2; y < 2; y++)
|
||||||
|
{
|
||||||
|
offset = vec2(x, y) * texelSize;
|
||||||
|
occlusion += texture(ssao, texCoord + offset).r;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
occlusion = occlusion / (4.0 * 4.0);
|
||||||
|
}
|
33
src/main.cpp
33
src/main.cpp
|
@ -19,6 +19,7 @@ Texture* pgDiffuseP = NULL;
|
||||||
Texture* pgAmbientSpecular = NULL;
|
Texture* pgAmbientSpecular = NULL;
|
||||||
RBO* pgrbo = NULL;
|
RBO* pgrbo = NULL;
|
||||||
Texture* pssaoTexture = NULL;
|
Texture* pssaoTexture = NULL;
|
||||||
|
Texture* pssaoTexture_raw = NULL;
|
||||||
// Размеры окна
|
// Размеры окна
|
||||||
int WINDOW_WIDTH = 800;
|
int WINDOW_WIDTH = 800;
|
||||||
int WINDOW_HEIGHT = 600;
|
int WINDOW_HEIGHT = 600;
|
||||||
|
@ -43,6 +44,8 @@ void framebuffer_size_callback(GLFWwindow* window, int width, int height)
|
||||||
// SSAO
|
// SSAO
|
||||||
if (pssaoTexture)
|
if (pssaoTexture)
|
||||||
pssaoTexture->reallocate(width, height, 6, GL_RED, GL_RED);
|
pssaoTexture->reallocate(width, height, 6, GL_RED, GL_RED);
|
||||||
|
if (pssaoTexture_raw)
|
||||||
|
pssaoTexture_raw->reallocate(width, height, 0, GL_RED, GL_RED);
|
||||||
|
|
||||||
// Запомним новые размеры окна
|
// Запомним новые размеры окна
|
||||||
WINDOW_WIDTH = width;
|
WINDOW_WIDTH = width;
|
||||||
|
@ -252,8 +255,8 @@ int main(void)
|
||||||
GLuint attachments_ssao[] = { GL_COLOR_ATTACHMENT0 };
|
GLuint attachments_ssao[] = { GL_COLOR_ATTACHMENT0 };
|
||||||
FBO ssaoBuffer(attachments_ssao, sizeof(attachments_ssao) / sizeof(GLuint));
|
FBO ssaoBuffer(attachments_ssao, sizeof(attachments_ssao) / sizeof(GLuint));
|
||||||
// Создадим текстуры для буфера кадра
|
// Создадим текстуры для буфера кадра
|
||||||
Texture ssaoTexture(WINDOW_WIDTH, WINDOW_HEIGHT, GL_COLOR_ATTACHMENT0, 6, GL_RED, GL_RED);
|
Texture ssaoTexture_raw(WINDOW_WIDTH, WINDOW_HEIGHT, GL_COLOR_ATTACHMENT0, 0, GL_RED, GL_RED);
|
||||||
pssaoTexture = &ssaoTexture;
|
pssaoTexture_raw = &ssaoTexture_raw;
|
||||||
// Активируем базовый буфер кадра
|
// Активируем базовый буфер кадра
|
||||||
FBO::useDefault();
|
FBO::useDefault();
|
||||||
|
|
||||||
|
@ -300,6 +303,21 @@ int main(void)
|
||||||
const char* ssaoShader_names[] = {"gPosition", "gNormal", "noise"};
|
const char* ssaoShader_names[] = {"gPosition", "gNormal", "noise"};
|
||||||
ssaoShader.bindTextures(ssaoShader_names, sizeof(ssaoShader_names)/sizeof(const char*));
|
ssaoShader.bindTextures(ssaoShader_names, sizeof(ssaoShader_names)/sizeof(const char*));
|
||||||
|
|
||||||
|
// Создадим буфер для размытия SSAO
|
||||||
|
FBO ssaoBlurBuffer(attachments_ssao, sizeof(attachments_ssao) / sizeof(GLuint));
|
||||||
|
// Создадим текстуры для буфера кадра
|
||||||
|
Texture ssaoTexture(WINDOW_WIDTH, WINDOW_HEIGHT, GL_COLOR_ATTACHMENT0, 6, GL_RED, GL_RED);
|
||||||
|
pssaoTexture = &ssaoTexture;
|
||||||
|
// Активируем базовый буфер кадра
|
||||||
|
FBO::useDefault();
|
||||||
|
|
||||||
|
// Шейдер для размытия SSAO
|
||||||
|
ShaderProgram ssaoBlurShader;
|
||||||
|
// Загрузим шейдер
|
||||||
|
ssaoBlurShader.load(GL_VERTEX_SHADER, "shaders/quad.vert");
|
||||||
|
ssaoBlurShader.load(GL_FRAGMENT_SHADER, "shaders/ssaoBlur.frag");
|
||||||
|
ssaoBlurShader.link();
|
||||||
|
|
||||||
// Модель прямоугольника
|
// Модель прямоугольника
|
||||||
Model rectangle;
|
Model rectangle;
|
||||||
|
|
||||||
|
@ -443,6 +461,17 @@ int main(void)
|
||||||
// Рендерим прямоугольник
|
// Рендерим прямоугольник
|
||||||
quadModel.render();
|
quadModel.render();
|
||||||
|
|
||||||
|
// Активируем буфер размытия SSAO
|
||||||
|
ssaoBlurBuffer.use();
|
||||||
|
// Используем шейдер для размытия SSAO
|
||||||
|
ssaoBlurShader.use();
|
||||||
|
// Очистка буфера цвета
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
// Подключаем текстуру сырого SSAO
|
||||||
|
ssaoTexture_raw.use();
|
||||||
|
// Рендерим прямоугольник
|
||||||
|
quadModel.render();
|
||||||
|
|
||||||
// Изменим размер вывода для тени
|
// Изменим размер вывода для тени
|
||||||
glViewport(0, 0, sunShadow_resolution, sunShadow_resolution);
|
glViewport(0, 0, sunShadow_resolution, sunShadow_resolution);
|
||||||
// Активируем буфер кадра для теней от солнца
|
// Активируем буфер кадра для теней от солнца
|
||||||
|
|
Loading…
Reference in New Issue