diff --git a/include/Model.h b/include/Model.h index bca141d..62c9137 100644 --- a/include/Model.h +++ b/include/Model.h @@ -11,6 +11,16 @@ #define DEFAULT_MTL_DIR "./" class GrouptedModel loadOBJtoGroupted(const char* filename, const char* mtl_directory = DEFAULT_MTL_DIR, const char* texture_directory = DEFAULT_MTL_DIR); +struct Material +{ + alignas(16) glm::vec3 ka; // коэф. фонового отражения (цвет фонового освещения) + alignas(16) glm::vec3 kd; // коэф. диффузного отражения (цвет объекта) + alignas(16) glm::vec3 ks; // коэф. зеркального блика + float p; // показатель глянцевости + // Значения по умолчанию + Material() : ka(0.2f), kd(0.2f), ks(0.2f), p(1) { }; +}; + // Класс определяющий положение, вращение и размер объекта class Movable { @@ -31,7 +41,7 @@ class Model : public Movable Model(); // Конструктор без параметров Model(const Model& copy); // Конструктор копирования ~Model(); - void render(const GLuint &model_uniform, const glm::mat4& global_tranform = glm::mat4(1)); // Вызов отрисовки + void render(const GLuint &model_uniform, UBO &material_buffer, const glm::mat4& global_tranform = glm::mat4(1)); // Вызов отрисовки void load_verteces(glm::vec3* verteces, GLuint count); // Загрузка вершин в буфер void load_indices(GLuint* indices, GLuint count); // Загрузка индексов в буфер void load_texCoords(glm::vec2* texCoords, GLuint count); // Загрузка текстурных координат в буфер @@ -39,6 +49,7 @@ class Model : public Movable void set_texture(Texture& texture); // Привязка текстуры к модели void set_index_range(GLuint beg, GLuint count); // Ограничение диапазона из буфера индексов + Material material; // Материал модели private: VAO vao; BO vertex_vbo, index_vbo; // вершинный и индексный буферы @@ -52,7 +63,7 @@ class Model : public Movable class GrouptedModel: public Movable { public: - void render(const GLuint &model_uniform); // Вызов отрисовки + void render(const GLuint &model_uniform, UBO &material_buffer); // Вызов отрисовки std::vector parts; }; diff --git a/shaders/shader.frag b/shaders/shader.frag index 801807d..ec3724e 100644 --- a/shaders/shader.frag +++ b/shaders/shader.frag @@ -1,7 +1,15 @@ -#version 330 core +#version 420 core in vec2 texCoord; +layout(std140, binding = 1) uniform Material +{ + vec3 ka; + vec3 kd; + vec3 ks; + float p; +}; + uniform sampler2D tex_diffuse; out vec4 color; diff --git a/src/Model.cpp b/src/Model.cpp index 0b3ebef..4070a35 100644 --- a/src/Model.cpp +++ b/src/Model.cpp @@ -18,7 +18,7 @@ Model::Model(const Model& copy) : vao(copy.vao), verteces_count(copy.verteces_count), first_index(copy.first_index), indices_count(copy.indices_count), vertex_vbo(copy.vertex_vbo), index_vbo(copy.index_vbo), normals_vbo(copy.normals_vbo), texCoords_vbo(copy.texCoords_vbo), -texture_diffuse(copy.texture_diffuse) +texture_diffuse(copy.texture_diffuse), material(copy.material) { } @@ -29,7 +29,7 @@ Model::~Model() } // Вызов отрисовки -void Model::render(const GLuint &model_uniform, const glm::mat4& global_tranform) +void Model::render(const GLuint &model_uniform, UBO &material_buffer, const glm::mat4& global_tranform) { // Расчитаем матрицу трансформации glm::mat4 model = global_tranform * this->getTransformMatrix(); @@ -38,6 +38,9 @@ void Model::render(const GLuint &model_uniform, const glm::mat4& global_tranform // Подключаем текстуры texture_diffuse.use(); + // Загружаем данные о материале + material_buffer.load(&material, sizeof(material)); + // Подключаем VAO vao.use(); // Если есть индексы - рисуем с их использованием @@ -298,17 +301,24 @@ GrouptedModel loadOBJtoGroupted(const char* filename, const char* mtl_directory, auto s = --result.parts.end(); s->set_index_range(materials_range[i], materials_range[i+1]-materials_range[i]); + // Текстуры Texture diffuse(TEX_DIFFUSE, texture_directory + materials[materials_ids[i]].diffuse_texname); s->set_texture(diffuse); + + // Материал + s->material.ka = glm::vec3(materials[materials_ids[i]].ambient[0], materials[materials_ids[i]].ambient[1], materials[materials_ids[i]].ambient[2]); + s->material.kd = glm::vec3(materials[materials_ids[i]].diffuse[0], materials[materials_ids[i]].diffuse[1], materials[materials_ids[i]].diffuse[2]); + s->material.ks = glm::vec3(materials[materials_ids[i]].specular[0], materials[materials_ids[i]].specular[1], materials[materials_ids[i]].specular[2]); + s->material.p = (materials[materials_ids[i]].shininess > 0.0f) ? 1000.0f / materials[materials_ids[i]].shininess : 1000.0f; } return result; } // Вызов отрисовки групповой модели -void GrouptedModel::render(const GLuint &model_uniform) +void GrouptedModel::render(const GLuint &model_uniform, UBO &material_buffer) { glm::mat4 transform = this->getTransformMatrix(); for (auto& model : parts) - model.render(model_uniform, transform); + model.render(model_uniform, material_buffer, transform); } diff --git a/src/main.cpp b/src/main.cpp index 257605c..0ba9351 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -97,6 +97,7 @@ int main(void) base.bindTextures(textures_base_shader_names, sizeof(textures_base_shader_names)/sizeof(const char*)); // camera.move({0,0,-20}); + // Загрузка сцены из obj файла GrouptedModel scene = loadOBJtoGroupted("../resources/models/cubes.obj", "../resources/models/", "../resources/textures/"); @@ -108,6 +109,7 @@ int main(void) // Uniform-буферы UBO cameraUB(sizeof(glm::mat4)*2, 0); + UBO material_data(sizeof(Material), 1); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); // Использование уменьшенных версий mipmap @@ -122,7 +124,7 @@ int main(void) cameraUB.loadSub(&camera.getView(), sizeof(glm::mat4), sizeof(glm::mat4)); // Тут производится рендер - scene.render(model_uniform); + scene.render(model_uniform, material_data); // Представление содержимого буфера цепочки показа на окно glfwSwapBuffers(window);