diff --git a/shaders/gshader.frag b/shaders/gshader.frag new file mode 100644 index 0000000..4e35b24 --- /dev/null +++ b/shaders/gshader.frag @@ -0,0 +1,38 @@ +#version 420 core + +layout(std140, binding = 1) uniform Material +{ + vec3 ka; + vec3 kd; + vec3 ks; + float p; +}; + +layout (location = 0) out vec3 gPosition; +layout (location = 1) out vec3 gNormal; +layout (location = 2) out vec4 gDiffuseP; +layout (location = 3) out vec4 gAmbientSpecular; + +in vec3 vertex; // Позиция вершины в пространстве +in vec3 N; // Нормаль трансформированноая +in vec2 texCoord; // Текстурные координаты + +uniform sampler2D tex_diffuse; +uniform sampler2D tex_ambient; +uniform sampler2D tex_specular; + +void main() +{ + // Сохранение позиции фрагмента в G-буфере + gPosition = vertex; + // Сохранение нормали в G-буфере + gNormal = N; + // Сохранение диффузного цвета + gDiffuseP.rgb = texture(tex_diffuse, texCoord).rgb * kd; + // Сохранение глянцевости + gDiffuseP.a = p; + // Сохранение фоновой составляющей + gAmbientSpecular.rgb = texture(tex_ambient, texCoord).rgb * ka; + // Сохранение зеркальной составляющей + gAmbientSpecular.a = texture(tex_specular, texCoord).r * ks.r; +} \ No newline at end of file diff --git a/shaders/shader.vert b/shaders/gshader.vert similarity index 50% rename from shaders/shader.vert rename to shaders/gshader.vert index 4ed4012..0d7ea72 100644 --- a/shaders/shader.vert +++ b/shaders/gshader.vert @@ -11,28 +11,20 @@ layout(std140, binding = 0) uniform Camera vec3 position; } camera; -layout(std140, binding = 2) uniform Light -{ - vec3 position; - vec3 color; -} light_v; - uniform mat4 model; -out vec2 texCoord; - -out vec3 Cam_vertex; // Позиция камеры относительно вершины -out vec3 L_vertex; // Позиция источника света относительно вершины +out vec3 vertex; // Позиция вершины в пространстве out vec3 N; // Нормаль трансформированноая +out vec2 texCoord; // Текстурные координаты void main() { vec4 P = model * vec4(pos, 1.0); // трансформация вершины + vertex = P.xyz; - Cam_vertex = normalize(camera.position - P.xyz); - L_vertex = normalize(light_v.position - P.xyz); - N = normalize(mat3(model) * normals); + N = normalize(mat3(model) * normals); // трансформация нормали + + texCoord = inTexCoord; // Текстурные координаты gl_Position = camera.projection * camera.view * P; - texCoord = inTexCoord; } \ No newline at end of file diff --git a/shaders/shader.frag b/shaders/shader.frag deleted file mode 100644 index b4c468b..0000000 --- a/shaders/shader.frag +++ /dev/null @@ -1,43 +0,0 @@ -#version 420 core - -in vec2 texCoord; - -in vec3 Cam_vertex; // Позиция камеры относительно вершины -in vec3 L_vertex; // Позиция источника света относительно вершины -in vec3 N; // Нормаль - -layout(std140, binding = 1) uniform Material -{ - vec3 ka; - vec3 kd; - vec3 ks; - float p; -}; - -layout(std140, binding = 2) uniform Light -{ - vec3 position; - vec3 color; -} light_f; - -uniform sampler2D tex_diffuse; -uniform sampler2D tex_ambient; -uniform sampler2D tex_specular; - -layout (location = 0) out vec4 colors; -layout (location = 1) out vec4 normals; - -void main() -{ - // Диффузная составляющая - 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 - - colors = vec4(light_f.color*ka, 1)*texture(tex_ambient, texCoord) + vec4(light_f.color*kd*diffuse, 1)*texture(tex_diffuse, texCoord) + vec4(light_f.color*ks*specular, 1)*texture(tex_specular, texCoord); - normals = vec4(N, 1.0); -} - \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index edf6761..4d6eb8d 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -84,15 +84,15 @@ int main(void) // Включаем проверку по буферу глубины glEnable(GL_DEPTH_TEST); - // Базовый шейдер - ShaderProgram base; + // Шейдер для G-буфера + ShaderProgram gShader; // Загрузка и компиляция шейдеров - base.load(GL_VERTEX_SHADER, "shaders/shader.vert"); - base.load(GL_FRAGMENT_SHADER, "shaders/shader.frag"); - base.link(); + gShader.load(GL_VERTEX_SHADER, "shaders/gshader.vert"); + gShader.load(GL_FRAGMENT_SHADER, "shaders/gshader.frag"); + gShader.link(); // Установим значения текстур const char* textures_base_shader_names[] = {"tex_diffuse", "tex_ambient", "tex_specular"}; - base.bindTextures(textures_base_shader_names, sizeof(textures_base_shader_names)/sizeof(const char*)); + gShader.bindTextures(textures_base_shader_names, sizeof(textures_base_shader_names)/sizeof(const char*)); // Загрузка сцены из obj файла @@ -155,12 +155,12 @@ int main(void) // Активируем буфер кадра fbo.use(); // Используем шейдер с освещением - base.use(); + gShader.use(); // Очистка буфера цвета и глубины glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Тут производится рендер - scene.render(base, material_data); + scene.render(gShader, material_data); // Активируем базовый буфер кадра FBO::useDefault();