Текстуры высот и нормалей
This commit is contained in:
		
							parent
							
								
									2aaf2b51b2
								
							
						
					
					
						commit
						a2a4097a20
					
				@ -99,6 +99,8 @@ class Model : public Node
 | 
				
			|||||||
        Texture texture_diffuse; // Диффузная текстура
 | 
					        Texture texture_diffuse; // Диффузная текстура
 | 
				
			||||||
        Texture texture_ambient; // Текстура фонового освщения
 | 
					        Texture texture_ambient; // Текстура фонового освщения
 | 
				
			||||||
        Texture texture_specular; // Текстура зеркального отражения
 | 
					        Texture texture_specular; // Текстура зеркального отражения
 | 
				
			||||||
 | 
					        Texture texture_heights; // Текстура высот
 | 
				
			||||||
 | 
					        Texture texture_normals; // Текстура нормалей
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // MODEL_H
 | 
					#endif // MODEL_H
 | 
				
			||||||
 | 
				
			|||||||
@ -10,6 +10,8 @@ enum TexType {
 | 
				
			|||||||
    TEX_DIFFUSE,
 | 
					    TEX_DIFFUSE,
 | 
				
			||||||
    TEX_AMBIENT,
 | 
					    TEX_AMBIENT,
 | 
				
			||||||
    TEX_SPECULAR,
 | 
					    TEX_SPECULAR,
 | 
				
			||||||
 | 
					    TEX_HEIGHTS,
 | 
				
			||||||
 | 
					    TEX_NORMAL,
 | 
				
			||||||
    TEX_AVAILABLE_COUNT
 | 
					    TEX_AVAILABLE_COUNT
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -215,6 +215,7 @@ verteces_count(copy.verteces_count), first_index_byteOffset(copy.first_index_byt
 | 
				
			|||||||
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_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)
 | 
					material(copy.material)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -241,6 +242,9 @@ Model& Model::operator=(const Model& other)
 | 
				
			|||||||
    texture_ambient = other.texture_ambient;
 | 
					    texture_ambient = other.texture_ambient;
 | 
				
			||||||
    texture_specular = other.texture_specular;
 | 
					    texture_specular = other.texture_specular;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					    texture_heights = other.texture_heights;
 | 
				
			||||||
 | 
					    texture_normals = other.texture_normals;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
    material = other.material;
 | 
					    material = other.material;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return *this;
 | 
					    return *this;
 | 
				
			||||||
@ -277,7 +281,8 @@ void Model::render(ShaderProgram &shaderProgram, UBO &material_buffer)
 | 
				
			|||||||
    texture_diffuse.use();
 | 
					    texture_diffuse.use();
 | 
				
			||||||
    texture_ambient.use();
 | 
					    texture_ambient.use();
 | 
				
			||||||
    texture_specular.use();
 | 
					    texture_specular.use();
 | 
				
			||||||
    
 | 
					    texture_heights.use();
 | 
				
			||||||
 | 
					    texture_normals.use();    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Загружаем данные о материале
 | 
					    // Загружаем данные о материале
 | 
				
			||||||
    material_buffer.load(&material, sizeof(material));
 | 
					    material_buffer.load(&material, sizeof(material));
 | 
				
			||||||
@ -405,6 +410,12 @@ void Model::set_texture(Texture& texture)
 | 
				
			|||||||
        case TEX_SPECULAR:
 | 
					        case TEX_SPECULAR:
 | 
				
			||||||
            texture_specular = texture;
 | 
					            texture_specular = texture;
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
 | 
					        case TEX_HEIGHTS:
 | 
				
			||||||
 | 
					            texture_heights = texture;
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        case TEX_NORMAL:
 | 
				
			||||||
 | 
					            texture_normals = texture;
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -222,6 +222,10 @@ Scene loadOBJtoScene(const char* filename, const char* mtl_directory, const char
 | 
				
			|||||||
        s->set_texture(ambient);
 | 
					        s->set_texture(ambient);
 | 
				
			||||||
        Texture specular(TEX_SPECULAR, texture_directory + materials[materials_ids[i]].specular_texname);
 | 
					        Texture specular(TEX_SPECULAR, texture_directory + materials[materials_ids[i]].specular_texname);
 | 
				
			||||||
        s->set_texture(specular);
 | 
					        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.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));
 | 
				
			||||||
 | 
				
			|||||||
