diff --git a/include/Model.h b/include/Model.h index 353f567..7076403 100644 --- a/include/Model.h +++ b/include/Model.h @@ -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; diff --git a/shaders/bulb.frag b/shaders/bulb.frag index 533af2b..e2cda70 100644 --- a/shaders/bulb.frag +++ b/shaders/bulb.frag @@ -6,6 +6,7 @@ layout(std140, binding = 1) uniform Material vec3 kd; vec3 ks; float p; + bool normalmapped; }; in vec3 pos_local; diff --git a/shaders/gshader.frag b/shaders/gshader.frag index 1c82951..fa731c1 100644 --- a/shaders/gshader.frag +++ b/shaders/gshader.frag @@ -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; // Сохранение глянцевости diff --git a/src/main.cpp b/src/main.cpp index 469e27f..42df5ba 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -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; // Загрузка и компиляция шейдеров