Правка материалов для PBR
This commit is contained in:
		
							parent
							
								
									e1287a4ef1
								
							
						
					
					
						commit
						212ea48d4e
					
				| @ -59,15 +59,16 @@ class Node | |||||||
| // Материал модели
 | // Материал модели
 | ||||||
| struct Material | struct Material | ||||||
| { | { | ||||||
|     alignas(16) glm::vec3 ka; // коэф. фонового отражения (цвет фонового освещения)
 |     alignas(16) glm::vec3 base_color; // Базовый цвет материала
 | ||||||
|     alignas(16) glm::vec3 kd; // коэф. диффузного отражения (цвет объекта)
 |     float roughness; // Шероховатость поверхности
 | ||||||
|     alignas(16) glm::vec3 ks; // коэф. зеркального блика
 |     float metallic; // Металличность поверхности
 | ||||||
|     float p; // показатель глянцевости
 |     float specular; // Интенсивность блика диэлектриков
 | ||||||
|  |     alignas(16) glm::vec3 emitted; // Излучаемый поверхностью свет
 | ||||||
|     int normalmapped; // Использование карт нормалей
 |     int normalmapped; // Использование карт нормалей
 | ||||||
|     int parallaxmapped; // Использование параллакса
 |     int parallaxmapped; // Использование параллакса
 | ||||||
|     int displacementmapped; // Использование карт высот для сдвига вершин
 |     int displacementmapped; // Использование карт высот для сдвига вершин
 | ||||||
|     // Значения по умолчанию
 |     // Значения по умолчанию
 | ||||||
|     Material() : ka(0.2f), kd(0.2f), ks(0.2f), p(1), normalmapped(false), parallaxmapped(false), displacementmapped(false) { }; |     Material() : base_color(0.8f), roughness(0.5f), metallic(0.0f), specular(0.5f), emitted(0.0f), normalmapped(false), parallaxmapped(false), displacementmapped(false) { }; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| // Идентификатор модели
 | // Идентификатор модели
 | ||||||
| @ -108,9 +109,11 @@ class Model : public Node | |||||||
|         BO tangent_vbo, bitangent_vbo; // буферы с касательными и бикасательными векторами
 |         BO tangent_vbo, bitangent_vbo; // буферы с касательными и бикасательными векторами
 | ||||||
|         GLuint verteces_count; // Количество вершин
 |         GLuint verteces_count; // Количество вершин
 | ||||||
|         size_t first_index_byteOffset, indices_count; // Сдвиг в байтах для первого и количество индексов
 |         size_t first_index_byteOffset, indices_count; // Сдвиг в байтах для первого и количество индексов
 | ||||||
|         Texture texture_diffuse; // Диффузная текстура
 |         Texture texture_albedo; // Текстура альбедо (цвет поверхности)
 | ||||||
|         Texture texture_ambient; // Текстура фонового освщения
 |         Texture texture_roughness; // Текстура шероховатостей
 | ||||||
|         Texture texture_specular; // Текстура зеркального отражения
 |         Texture texture_metallic; // Текстура металличности
 | ||||||
|  |         Texture texture_specular; // Текстура интенсивности блика диэлектриков
 | ||||||
|  |         Texture texture_emitted; // Текстура излучаемого света
 | ||||||
|         Texture texture_heights; // Текстура высот
 |         Texture texture_heights; // Текстура высот
 | ||||||
|         Texture texture_normals; // Текстура нормалей
 |         Texture texture_normals; // Текстура нормалей
 | ||||||
| }; | }; | ||||||
|  | |||||||
| @ -7,9 +7,11 @@ | |||||||
| #include <string> | #include <string> | ||||||
| 
 | 
 | ||||||