@ -28,11 +28,34 @@ Texture::Texture(GLuint t, const std::string& filename)
 | 
				
			|||||||
            // Если изображение успешно считано
 | 
					            // Если изображение успешно считано
 | 
				
			||||||
            if (image)
 | 
					            if (image)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                // Загрузка данных с учетом прозрачности
 | 
					                // Выбор формата с учетом типа текстуры (нормали не sRGB) и числа каналов
 | 
				
			||||||
                if (channels == 3) // RGB
 | 
					                GLuint internalformat = GL_RGB, format = GL_RGB; 
 | 
				
			||||||
                    glTexImage2D(GL_TEXTURE_2D, 0, GL_SRGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image); 
 | 
					                switch (channels)
 | 
				
			||||||
                else if (channels == 4) // RGBA
 | 
					                {
 | 
				
			||||||
                    glTexImage2D(GL_TEXTURE_2D, 0, GL_SRGB_ALPHA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image);
 | 
					                    case 1:
 | 
				
			||||||
 | 
					                        internalformat = format = GL_RED;
 | 
				
			||||||
 | 
					                        break;
 | 
				
			||||||
 | 
					                    case 2:
 | 
				
			||||||
 | 
					                        internalformat = format = GL_RG;
 | 
				
			||||||
 | 
					                        break;
 | 
				
			||||||
 | 
					                    case 3:
 | 
				
			||||||
 | 
					                        format = GL_RGB;
 | 
				
			||||||
 | 
					                        if (type == TEX_NORMAL || type == TEX_HEIGHTS)
 | 
				
			||||||
 | 
					                            internalformat = GL_RGB;
 | 
				
			||||||
 | 
					                        else
 | 
				
			||||||
 | 
					                            internalformat = GL_SRGB;
 | 
				
			||||||
 | 
					                        break;
 | 
				
			||||||
 | 
					                    case 4:
 | 
				
			||||||
 | 
					                        format = GL_RGBA;
 | 
				
			||||||
 | 
					                        if (type == TEX_NORMAL || type == TEX_HEIGHTS)
 | 
				
			||||||
 | 
					                            internalformat = GL_RGBA;
 | 
				
			||||||
 | 
					                        else
 | 
				
			||||||
 | 
					                            internalformat = GL_SRGB_ALPHA;
 | 
				
			||||||
 | 
					                        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                // Загрузка данных с учетом формата
 | 
				
			||||||
 | 
					                glTexImage2D(GL_TEXTURE_2D, 0, internalformat, width, height, 0, format, GL_UNSIGNED_BYTE, image);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                glGenerateMipmap(GL_TEXTURE_2D); // Генерация мипмапа для активной текстуры
 | 
					                glGenerateMipmap(GL_TEXTURE_2D); // Генерация мипмапа для активной текстуры
 | 
				
			||||||
                glBindTexture(GL_TEXTURE_2D, 0); // Отвязка активной текстуры
 | 
					                glBindTexture(GL_TEXTURE_2D, 0); // Отвязка активной текстуры
 | 
				
			||||||
@ -253,11 +276,34 @@ TextureCube::TextureCube(GLuint t, const std::string (&filename)[6])
 | 
				
			|||||||
            // Если изображение успешно считано
 | 
					            // Если изображение успешно считано
 | 
				
			||||||
            if (image)
 | 
					            if (image)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                // Загрузка данных с учетом прозрачности
 | 
					                // Выбор формата с учетом типа текстуры (нормали не sRGB) и числа каналов
 | 
				
			||||||
                if (channels == 3) // RGB
 | 
					                GLuint internalformat = GL_RGB, format = GL_RGB; 
 | 
				
			||||||
                    glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_SRGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
 | 
					                switch (channels)
 | 
				
			||||||
                else if (channels == 4) // RGBA
 | 
					                {
 | 
				
			||||||
                    glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_SRGB_ALPHA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image);
 | 
					                    case 1:
 | 
				
			||||||
 | 
					                        internalformat = format = GL_RED;
 | 
				
			||||||
 | 
					                        break;
 | 
				
			||||||
 | 
					                    case 2:
 | 
				
			||||||
 | 
					                        internalformat = format = GL_RG;
 | 
				
			||||||
 | 
					                        break;
 | 
				
			||||||
 | 
					                    case 3:
 | 
				
			||||||
 | 
					                        format = GL_RGB;
 | 
				
			||||||
 | 
					                        if (type == TEX_NORMAL || type == TEX_HEIGHTS)
 | 
				
			||||||
 | 
					                            internalformat = GL_RGB;
 | 
				
			||||||
 | 
					                        else
 | 
				
			||||||
 | 
					                            internalformat = GL_SRGB;
 | 
				
			||||||
 | 
					                        break;
 | 
				
			||||||
 | 
					                    case 4:
 | 
				
			||||||
 | 
					                        format = GL_RGBA;
 | 
				
			||||||
 | 
					                        if (type == TEX_NORMAL || type == TEX_HEIGHTS)
 | 
				
			||||||
 | 
					                            internalformat = GL_RGBA;
 | 
				
			||||||
 | 
					                        else
 | 
				
			||||||
 | 
					                            internalformat = GL_SRGB_ALPHA;
 | 
				
			||||||
 | 
					                        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                // Загрузка данных с учетом формата
 | 
				
			||||||
 | 
					                glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, internalformat, width, height, 0, format, GL_UNSIGNED_BYTE, image);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                stbi_image_free(image); // Освобождение оперативной памяти
 | 
					                stbi_image_free(image); // Освобождение оперативной памяти
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
				
			|||||||
@ -130,7 +130,7 @@ int main(void)
 | 
				
			|||||||
    gShader.load(GL_FRAGMENT_SHADER, "shaders/gshader.frag");
 | 
					    gShader.load(GL_FRAGMENT_SHADER, "shaders/gshader.frag");
 | 
				
			||||||
    gShader.link();
 | 
					    gShader.link();
 | 
				
			||||||
    // Установим значения текстур
 | 
					    // Установим значения текстур
 | 
				
			||||||
    const char* textures_base_shader_names[] = {"tex_diffuse", "tex_ambient", "tex_specular"};
 | 
					    const char* textures_base_shader_names[] = {"tex_diffuse", "tex_ambient", "tex_specular", "tex_heights", "tex_normal"};
 | 
				
			||||||
    gShader.bindTextures(textures_base_shader_names, sizeof(textures_base_shader_names)/sizeof(const char*));
 | 
					    gShader.bindTextures(textures_base_shader_names, sizeof(textures_base_shader_names)/sizeof(const char*));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Загрузка сцены из obj файла
 | 
					    // Загрузка сцены из obj файла
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user