Методы для загрузки касательных и бикасательных векторов

This commit is contained in:
Ковалев Роман Евгеньевич 2023-02-02 18:31:20 +03:00 committed by R.E. Kovalev
parent 54cb3bf771
commit 6d5e7ea1d3
2 changed files with 75 additions and 2 deletions

View File

@ -47,7 +47,9 @@ class Model : public Movable
void load_verteces(glm::vec3* verteces, GLuint count); // Загрузка вершин в буфер void load_verteces(glm::vec3* verteces, GLuint count); // Загрузка вершин в буфер
void load_indices(GLuint* indices, GLuint count); // Загрузка индексов в буфер void load_indices(GLuint* indices, GLuint count); // Загрузка индексов в буфер
void load_texCoords(glm::vec2* texCoords, GLuint count); // Загрузка текстурных координат в буфер void load_texCoords(glm::vec2* texCoords, GLuint count); // Загрузка текстурных координат в буфер
void load_normals(glm::vec3* normals, GLuint count); // Загрузка нормалей в буфер void load_normals(glm::vec3* normals, GLuint count); // Загрузка нормалей в
void load_tangent(glm::vec3* tangent, GLuint count); // Загрузка касательных векторов в буфер
void load_bitangent(glm::vec3* bitangent, GLuint count); // Загрузка бикасательных векторов в буфер
void set_texture(Texture& texture); // Привязка текстуры к модели void set_texture(Texture& texture); // Привязка текстуры к модели
void set_index_range(GLuint beg, GLuint count); // Ограничение диапазона из буфера индексов void set_index_range(GLuint beg, GLuint count); // Ограничение диапазона из буфера индексов
@ -56,6 +58,7 @@ class Model : public Movable
VAO *vao; VAO *vao;
BO *vertex_vbo, *index_vbo; // вершинный и индексный BO *vertex_vbo, *index_vbo; // вершинный и индексный
BO *normals_vbo, *texCoords_vbo; // буферы с нормалями и текстурными координатами BO *normals_vbo, *texCoords_vbo; // буферы с нормалями и текстурными координатами
BO *tangent_vbo, *bitangent_vbo; // буферы с касательными и бикасательными векторами
GLuint verteces_count; // Количество вершин GLuint verteces_count; // Количество вершин
GLuint first_index, indices_count; // Первый и количество индексов GLuint first_index, indices_count; // Первый и количество индексов
Texture texture_diffuse; // Диффузная текстура Texture texture_diffuse; // Диффузная текстура

View File

@ -16,7 +16,8 @@ Movable::Movable(const Movable& copy) : position(copy.position), rotation(copy.r
// Конструктор без параметров // Конструктор без параметров
Model::Model() : Model::Model() :
verteces_count(0), first_index(0), indices_count(0), verteces_count(0), first_index(0), indices_count(0),
vertex_vbo(0), index_vbo(0), normals_vbo(0), texCoords_vbo(0) vertex_vbo(0), index_vbo(0), normals_vbo(0), texCoords_vbo(0),
tangent_vbo(0), bitangent_vbo(0)
{ {
// Создаем новый буфер // Создаем новый буфер
vao = new VAO(); vao = new VAO();
@ -29,6 +30,7 @@ Model::Model(const Model& copy) :
vao(copy.vao), vao(copy.vao),
verteces_count(copy.verteces_count), first_index(copy.first_index), indices_count(copy.indices_count), 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), 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),
texture_diffuse(copy.texture_diffuse), texture_ambient(copy.texture_ambient), texture_specular(copy.texture_specular), material(copy.material) texture_diffuse(copy.texture_diffuse), texture_ambient(copy.texture_ambient), texture_specular(copy.texture_specular), material(copy.material)
{ {
// Если создается копия модели, то запоминаем поля и инкрементируем словарь с количеством // Если создается копия модели, то запоминаем поля и инкрементируем словарь с количеством
@ -48,6 +50,10 @@ Model::~Model()
delete texCoords_vbo; delete texCoords_vbo;
if (normals_vbo) if (normals_vbo)
delete normals_vbo; delete normals_vbo;
if (tangent_vbo)
delete tangent_vbo;
if (bitangent_vbo)
delete bitangent_vbo;
delete vao; delete vao;
} }
} }
@ -243,6 +249,70 @@ void Model::set_index_range(GLuint beg, GLuint count)
indices_count = count; indices_count = count;
} }
// Функция для конфигурации атрибута вершинного буфера
void tangent_attrib_config()
{
// Включаем необходимый атрибут у выбранного VAO
glEnableVertexAttribArray(3);
// Устанавливаем связь между VAO и привязанным BO
glVertexAttribPointer( 3 // индекс атрибута, должен совпадать с Layout шейдера
, 3 // количество компонент одного элемента
, GL_FLOAT // тип
, GL_FALSE // нормализованность значений
, 0 // шаг
, (void *)0 // отступ с начала массива
);
}
// Функция для конфигурации атрибута вершинного буфера
void bitangent_attrib_config()
{
// Включаем необходимый атрибут у выбранного VAO
glEnableVertexAttribArray(4);
// Устанавливаем связь между VAO и привязанным BO
glVertexAttribPointer( 4 // индекс атрибута, должен совпадать с Layout шейдера
, 3 // количество компонент одного элемента
, GL_FLOAT // тип
, GL_FALSE // нормализованность значений
, 0 // шаг
, (void *)0 // отступ с начала массива
);
}
// Загрузка касательных векторов в буфер
void Model::load_tangent(glm::vec3* tangent, GLuint count)
{
// Подключаем VAO
vao->use();
// Если до этого такого буфера не было - создаем его, иначе используем
if (!tangent_vbo)
tangent_vbo = new BO(VERTEX, tangent_attrib_config);
else
tangent_vbo->use();
// Загрузка вершин в память буфера
tangent_vbo->load(tangent, sizeof(glm::vec3)*count);
}
// Загрузка бикасательных векторов в буфер
void Model::load_bitangent(glm::vec3* bitangent, GLuint count)
{
// Подключаем VAO
vao->use();
// Если до этого такого буфера не было - создаем его, иначе используем
if (!bitangent_vbo)
bitangent_vbo = new BO(VERTEX, bitangent_attrib_config);
else
bitangent_vbo->use();
// Загрузка вершин в память буфера
bitangent_vbo->load(bitangent, sizeof(glm::vec3)*count);
}
#define TINYOBJLOADER_IMPLEMENTATION #define TINYOBJLOADER_IMPLEMENTATION
#include "tiny_obj_loader.h" #include "tiny_obj_loader.h"