Шейдеры для G-буфера

This commit is contained in:
parent a36b2e7030
commit 553830964d
4 changed files with 52 additions and 65 deletions

38
shaders/gshader.frag Normal file
View File

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

View File

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

View File

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

View File

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