Link

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 Model2. 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 Object3D4. 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.


Anterior Próximo