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

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 kd; // коэф. диффузного отражения (цвет объекта)
alignas(16) glm::vec3 ks; // коэф. зеркального блика alignas(16) glm::vec3 ks; // коэф. зеркального блика
float p; // показатель глянцевости 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_index_range(size_t first_byteOffset, size_t count); // Ограничение диапазона из буфера индексов
void set_texture(Texture& texture); // Привязка текстуры к модели void set_texture(Texture& texture); // Привязка текстуры к модели
Material material; // Материал модели Material material; // Материал модели
private: private:
VAO vao; VAO vao;

View File

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

View File

@ -6,6 +6,7 @@ layout(std140, binding = 1) uniform Material
vec3 kd; vec3 kd;
vec3 ks; vec3 ks;
float p; float p;
bool normalmapped;
}; };
layout (location = 0) out vec3 gPosition; layout (location = 0) out vec3 gPosition;
@ -33,6 +34,14 @@ void main()
gPosition = vertex; gPosition = vertex;
// Сохранение нормали в G-буфере // Сохранение нормали в G-буфере
gNormal = N; 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; 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_tangent(rectangle_tangent, 4);
rectangle.load_bitangent(rectangle_bitangent, 4); rectangle.load_bitangent(rectangle_bitangent, 4);
rectangle.material.normalmapped = true;
// Шейдер для рисования отладочных лампочек // Шейдер для рисования отладочных лампочек
ShaderProgram bulbShader; ShaderProgram bulbShader;
// Загрузка и компиляция шейдеров // Загрузка и компиляция шейдеров