Rendering 2D com OpenGL e interface gráfica em Qt

Documentos relacionados
Principais classes e conceitos básicos de Qt. Danilo Freire de Souza Santos

Básico, Ferramentas e o Primeiro Programa em Qt

Case de uso: Desenvolvimento de um Infotainment System com Qt WebEngine e Yocto. Luis Gustavo S. Barreto

Capítulo 3 Primeiros Passos em OpenGL Função Desenha Função Teclado Função Inicializa Programa Principal...

Introdução a OpenGL. Renato Rodrigues Oliveira da Silva Danilo Medeiros Eler

Computação Gráfica. 5385: Licenciatura em Engenharia Informática. Cap. 3 Janelas e Visores. Janelas e Visores

CG 2013/2014 Primeiro Teste LEIC Alameda/Taguspark

Computação Gráfica. Engenharia de Computação. CEFET/RJ campus Petrópolis. Prof. Luis Retondaro. Aula 2. Introdução a OpenGL

Programação Gráfica Cap 2

Sistemas de coordenadas

Viewing 3D. SCC Computação Gráfica. Prof. Fernando V. Paulovich

Linguagem de Programação I

Desenho de uma matriz de retângulos Serve de base para o exercício das cores

Computação Gráfica. GLSL - Introdução e Programação da Aplicação OpenGL

Sist. Coordenadas Câmera (SCC)

LAB. 1. Introdução à OpenGL

3 Fundamentos. 3.1 Pipeline de renderização em OpenGL

n À primeira vista: basta desenhar n Uma subrotina para desenhar cada tipo de objeto n Mas... n Como fazer interação? n Como estruturar a cena?

FCG2006 Prova sobre OpenGL e Rastreamento de Raios

UNIVERSIDADE FEDERAL FLUMINENSE Pedro Martins Menezes. Um estudo dos estágios dos pipelines gráficos

Animação e Visualização Tridimensional

Computação Gráfica. GLSL - Programação de Shaders Toon Mapping; Texturas

Programação Orientada a Objetos (DPADF 0063)

DESENVOLVENDO APLICAÇÕES ANDROID COM Qt Sandro Andrade KDE/IFBA

Geração Procedural de Terrenos em GPU

Computação Gráfica. Licenciatura em Engenharia Informática e de Computadores Alameda / Taguspark. Terceiro Teste 19 de Maio de 2012

Cap. 4: Janelas, Visores & Recorte Gráfico

Luiz Gonzaga da Silveira Jr

Desenvolvendo Widgets QML para o KDE Plasma

OpenGL, GLU e GLUT. GLUT (OpenGL Utility Toolkit) OpenGL. Linguagem. OpenGL. Esqueleto de um programa em PyOpenGL

Projeções e Visualização

2º Exame de Animação e Visualização Tridimensional

Computação Gráfica. Agostinho Brito. Departamento de Engenharia da Computação e Automação Universidade Federal do Rio Grande do Norte

Computação Gráfica OpenGl 01

Orientação a Objetos Programação em C++

Introdução ao OpenCV

Linguagens de Programação

Programação 2009/2010 MEEC - MEAer Laboratório 5 Semana de 26 de outubro de 2009

OpenGL Shading Language

Introdução ao Desenvolvimento de Aplicações QML Lamarque V. Souza

OpenGL. Soraia Musse

Interfaces POO. Prof. Marcio Delamaro

Sistemas Gráficos Interativos. Interações

AULA 02. OBJETIVO: Características da Linguagem Orientada a Objetos.

POO29004 Programação Orientada a Objetos

Linguagem de Programação III

UNIP - Ciência da Computação e Sistemas de Informação. Estrutura de Dados. AULA 5 Pilhas

Linguagens de Programação. Parte V. História do Qt. Primeiro Exemplo. Primeiras Classes. Primeiro Exemplo. Prof. Miguel Elias Mitre Campista

Compilação dos trabalhos: questões de concurso

Programação de Computadores II

