Dados de vértice
Estamos movendo os dados de vértice do código do shader para um array no código do nosso programa. Para isso vamos criar algumas estruturas para organizar melhor nosso código e deixá-lo pronto para futuros capítulos. Diferente dos casos anteriores que criamos uma classe, iremos criar uma struct
. Primeiro, criaremos uma nova estrutura chamada Model
2. Para isso localizamos a pasta do projeto na árvore do projeto, clicamos com o botão direito do mouse no nome do projeto e selecionamos Add New…. Selecionamos C++ na lista da esquerda e C++ Header File na lista central. Clicamos no botão Choose…, digitamos “Model” no campo Name. Clicamos em Next e Finish. Adicionamos o seguinte código em model.h
:
#ifndef MODEL_H
#define MODEL_H
struct Model
{
Model() {};
};
#endif // MODEL_H
Em seguida, iremos adicionar uma nova estrutura em model.h
chamada Vertex
com os dois atributos que vamos usar no vertex shader dentro dela:
#ifndef MODEL_H
#define MODEL_H
#include <QVector2D>
#include <QVector3D>
struct Vertex {
QVector2D pos;
QVector3D color;
};
struct Model
{
Model() {};
};
#endif // MODEL_H
Agora usamos a estrutura Vertex
para especificar um array de dados de vértice em um membro de Model
:
#include <QVector>
...
struct Model
{
Model() {};
QVector<Vertex> vertices = {
{ {0.0f, -0.5f}, {1.0f, 0.0f, 0.0f} },
{ {0.5f, 0.5f}, {0.0f, 1.0f, 0.0f} },
{ {-0.5f, 0.5f}, {0.0f, 0.0f, 1.0f} }
};
};
Estamos usando exatamente os mesmos valores de posição e cor de antes, mas agora eles estão combinados em um array de vértices3.
3 É importante mencionar aqui que esse código é temporário, iremos modificá-lo mais tarde para armazenar dados de vértices obtidos de arquivos do tipo
obj
.
Para armazenar buffers relacionados a objetos 3D, como buffers de vértice, índice e uniform
, vamos criar uma nova estrutura chamada Object3D
4. Em render.h
adicionamos o seguinte código:
#include <QSharedPointer>
...
struct Model;
struct Object3D
{
Object3D(QSharedPointer<Model> model);
QSharedPointer<Model> model;
};
4 Mesmo que até o momento não estamos tratando de dados de vértices em 3D, vamos dar esse nome a estrutura pensando nos próximos capítulos que tratarão de objetos 3D.
Implementamos o construtor de Object3D
em renderer.cpp
que irá receber um objeto do tipo Model
e armazená-lo no membro correspondente:
#include "model.h"
...
Object3D::Object3D(QSharedPointer<Model> model)
: model(model) {}
Agora adicionamos um membro de classe em renderer.h
para armazenar uma referência ao objeto 3D que iremos renderizar:
private:
...
Object3D* m_object = nullptr;
Em seguida criamos uma nova função chamada initObject
que será responsável pela inicialização do objeto 3D.
void Renderer::initObject() {
QSharedPointer<Model> model = QSharedPointer<Model>::create(Model());
m_object = new Object3D(model);
}
...
void Renderer::initResources() {
...
initPipeline();
initObject();
}
Por enquanto, iremos chamar essa função em initResources
, logo após a inicialização do pipeline.