diff --git a/include/Model.h b/include/Model.h index 6cb5da1..d5ea083 100644 --- a/include/Model.h +++ b/include/Model.h @@ -65,8 +65,9 @@ struct Material float p; // показатель глянцевости int normalmapped; // Использование карт нормалей int parallaxmapped; // Использование параллакса + int displacementmapped; // Использование карт высот для сдвига вершин // Значения по умолчанию - Material() : ka(0.2f), kd(0.2f), ks(0.2f), p(1), normalmapped(false), parallaxmapped(false) { }; + Material() : ka(0.2f), kd(0.2f), ks(0.2f), p(1), normalmapped(false), parallaxmapped(false), displacementmapped(false) { }; }; // Класс модели diff --git a/shaders/bulb.frag b/shaders/bulb.frag index 7fbb51d..de2d7f3 100644 --- a/shaders/bulb.frag +++ b/shaders/bulb.frag @@ -8,6 +8,7 @@ layout(std140, binding = 1) uniform Material float p; bool normalmapped; bool parallaxmapped; + bool displacementmapped; }; in vec3 pos_local; diff --git a/shaders/gshader.frag b/shaders/gshader.frag index 5dfb36d..e080f30 100644 --- a/shaders/gshader.frag +++ b/shaders/gshader.frag @@ -8,6 +8,7 @@ layout(std140, binding = 1) uniform Material float p; bool normalmapped; bool parallaxmapped; + bool displacementmapped; }; layout (location = 0) out vec3 gPosition; diff --git a/shaders/gshader.vert b/shaders/gshader.vert index ba095eb..b0b919f 100644 --- a/shaders/gshader.vert +++ b/shaders/gshader.vert @@ -13,6 +13,20 @@ layout(std140, binding = 0) uniform Camera vec3 position; } camera; +layout(std140, binding = 1) uniform Material +{ + vec3 ka; + vec3 kd; + vec3 ks; + float p; + bool normalmapped; + bool parallaxmapped; + bool displacementmapped; +}; + +uniform sampler2D tex_heights; +uniform float displacement_heightScale = 0.1; + uniform mat4 model; out vec3 vertex; // Позиция вершины в пространстве @@ -36,5 +50,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/main.cpp b/src/main.cpp index 2c87bf9..92e839e 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -322,64 +322,23 @@ int main(void) ssaoBlurShader.link(); // Модель прямоугольника - Model rectangle; - - // Вершины прямоугольника - glm::vec3 rectangle_verticies[] = { {-0.5f, 0.0f, -0.5f} - , { 0.5f, 0.0f, -0.5f} - , { 0.5f, 0.0f, 0.5f} - , {-0.5f, 0.0f, 0.5f} - }; - // Загрузка вершин модели - 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, 1.0f, 0.0f} - , {0.0f, 1.0f, 0.0f} - , {0.0f, 1.0f, 0.0f} - , {0.0f, 1.0f, 0.0f} - }; - // Загрузка нормалей модели - rectangle.load_normals(rectangle_normals, sizeof(rectangle_normals)/sizeof(glm::vec3)); - + Scene rectangle = loadOBJtoScene("../resources/models/plane80000.obj", "../resources/models/", "../resources/textures/"); + // Зададим горизонтальное положение перед камерой - rectangle.e_position().y = -1; - rectangle.e_position().z = 2; - rectangle.e_scale() = glm::vec3(4); - - // Параметры материала - rectangle.material.ka = {0.05, 0.05, 0.05}; - rectangle.material.kd = {1, 1, 1}; + rectangle.root.e_position().y = -1; + rectangle.root.e_position().z = 2; + rectangle.root.e_rotation() = glm::quat(0.707f, 0.707f, 0.0f, 0.0f); + rectangle.root.e_scale() = glm::vec3(4); // Текстуры для прямоугольника Texture rectangle_diffuse(TEX_DIFFUSE, "../resources/textures/rekovalev_diffusemap.png"); - rectangle.set_texture(rectangle_diffuse); + rectangle.models.begin()->set_texture(rectangle_diffuse); Texture rectangle_normal(TEX_NORMAL, "../resources/textures/rekovalev_normalmap.png"); - rectangle.set_texture(rectangle_normal); + rectangle.models.begin()->set_texture(rectangle_normal); Texture rectangle_heights(TEX_HEIGHTS, "../resources/textures/rekovalev_bumpmap.png"); - rectangle.set_texture(rectangle_heights); + rectangle.models.begin()->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.material.normalmapped = true; - rectangle.material.parallaxmapped = true; + rectangle.models.begin()->material.displacementmapped = true; // Шейдер для рисования отладочных лампочек ShaderProgram bulbShader;