diff --git a/include/Model.h b/include/Model.h index 85c07f5..ff78c40 100644 --- a/include/Model.h +++ b/include/Model.h @@ -56,6 +56,7 @@ class Model : public Movable bool normalmapped; // Использование карт нормалей bool parallaxmapped; // Использование параллакса + bool displacementmapped; // Использование карт высот для сдвига вершин Material material; // Материал модели private: diff --git a/shaders/gshader.vert b/shaders/gshader.vert index ba095eb..8491ee9 100644 --- a/shaders/gshader.vert +++ b/shaders/gshader.vert @@ -15,6 +15,10 @@ layout(std140, binding = 0) uniform Camera uniform mat4 model; +uniform bool displacementmapped; +uniform sampler2D tex_heights; +uniform float displacement_heightScale = 0.1; + out vec3 vertex; // Позиция вершины в пространстве out vec3 N; // Нормаль трансформированноая out vec2 texCoord; // Текстурные координаты @@ -36,5 +40,11 @@ void main() view = camera.position - vertex; + if (displacementmapped) + { + float height = texture(tex_heights, texCoord).r * displacement_heightScale; + P.xyz += mat3(T, B, N) * vec3(0, 0, height); + } + gl_Position = camera.projection * camera.view * P; } \ No newline at end of file diff --git a/src/Model.cpp b/src/Model.cpp index 9e223e0..244a332 100644 --- a/src/Model.cpp +++ b/src/Model.cpp @@ -10,7 +10,7 @@ Movable::Movable(const Movable& copy) : position(copy.position), rotation(copy.r Model::Model() : verteces_count(0), first_index_byteOffset(0), indices_count(0), vertex_vbo(VERTEX), index_vbo(ELEMENT), normals_vbo(VERTEX), texCoords_vbo(VERTEX), tangent_vbo(VERTEX), bitangent_vbo(VERTEX), -normalmapped(false), parallaxmapped(false) +normalmapped(false), parallaxmapped(false), displacementmapped(false) { } @@ -23,7 +23,7 @@ vertex_vbo(copy.vertex_vbo), index_vbo(copy.index_vbo), normals_vbo(copy.normals 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), -normalmapped(copy.normalmapped), parallaxmapped(copy.parallaxmapped) +normalmapped(copy.normalmapped), parallaxmapped(copy.parallaxmapped), displacementmapped(copy.displacementmapped) { } @@ -67,6 +67,7 @@ void Model::render(ShaderProgram &shaderProgram, UBO &material_buffer) // Загрузим параметры рельефного текстурирования glUniform1i(shaderProgram.getUniformLoc("normalmapped"), normalmapped); glUniform1i(shaderProgram.getUniformLoc("parallaxmapped"), parallaxmapped); + glUniform1i(shaderProgram.getUniformLoc("displacementmapped"), displacementmapped); // Загружаем данные о материале material_buffer.load(&material, sizeof(material)); diff --git a/src/main.cpp b/src/main.cpp index 9517c71..7363e35 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -292,66 +292,23 @@ int main(void) ssaoBlurShader.link(); // Модель прямоугольника - Model rectangle; - - // Вершины прямоугольника - glm::vec3 rectangle_verticies[] = { {-0.5f, -0.5f, 0.0f} - , { 0.5f, -0.5f, 0.0f} - , { 0.5f, 0.5f, 0.0f} - , {-0.5f, 0.5f, 0.0f} - }; - // Загрузка вершин модели - rectangle.load_verteces(rectangle_verticies, sizeof(rectangle_verticies)/sizeof(glm::vec3)); - - // индексы вершин - GLuint rectangle_indices[] = {0, 1, 2, 2, 3, 0}; - // Загрузка индексов модели - rectangle.load_indices(rectangle_indices, sizeof(rectangle_indices)/sizeof(GLuint)); - - // Нормали - glm::vec3 rectangle_normals[] = { {0.0f, 0.0f, -1.0f} - , {0.0f, 0.0f, -1.0f} - , {0.0f, 0.0f, -1.0f} - , {0.0f, 0.0f, -1.0f} - }; - // Загрузка нормалей модели - rectangle.load_normals(rectangle_normals, sizeof(rectangle_normals)/sizeof(glm::vec3)); - + GrouptedModel rectangle = loadOBJtoGroupted("../resources/models/plane80000.obj", "../resources/models/", "../resources/textures/"); + // Зададим горизонтальное положение перед камерой rectangle.position.y = -1; rectangle.position.z = 2; rectangle.rotation.x = 90; rectangle.scale = glm::vec3(4); - // Параметры материала - rectangle.material.ka = {0.05, 0.05, 0.05}; - rectangle.material.kd = {1, 1, 1}; - // Текстуры для прямоугольника Texture rectangle_diffuse(TEX_DIFFUSE, "../resources/textures/rekovalev_diffusemap.png"); - rectangle.set_texture(rectangle_diffuse); + rectangle.parts[0].set_texture(rectangle_diffuse); Texture rectangle_normal(TEX_NORMAL, "../resources/textures/rekovalev_normalmap.png"); - rectangle.set_texture(rectangle_normal); + rectangle.parts[0].set_texture(rectangle_normal); Texture rectangle_heights(TEX_HEIGHTS, "../resources/textures/rekovalev_bumpmap.png"); - rectangle.set_texture(rectangle_heights); - - // Текстурные координаты - glm::vec2 rectangle_texCoord[] = { { 1.0f, 0.0f } - , { 1.0f, 1.0f } - , { 0.0f, 1.0f } - , { 0.0f, 0.0f } - }; - rectangle.load_texCoords(rectangle_texCoord, sizeof(rectangle_texCoord)/sizeof(glm::vec2)); - - // Касательные и бикасательные векторы - glm::vec3 rectangle_tangent[4], rectangle_bitangent[4]; - calc_tb(rectangle_indices, 6, rectangle_verticies, rectangle_texCoord, rectangle_tangent, rectangle_bitangent); - rectangle.load_tangent(rectangle_tangent, 4); - rectangle.load_bitangent(rectangle_bitangent, 4); - - rectangle.normalmapped = true; - rectangle.parallaxmapped = true; + rectangle.parts[0].set_texture(rectangle_heights); + rectangle.parts[0].displacementmapped = true; // Вершины для скайбокса glm::vec3 skybox_verticies[] = {