Programação Orientada a Objetos (utilizando C#) Professor Emiliano S. Monteiro Versão 12 Out/2016.

Introdução aos Sistemas Operacionais. Subsistema de Entrada e Saída

Técnicas de Desenvolvimento de Games para Android

Visibilidade. Licenciatura em Engenharia Informática e de Computadores Computação Gráfica. Edward Angel, Cap. 7 Apontamentos CG

Transcrição:

Rendering 2D com OpenGL e interface gráfica em Qt

Qt Framework multiplataforma para desenvolvimento de interfaces gráficas em C++ https://www.qt.io/ 2

Ferramentas Qt Creator IDE (Ambiente Integrado de Desenvolvimento) multiplataforma, desenhado para as necessidades dos desenvolvedores de Qt. https://www.qt.io/download-open-source/ Qt Designer Ferramenta gráfica de criação de interfaces incluída no Qt Creator. 3

Módulos 4

Hello World! #include <qapplication.h> #include <qpushbutton.h> int main( int argc, char **argv ) { QApplication a( argc, argv ); QPushButton hello( "Hello world!", 0 ); hello.resize( 100, 30 ); } a.setmainwidget( &hello ); hello.show(); return a.exec(); 5

Signals e Slots Mecanismo de comunicação entre objetos QT Um sinal é emitido quando algum evento particular ocorre. Os widgets do QT já possuem muitos sinais predefinidos, mas sempre podemos adicionar nossos próprios sinais às nossas subclasses. Não devem ser implementados; Sempre retornam void; Devem ser chamados com emit signal_name(parameter), quando necessário. Um slot é uma função chamada em resposta a um sinal em particular. Novamente, os widgets do QT já possuem muitos slots predefinidos, mas comumente criamos nossos próprios slots para lidar com os sinais que nos interessam. A conexão entre signals e slots é feita com connect, como por exemplo: QObject::connect(&a, SIGNAL(valueChanged(int)), &b, SLOT(setValue(int))); 6

Signals e Slots class MyClass : public QObject { Q_OBJECT //Macro obrigatória, sem ponto-e-vírgula... signals: void somethinghappened();... public slots: void slotdosomething();... private slots: void slotdosomethinginternal();... }; 7

OpenGL API para interface com hardware gráfico, independente de plataforma e de sistemas de janelas. 8

Rendering Pipeline Sequência de etapas para renderizar (desenhar) objetos Etapas programáveis Etapas opcionais 9

Transformações 10

Projeção perspectiva x Projeção ortográfica 11

Projeção perspectiva x Projeção ortográfica P = f aspect 0 0 0 0 f 0 0 0 0 far + near 2 near far near far near far 0 0 1 0, onde f = cot fovy 2 QMatrix4x4 view; view.perspective(fovy,aspect, near,far); O = 2 right left 0 0 0 right + left 0 0 right left 2 top + bottom 0 top bottom top bottom 2 far + near far near far near 0 0 0 1 QMatrix4x4 view; view.ortho(left,right, bottom,top,near,far); 12

Vertex Shader Processa VÉRTICES individualmente. Entrada: atributos de vértice. layout( location = #) in type var_name; Saída built-in: gl_position Uso: Tipicamente para realizar transformações geométricas para o espaço de projeção, e algumas vezes para realizar iluminação por vértice. 13

Vertex Shader #version 330 core layout( location = 0 ) in vec3 vertexpos; uniform mat4 transformmatrix; void main() { gl_position = transformmatrix * vec4( vertexpos, 1 ); } 14

Fragment Shader Processa FRAGMENTOS individualmente, resultantes do processo de rasterização. Um fragmento de entrada -> um fragmento de saída. Saída: um valor de depth (depth value) e zero ou mais cores. Uso: Tipicamente para realizar iluminação por fragmento. 15

Fragment Shader #version 330 core uniform vec3 color; out vec3 finalcolor; void main() { finalcolor = color; } 16

QT + OpenGL Classe QOpenGLWidget Provê funcionalidades para desenhar utilizando OpenGL Herde da classe QOpenGLWidget (e possivelmente de QOpenGLFunctions) e implemente os métodos: void initializegl() override; void paintgl() override; void resizegl(int width, int height) override; Implemente os eventos de mouse que forem necessários para a sua aplicação: void mousepressevent(qmouseevent *) override; void mousemoveevent(qmouseevent *event) override; void mousereleaseevent(qmouseevent *event) override; 17

QT + OpenGL QOpenGLShaderProgram Encapsula compilação e linkagem de shaders QOpenGLShaderProgram* program = new QOpenGLShaderProgram(); program->addshaderfromsourcecode(qopenglshader::vertex, vertexshadersource); program->addshaderfromsourcecode(qopenglshader::fragment, fragmentshadersource); program->link(); QOpenGLBuffer Encapsula criação e gerenciamento de OpenGL buffer objects QOpenGLBuffer pointsbuffer; pointsbuffer.create(); pointsbuffer.bind(); pointsbuffer.allocate( &points[0], (int)points.size()*sizeof(qvector3d) ); 18

QT + OpenGL Desenhando: program->bind(); glclearcolor(0, 0, 0, 1); glclear(gl_color_buffer_bit); if(!points.empty() && pointsbuffer.iscreated()) { pointsbuffer.bind(); pointsbuffer.allocate( &points[0],(int)points.size()*sizeof(qvector3d) ); program->enableattributearray(0); program->setattributebuffer(0,gl_float,0,3,sizeof(qvector3d)); program->setuniformvalue("color", QVector3D(1,0,0)); } gldrawarrays(gl_line_strip, 0, (int)points.size()); 19