Загрузка материала
This commit is contained in:
		
							parent
							
								
									969862ca56
								
							
						
					
					
						commit
						44c6c024b3
					
				| @ -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<Model> parts; | ||||
| }; | ||||
| 
 | ||||
|  | ||||
| @ -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;  | ||||
|  | ||||
| @ -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); | ||||
| } | ||||
|  | ||||
| @ -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); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user