| enum TexType { | enum TexType { | ||||||
|     TEX_DIFFUSE, |     TEX_ALBEDO, | ||||||
|     TEX_AMBIENT, |     TEX_ROUGHNESS, | ||||||
|  |     TEX_METALLIC, | ||||||
|     TEX_SPECULAR, |     TEX_SPECULAR, | ||||||
|  |     TEX_EMITTED, | ||||||
|     TEX_HEIGHTS, |     TEX_HEIGHTS, | ||||||
|     TEX_NORMAL, |     TEX_NORMAL, | ||||||
|     TEX_AVAILABLE_COUNT |     TEX_AVAILABLE_COUNT | ||||||
| @ -36,8 +38,8 @@ class Texture : public BaseTexture | |||||||
| { | { | ||||||
|     public: |     public: | ||||||
|         Texture(GLuint type = TEX_AVAILABLE_COUNT, const std::string& filename = ""); // Загрузка текстуры с диска или использование "пустой"
 |         Texture(GLuint type = TEX_AVAILABLE_COUNT, const std::string& filename = ""); // Загрузка текстуры с диска или использование "пустой"
 | ||||||
|         Texture(GLuint width, GLuint height, GLuint attachment, GLuint texType = TEX_DIFFUSE, GLint internalformat = GL_RGBA, GLint format = GL_RGBA, GLenum dataType = GL_FLOAT); // Конструктор текстуры заданного размера для использования в буфере
 |         Texture(GLuint width, GLuint height, GLuint attachment, GLuint texType = TEX_ALBEDO, GLint internalformat = GL_RGBA, GLint format = GL_RGBA, GLenum dataType = GL_FLOAT); // Конструктор текстуры заданного размера для использования в буфере
 | ||||||
|         Texture(GLuint width, GLuint height, void* data, GLuint texType = TEX_DIFFUSE, GLint internalformat = GL_RGBA, GLint format = GL_RGBA, GLenum dataType = GL_FLOAT); // Конструктор текстуры заданного размера без привязки к буферу с загрузкой пикселей по указателю
 |         Texture(GLuint width, GLuint height, void* data, GLuint texType = TEX_ALBEDO, GLint internalformat = GL_RGBA, GLint format = GL_RGBA, GLenum dataType = GL_FLOAT); // Конструктор текстуры заданного размера без привязки к буферу с загрузкой пикселей по указателю
 | ||||||
|         Texture(const Texture& other); // Конструктор копирования
 |         Texture(const Texture& other); // Конструктор копирования
 | ||||||
| 
 | 
 | ||||||
|         Texture& operator=(const Texture& other); // Оператор присваивания
 |         Texture& operator=(const Texture& other); // Оператор присваивания
 | ||||||
| @ -49,7 +51,7 @@ class Texture : public BaseTexture | |||||||
| class TextureArray : public BaseTexture | class TextureArray : public BaseTexture | ||||||
| { | { | ||||||
|     public: |     public: | ||||||
|         TextureArray(GLuint levels, GLuint width, GLuint height, GLuint attachment, GLuint texType = TEX_DIFFUSE, GLint internalformat = GL_RGBA, GLint format = GL_RGBA, GLenum dataType = GL_FLOAT); // Конструктор текстуры заданного размера для использования в буфере
 |         TextureArray(GLuint levels, GLuint width, GLuint height, GLuint attachment, GLuint texType = TEX_ALBEDO, GLint internalformat = GL_RGBA, GLint format = GL_RGBA, GLenum dataType = GL_FLOAT); // Конструктор текстуры заданного размера для использования в буфере
 | ||||||
|         TextureArray(const TextureArray& other); // Конструктор копирования
 |         TextureArray(const TextureArray& other); // Конструктор копирования
 | ||||||
| 
 | 
 | ||||||
|         TextureArray& operator=(const TextureArray& other); // Оператор присваивания
 |         TextureArray& operator=(const TextureArray& other); // Оператор присваивания
 | ||||||
| @ -62,7 +64,7 @@ class TextureCube : public BaseTexture | |||||||
| { | { | ||||||
|     public: |     public: | ||||||
|         TextureCube(GLuint type = TEX_AVAILABLE_COUNT, const std::string (&filename)[6] = {""}); // Загрузка текстуры с диска или использование "пустой"
 |         TextureCube(GLuint type = TEX_AVAILABLE_COUNT, const std::string (&filename)[6] = {""}); // Загрузка текстуры с диска или использование "пустой"
 | ||||||
|         TextureCube(GLuint width, GLuint height, GLuint attachment, GLuint texType = TEX_DIFFUSE, GLint internalformat = GL_RGBA, GLint format = GL_RGBA, GLenum dataType = GL_FLOAT); // Конструктор текстуры заданного размера для использования в буфере
 |         TextureCube(GLuint width, GLuint height, GLuint attachment, GLuint texType = TEX_ALBEDO, GLint internalformat = GL_RGBA, GLint format = GL_RGBA, GLenum dataType = GL_FLOAT); // Конструктор текстуры заданного размера для использования в буфере
 | ||||||
|         TextureCube(const TextureCube& other); // Конструктор копирования
 |         TextureCube(const TextureCube& other); // Конструктор копирования
 | ||||||
| 
 | 
 | ||||||
|         TextureCube& operator=(const TextureCube& other); // Оператор присваивания
 |         TextureCube& operator=(const TextureCube& other); // Оператор присваивания
 | ||||||
| @ -74,7 +76,7 @@ class TextureCube : public BaseTexture | |||||||
| class TextureCubeArray : public BaseTexture | class TextureCubeArray : public BaseTexture | ||||||
| { | { | ||||||
|     public: |     public: | ||||||
|         TextureCubeArray(GLuint levels, GLuint width, GLuint height, GLuint attachment, GLuint texType = TEX_DIFFUSE, GLint internalformat = GL_RGBA, GLint format = GL_RGBA, GLenum dataType = GL_FLOAT); // Конструктор текстуры заданного размера для использования в буфере
 |         TextureCubeArray(GLuint levels, GLuint width, GLuint height, GLuint attachment, GLuint texType = TEX_ALBEDO, GLint internalformat = GL_RGBA, GLint format = GL_RGBA, GLenum dataType = GL_FLOAT); // Конструктор текстуры заданного размера для использования в буфере
 | ||||||
|         TextureCubeArray(const TextureCubeArray& other); // Конструктор копирования
 |         TextureCubeArray(const TextureCubeArray& other); // Конструктор копирования
 | ||||||
| 
 | 
 | ||||||
|         TextureCubeArray& operator=(const TextureCubeArray& other); // Оператор присваивания
 |         TextureCubeArray& operator=(const TextureCubeArray& other); // Оператор присваивания
 | ||||||
|  | |||||||
| @ -218,7 +218,7 @@ void Light::render(ShaderProgram &shaderProgram, UBO &material_buffer) | |||||||
|         bulb.root.e_position() = data[i].position; |         bulb.root.e_position() = data[i].position; | ||||||
|         sphere.e_scale() = glm::vec3(data[i].attenuation.r); // Масштабирование сферы
 |         sphere.e_scale() = glm::vec3(data[i].attenuation.r); // Масштабирование сферы
 | ||||||
|         // Задание цвета
 |         // Задание цвета
 | ||||||
|         bulb.models.begin()->material.ka = sphere.material.ka = data[i].color; |         bulb.models.begin()->material.base_color = sphere.material.base_color = data[i].color; | ||||||
| 
 | 
 | ||||||
|         // Вызов отрисовки
 |         // Вызов отрисовки
 | ||||||
|         bulb.render(shaderProgram, material_buffer);     |         bulb.render(shaderProgram, material_buffer);     | ||||||
|  | |||||||
| @ -216,7 +216,7 @@ vao(copy.vao), | |||||||
| verteces_count(copy.verteces_count), first_index_byteOffset(copy.first_index_byteOffset), indices_count(copy.indices_count),  | verteces_count(copy.verteces_count), first_index_byteOffset(copy.first_index_byteOffset), 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), | 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), | 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_albedo(copy.texture_albedo), texture_roughness(copy.texture_roughness), texture_metallic(copy.texture_metallic), texture_specular(copy.texture_specular), texture_emitted(copy.texture_emitted), | ||||||
| texture_heights(copy.texture_heights), texture_normals(copy.texture_normals), | texture_heights(copy.texture_heights), texture_normals(copy.texture_normals), | ||||||
| material(copy.material) | material(copy.material) | ||||||
| { | { | ||||||
| @ -242,10 +242,12 @@ Model& Model::operator=(const Model& other) | |||||||
|     tangent_vbo = other.tangent_vbo; |     tangent_vbo = other.tangent_vbo; | ||||||
|     bitangent_vbo = other.bitangent_vbo; |     bitangent_vbo = other.bitangent_vbo; | ||||||
|      |      | ||||||
|     texture_diffuse = other.texture_diffuse; |     texture_albedo = other.texture_albedo;  | ||||||
|     texture_ambient = other.texture_ambient; |     texture_roughness = other.texture_roughness;  | ||||||
|     texture_specular = other.texture_specular; |     texture_metallic = other.texture_metallic;  | ||||||
|      |     texture_specular = other.texture_specular;  | ||||||
|  |     texture_emitted = other.texture_emitted; | ||||||
|  | 
 | ||||||
|     texture_heights = other.texture_heights; |     texture_heights = other.texture_heights; | ||||||
|     texture_normals = other.texture_normals; |     texture_normals = other.texture_normals; | ||||||
|      |      | ||||||
| @ -285,9 +287,11 @@ void Model::render(ShaderProgram &shaderProgram, UBO &material_buffer) | |||||||
|     glUniformMatrix4fv(shaderProgram.getUniformLoc("model"), 1, GL_FALSE, &this->getTransformMatrix()[0][0]); |     glUniformMatrix4fv(shaderProgram.getUniformLoc("model"), 1, GL_FALSE, &this->getTransformMatrix()[0][0]); | ||||||
| 
 | 
 | ||||||
|     // Подключаем текстуры
 |     // Подключаем текстуры
 | ||||||
|     texture_diffuse.use(); |     texture_albedo.use(); | ||||||
|     texture_ambient.use(); |     texture_roughness.use(); | ||||||
|  |     texture_metallic.use(); | ||||||
|     texture_specular.use(); |     texture_specular.use(); | ||||||
|  |     texture_emitted.use(); | ||||||
|     texture_heights.use(); |     texture_heights.use(); | ||||||
|     texture_normals.use();     |     texture_normals.use();     | ||||||
| 
 | 
 | ||||||
| @ -408,14 +412,25 @@ void Model::set_texture(Texture& texture) | |||||||
|     GLuint type = texture.getType(); |     GLuint type = texture.getType(); | ||||||
|     switch(type) |     switch(type) | ||||||
|     { |     { | ||||||
|         case TEX_DIFFUSE: |         case TEX_ALBEDO: | ||||||
|             texture_diffuse = texture; |             texture_albedo = texture; | ||||||
|  |             material.base_color.r = -1; | ||||||
|             break; |             break; | ||||||
|         case TEX_AMBIENT: |         case TEX_ROUGHNESS: | ||||||
|             texture_ambient = texture; |             texture_roughness = texture; | ||||||
|  |             material.roughness = -1; | ||||||
|  |             break; | ||||||
|  |         case TEX_METALLIC: | ||||||
|  |             texture_metallic = texture; | ||||||
|  |             material.metallic = -1; | ||||||
|             break; |             break; | ||||||
|         case TEX_SPECULAR: |         case TEX_SPECULAR: | ||||||
|             texture_specular = texture; |             texture_specular = texture; | ||||||
|  |             material.specular = -1; | ||||||
|  |             break; | ||||||
|  |         case TEX_EMITTED: | ||||||
|  |             texture_emitted = texture; | ||||||
|  |             material.emitted.r = -1; | ||||||
|             break; |             break; | ||||||
|         case TEX_HEIGHTS: |         case TEX_HEIGHTS: | ||||||
|             texture_heights = texture; |             texture_heights = texture; | ||||||
|  | |||||||
| @ -215,23 +215,39 @@ Scene loadOBJtoScene(const char* filename, const char* mtl_directory, const char | |||||||
|         auto s = --result.models.end(); |         auto s = --result.models.end(); | ||||||
|         s->set_index_range(materials_range[i]*sizeof(GLuint), materials_range[i+1]-materials_range[i]); |         s->set_index_range(materials_range[i]*sizeof(GLuint), materials_range[i+1]-materials_range[i]); | ||||||
| 
 | 
 | ||||||
|         // Текстуры
 |  | ||||||
|         Texture diffuse(TEX_DIFFUSE, texture_directory + materials[materials_ids[i]].diffuse_texname); |  | ||||||
|         s->set_texture(diffuse); |  | ||||||
|         Texture ambient(TEX_AMBIENT, texture_directory + materials[materials_ids[i]].ambient_texname); |  | ||||||
|         s->set_texture(ambient); |  | ||||||
|         Texture specular(TEX_SPECULAR, texture_directory + materials[materials_ids[i]].specular_texname); |  | ||||||
|         s->set_texture(specular); |  | ||||||
|         Texture normal(TEX_NORMAL, texture_directory + materials[materials_ids[i]].normal_texname); |  | ||||||
|         s->set_texture(normal); |  | ||||||
|         Texture heights(TEX_HEIGHTS, texture_directory + materials[materials_ids[i]].bump_texname); |  | ||||||
|         s->set_texture(heights); |  | ||||||
| 
 |  | ||||||
|         // Материал
 |         // Материал
 | ||||||
|         s->material.ka = pow(glm::vec3(materials[materials_ids[i]].ambient[0],  materials[materials_ids[i]].ambient[1],  materials[materials_ids[i]].ambient[2]), glm::vec3(1/inv_gamma)); |         s->material.base_color = pow(glm::vec3(materials[materials_ids[i]].diffuse[0],  materials[materials_ids[i]].diffuse[1],  materials[materials_ids[i]].diffuse[2]), glm::vec3(1/inv_gamma)); | ||||||
|         s->material.kd = pow(glm::vec3(materials[materials_ids[i]].diffuse[0],  materials[materials_ids[i]].diffuse[1],  materials[materials_ids[i]].diffuse[2]), glm::vec3(1/inv_gamma)); |         s->material.roughness = 1 - sqrt(materials[materials_ids[i]].shininess/1000); // шероховатость поверхности
 | ||||||
|         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.metallic = (materials[materials_ids[i]].ambient[0] + materials[materials_ids[i]].ambient[1] + materials[materials_ids[i]].ambient[2]) / 3.0f;  | ||||||
|         s->material.p  = (materials[materials_ids[i]].shininess > 0.0f) ? 1000.0f / materials[materials_ids[i]].shininess : 1000.0f; |         s->material.specular = (materials[materials_ids[i]].specular[0] + materials[materials_ids[i]].specular[1] + materials[materials_ids[i]].specular[2]) / 3.0f; | ||||||
|  |         s->material.emitted = pow(glm::vec3(materials[materials_ids[i]].emission[0],  materials[materials_ids[i]].emission[1],  materials[materials_ids[i]].emission[2]), glm::vec3(1/inv_gamma)); | ||||||
|  | 
 | ||||||
|  |         // Текстуры
 | ||||||
|  |         if (!materials[materials_ids[i]].diffuse_texname.empty()) | ||||||
|  |         { | ||||||
|  |             Texture diffuse(TEX_ALBEDO, texture_directory + materials[materials_ids[i]].diffuse_texname); | ||||||
|  |             s->set_texture(diffuse); | ||||||
|  |         } | ||||||
|  |         if (!materials[materials_ids[i]].ambient_texname.empty()) | ||||||
|  |         { | ||||||
|  |             Texture ambient(TEX_METALLIC, texture_directory + materials[materials_ids[i]].ambient_texname); | ||||||
|  |             s->set_texture(ambient); | ||||||
|  |         } | ||||||
|  |         if (!materials[materials_ids[i]].specular_texname.empty()) | ||||||
|  |         { | ||||||
|  |             Texture specular(TEX_SPECULAR, texture_directory + materials[materials_ids[i]].specular_texname); | ||||||
|  |             s->set_texture(specular); | ||||||
|  |         } | ||||||
|  |         if (!materials[materials_ids[i]].normal_texname.empty()) | ||||||
|  |         { | ||||||
|  |             Texture normal(TEX_NORMAL, texture_directory + materials[materials_ids[i]].normal_texname); | ||||||
|  |             s->set_texture(normal); | ||||||
|  |         } | ||||||
|  |         if (!materials[materials_ids[i]].bump_texname.empty()) | ||||||
|  |         { | ||||||
|  |             Texture heights(TEX_HEIGHTS, texture_directory + materials[materials_ids[i]].bump_texname); | ||||||
|  |             s->set_texture(heights); | ||||||
|  |         } | ||||||
|     }     |     }     | ||||||
| 
 | 
 | ||||||
|     return result; |     return result; | ||||||
|  | |||||||
| @ -115,9 +115,7 @@ int main(void) | |||||||
|     Scene scene = loadOBJtoScene("../resources/models/blob.obj", "../resources/models/", "../resources/textures/");  |     Scene scene = loadOBJtoScene("../resources/models/blob.obj", "../resources/models/", "../resources/textures/");  | ||||||
|     scene.root.e_scale() = glm::vec3(0.01); |     scene.root.e_scale() = glm::vec3(0.01); | ||||||
|     scene.root.e_position().z = 1; |     scene.root.e_position().z = 1; | ||||||
|     scene.models.begin()->material.kd = {0.5,0.5,0.5}; |     scene.set_group_id((GLuint64) &scene.root); | ||||||
|     scene.models.begin()->material.ka = {0.05,0.05,0.05}; |  | ||||||
|     scene.set_group_id((GLuint64) &scene); |  | ||||||
|      |      | ||||||
|     // Установка цвета очистки буфера цвета
 |     // Установка цвета очистки буфера цвета
 | ||||||
|     glClearColor(0.0f, 0.0f, 0.0f, 1.0f); |     glClearColor(0.0f, 0.0f, 0.0f, 1.0f); | ||||||
| @ -302,7 +300,7 @@ int main(void) | |||||||
|     rectangle.root.e_scale() = glm::vec3(4); |     rectangle.root.e_scale() = glm::vec3(4); | ||||||
| 
 | 
 | ||||||
|     // Текстуры для прямоугольника
 |     // Текстуры для прямоугольника
 | ||||||
|     Texture rectangle_diffuse(TEX_DIFFUSE, "../resources/textures/rekovalev_diffusemap.png"); |     Texture rectangle_diffuse(TEX_ALBEDO, "../resources/textures/rekovalev_diffusemap.png"); | ||||||
|     rectangle.models.begin()->set_texture(rectangle_diffuse); |     rectangle.models.begin()->set_texture(rectangle_diffuse); | ||||||
|     Texture rectangle_normal(TEX_NORMAL, "../resources/textures/rekovalev_normalmap.png"); |     Texture rectangle_normal(TEX_NORMAL, "../resources/textures/rekovalev_normalmap.png"); | ||||||
|     rectangle.models.begin()->set_texture(rectangle_normal); |     rectangle.models.begin()->set_texture(rectangle_normal); | ||||||
| @ -364,7 +362,7 @@ int main(void) | |||||||
|     // Модель скайбокса
 |     // Модель скайбокса
 | ||||||
|     Model skybox; |     Model skybox; | ||||||
|     skybox.load_verteces(skybox_verticies, sizeof(skybox_verticies)/sizeof(glm::vec3)); |     skybox.load_verteces(skybox_verticies, sizeof(skybox_verticies)/sizeof(glm::vec3)); | ||||||
|     TextureCube skybox_texture(TEX_DIFFUSE, {  "../resources/textures/skybox/px.jpg" |     TextureCube skybox_texture(TEX_ALBEDO, {   "../resources/textures/skybox/px.jpg" | ||||||
|                                              , "../resources/textures/skybox/nx.jpg" |                                              , "../resources/textures/skybox/nx.jpg" | ||||||
|                                              , "../resources/textures/skybox/py.jpg" |                                              , "../resources/textures/skybox/py.jpg" | ||||||
|                                              , "../resources/textures/skybox/ny.jpg" |                                              , "../resources/textures/skybox/ny.jpg" | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user