diff --git a/include/Model.h b/include/Model.h index b8d0a2b..2c8acb8 100644 --- a/include/Model.h +++ b/include/Model.h @@ -54,6 +54,7 @@ class Model : public Movable void set_texture(Texture& texture); // Привязка текстуры к модели void set_index_range(GLuint beg, GLuint count); // Ограничение диапазона из буфера индексов + bool normalmapped; // Использование карт нормалей Material material; // Материал модели private: VAO vao; diff --git a/shaders/gshader.frag b/shaders/gshader.frag index 1c82951..ca94afc 100644 --- a/shaders/gshader.frag +++ b/shaders/gshader.frag @@ -25,6 +25,8 @@ uniform sampler2D tex_specular; uniform sampler2D tex_heights; uniform sampler2D tex_normal; +uniform bool normalmapped; + void main() { // Сформируем TBN матрицу @@ -33,6 +35,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/Model.cpp b/src/Model.cpp index 3f5c0ab..88e157a 100644 --- a/src/Model.cpp +++ b/src/Model.cpp @@ -9,7 +9,8 @@ Movable::Movable(const Movable& copy) : position(copy.position), rotation(copy.r // Конструктор без параметров Model::Model() : verteces_count(0), first_index(0), indices_count(0), vertex_vbo(VERTEX), index_vbo(ELEMENT), normals_vbo(VERTEX), texCoords_vbo(VERTEX), -tangent_vbo(VERTEX), bitangent_vbo(VERTEX) +tangent_vbo(VERTEX), bitangent_vbo(VERTEX), +normalmapped(false) { } @@ -21,7 +22,8 @@ verteces_count(copy.verteces_count), first_index(copy.first_index), indices_coun vertex_vbo(copy.vertex_vbo), index_vbo(copy.index_vbo), normals_vbo(copy.normals_vbo), texCoords_vbo(copy.texCoords_vbo), tangent_vbo(copy.tangent_vbo), bitangent_vbo(copy.bitangent_vbo), texture_diffuse(copy.texture_diffuse), texture_ambient(copy.texture_ambient), texture_specular(copy.texture_specular), -texture_heights(copy.texture_heights), texture_normals(copy.texture_normals), material(copy.material) +texture_heights(copy.texture_heights), texture_normals(copy.texture_normals), material(copy.material), +normalmapped(copy.normalmapped) { } @@ -62,6 +64,9 @@ void Model::render(ShaderProgram &shaderProgram, UBO &material_buffer) texture_heights.use(); texture_normals.use(); + // Загрузим параметры рельефного текстурирования + glUniform1i(shaderProgram.getUniformLoc("normalmapped"), normalmapped); + // Загружаем данные о материале material_buffer.load(&material, sizeof(material)); @@ -306,23 +311,19 @@ void calc_tb(const GLuint* indices, const int indices_count, const glm::vec3* ve tmp.x = (dTex2.y * dPos1.x - dTex1.y * dPos2.x) / f; tmp.y = (dTex2.y * dPos1.y - dTex1.y * dPos2.y) / f; tmp.z = (dTex2.y * dPos1.z - dTex1.y * dPos2.z) / f; - // Нормируем значение - tmp = glm::normalize(tmp); // Добавим вектор в контейнер - tangent[indices[i ]] = tmp; // Для каждого индекса полигона - tangent[indices[i+1]] = tmp; // значение вектора - tangent[indices[i+2]] = tmp; // одинаковое + tangent[indices[i ]] += tmp; // Для каждого индекса полигона + tangent[indices[i+1]] += tmp; // значение вектора + tangent[indices[i+2]] += tmp; // одинаковое // Покомпонентное вычисление бикасательного вектора tmp.x = (-dTex2.x * dPos1.x + dTex1.x * dPos2.x) / f; tmp.y = (-dTex2.x * dPos1.y + dTex1.x * dPos2.y) / f; tmp.z = (-dTex2.x * dPos1.z + dTex1.x * dPos2.z) / f; - // Нормируем значение - tmp = glm::normalize(tmp); // Добавим вектор в контейнер - bitangent[indices[i ]] = tmp; // Для каждого индекса полигона - bitangent[indices[i+1]] = tmp; // значение вектора - bitangent[indices[i+2]] = tmp; // одинаковое + bitangent[indices[i ]] += tmp; // Для каждого индекса полигона + bitangent[indices[i+1]] += tmp; // значение вектора + bitangent[indices[i+2]] += tmp; // одинаковое } } diff --git a/src/main.cpp b/src/main.cpp index d789799..38dd3a8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -349,6 +349,7 @@ int main(void) rectangle.load_tangent(rectangle_tangent, 4); rectangle.load_bitangent(rectangle_bitangent, 4); + rectangle.normalmapped = true; // Вершины для скайбокса