From 721dc90c0c684d058144f16cea1a7d2d35e8062a Mon Sep 17 00:00:00 2001 From: "re.kovalev" Date: Tue, 20 Dec 2022 14:58:07 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A8=D0=B5=D0=B9=D0=B4=D0=B5=D1=80=D1=8B=20?= =?UTF-8?q?=D0=BE=D1=81=D0=B2=D0=B5=D1=89=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shaders/lighting.frag | 51 +++++++++++++++++++++++++++++++++++++++++++ shaders/quad.frag | 12 ---------- src/main.cpp | 21 +++++++++++------- 3 files changed, 64 insertions(+), 20 deletions(-) create mode 100644 shaders/lighting.frag delete mode 100644 shaders/quad.frag diff --git a/shaders/lighting.frag b/shaders/lighting.frag new file mode 100644 index 0000000..79ad7c3 --- /dev/null +++ b/shaders/lighting.frag @@ -0,0 +1,51 @@ +#version 420 core + +in vec2 texCoord; + +layout(std140, binding = 0) uniform Camera +{ + mat4 projection; + mat4 view; + vec3 position; +} camera; + +layout(std140, binding = 2) uniform Light +{ + vec3 position; + vec3 color; +} light_f; + +uniform sampler2D gPosition; +uniform sampler2D gNormal; +uniform sampler2D gDiffuseP; +uniform sampler2D gAmbientSpecular; + +out vec4 color; + +void main() +{ + // Получим данные из текстур буфера + vec3 fragPos = texture(gPosition, texCoord).rgb; + vec3 N = texture(gNormal, texCoord).rgb; + vec3 kd = texture(gDiffuseP, texCoord).rgb; + vec3 ka = texture(gAmbientSpecular, texCoord).rgb; + float ks = texture(gAmbientSpecular, texCoord).a; + float p = texture(gDiffuseP, texCoord).a; + + // Данные о камере относительно фрагмента + vec3 Cam_vertex = normalize(camera.position - fragPos); + // Данные об источнике отностиельно фрагмента + vec3 L_vertex = normalize(light_f.position - fragPos); + + // Диффузная составляющая + float diffuse = max(dot(L_vertex, N), 0.0); // скалярное произведение с отсеканием значений < 0 + + // Вектор половины пути + vec3 H = normalize(L_vertex + Cam_vertex); + // Зеркальная составляющая + float specular = pow(max(dot(H, N), 0.0), p*4); // скалярное произведение с отсеканием значений < 0 в степени p + + color = vec4(ka, 1) + + vec4(light_f.color*kd*diffuse, 1) + + vec4(light_f.color*ks*specular, 1); +} \ No newline at end of file diff --git a/shaders/quad.frag b/shaders/quad.frag deleted file mode 100644 index d466432..0000000 --- a/shaders/quad.frag +++ /dev/null @@ -1,12 +0,0 @@ -#version 420 core - -in vec2 texCoord; - -uniform sampler2D tex; - -out vec4 color; - -void main() -{ - color = texture(tex, texCoord); -} \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index e382709..9ee5f15 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -129,12 +129,14 @@ int main(void) // Активируем базовый буфер кадра FBO::useDefault(); - // Шейдер для переноса текстуры на прямоугольник - ShaderProgram quadProgram; + // Шейдер для расчета освещенности + ShaderProgram lightShader; // Загрузка и компиляция шейдеров - quadProgram.load(GL_VERTEX_SHADER, "shaders/quad.vert"); - quadProgram.load(GL_FRAGMENT_SHADER, "shaders/quad.frag"); - quadProgram.link(); + lightShader.load(GL_VERTEX_SHADER, "shaders/quad.vert"); + lightShader.load(GL_FRAGMENT_SHADER, "shaders/lighting.frag"); + lightShader.link(); + const char* gtextures_shader_names[] = {"gPosition", "gNormal", "gDiffuseP", "gAmbientSpecular"}; + lightShader.bindTextures(gtextures_shader_names, sizeof(gtextures_shader_names)/sizeof(const char*)); glm::vec3 quadVertices[] = { {-1.0f, 1.0f, 0.0f} , {-1.0f, -1.0f, 0.0f} @@ -167,12 +169,15 @@ int main(void) // Активируем базовый буфер кадра FBO::useDefault(); // Подключаем шейдер для прямоугольника - quadProgram.use(); + lightShader.use(); // Очистка буфера цвета и глубины glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - // Подключаем текстуру цветов + // Подключаем текстуры G-буфера + gPosition.use(); + gNormal.use(); gDiffuseP.use(); - // Рендерим прямоугольник + gAmbientSpecular.use(); + // Рендерим прямоугольник с расчетом освещения quadModel.render(); // Представление содержимого буфера цепочки показа на окно