Compare commits

...

4 Commits
v0.2 ... master

4 changed files with 58 additions and 4 deletions

View File

@ -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;

View File

@ -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);

23
shaders/ssaoBlur.frag Normal file
View File

@ -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);
}

View File

@ -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);
// Активируем буфер кадра для теней от солнца // Активируем буфер кадра для теней от солнца