Карты нормалей

This commit is contained in:
parent cf993cfe70
commit 704d8a236b
4 changed files with 15 additions and 1 deletions

View File

@ -63,8 +63,9 @@ struct Material
alignas(16) glm::vec3 kd; // коэф. диффузного отражения (цвет объекта)
alignas(16) glm::vec3 ks; // коэф. зеркального блика
float p; // показатель глянцевости
int normalmapped; // Использование карт нормалей
// Значения по умолчанию
Material() : ka(0.2f), kd(0.2f), ks(0.2f), p(1) { };
Material() : ka(0.2f), kd(0.2f), ks(0.2f), p(1), normalmapped(false) { };
};
// Класс модели
@ -88,6 +89,7 @@ class Model : public Node
void set_index_range(size_t first_byteOffset, size_t count); // Ограничение диапазона из буфера индексов
void set_texture(Texture& texture); // Привязка текстуры к модели
Material material; // Материал модели
private:
VAO vao;

View File

@ -6,6 +6,7 @@ layout(std140, binding = 1) uniform Material
vec3 kd;
vec3 ks;
float p;
bool normalmapped;
};
in vec3 pos_local;

View File

@ -6,6 +6,7 @@ layout(std140, binding = 1) uniform Material
vec3 kd;
vec3 ks;
float p;
bool normalmapped;
};
layout (location = 0) out vec3 gPosition;
@ -33,6 +34,14 @@ void main()
gPosition = vertex;
// Сохранение нормали в G-буфере
gNormal = N;
// Если используется карта нормалей
if (normalmapped)
{
// Получим значение из карты нормалей и приведем их к диапазону [-1;1]
gNormal = texture(tex_normal, texCoord).rgb * 2 - 1.0f;
gNormal = normalize(TBN * gNormal); // Из касательного пространства в мировые координаты
}
// Сохранение диффузного цвета
gDiffuseP.rgb = texture(tex_diffuse, texCoord).rgb * kd;
// Сохранение глянцевости

View File

@ -378,6 +378,8 @@ int main(void)
rectangle.load_tangent(rectangle_tangent, 4);
rectangle.load_bitangent(rectangle_bitangent, 4);
rectangle.material.normalmapped = true;
// Шейдер для рисования отладочных лампочек
ShaderProgram bulbShader;
// Загрузка и компиляция шейдеров