29
Introdução à Opengl com Java Introdução à Opengl com Java SCC0250 - Computação Gráfica Prof. Fernando V. Paulovich http://www.icmc.usp.br/~paulovic [email protected] Instituto de Ciências Matemáticas e de Computação (ICMC) Universidade de São Paulo (USP) 3 de março de 2014 1 / 29

Introdução à Opengl com Java - lcad.icmc.usp.brpaulovic/aulas/CG/slides_novos/...Java_GLSL.pdf · Introdução à Opengl com Java OpenGL OpenGL Ambientep/escrevereexecutarprogramasgráficos

  • Upload
    ngoanh

  • View
    254

  • Download
    2

Embed Size (px)

Citation preview

Page 1: Introdução à Opengl com Java - lcad.icmc.usp.brpaulovic/aulas/CG/slides_novos/...Java_GLSL.pdf · Introdução à Opengl com Java OpenGL OpenGL Ambientep/escrevereexecutarprogramasgráficos

Introdução à Opengl com Java

Introdução à Opengl com Java

SCC0250 - Computação Gráfica

Prof. Fernando V. Paulovichhttp://www.icmc.usp.br/~paulovic

[email protected]

Instituto de Ciências Matemáticas e de Computação (ICMC)Universidade de São Paulo (USP)

3 de março de 2014

1 / 29

Page 2: Introdução à Opengl com Java - lcad.icmc.usp.brpaulovic/aulas/CG/slides_novos/...Java_GLSL.pdf · Introdução à Opengl com Java OpenGL OpenGL Ambientep/escrevereexecutarprogramasgráficos

Introdução à Opengl com Java

Sumário

1 OpenGL

2 Instalação

2 / 29

Page 3: Introdução à Opengl com Java - lcad.icmc.usp.brpaulovic/aulas/CG/slides_novos/...Java_GLSL.pdf · Introdução à Opengl com Java OpenGL OpenGL Ambientep/escrevereexecutarprogramasgráficos

Introdução à Opengl com JavaOpenGL

Sumário

1 OpenGL

2 Instalação

3 / 29

Page 4: Introdução à Opengl com Java - lcad.icmc.usp.brpaulovic/aulas/CG/slides_novos/...Java_GLSL.pdf · Introdução à Opengl com Java OpenGL OpenGL Ambientep/escrevereexecutarprogramasgráficos

Introdução à Opengl com JavaOpenGL

Introdução

Application Programming Interface (API)

Coleção de rotinas que o programador pode chamarModelo de como estas rotinas operam em conjunto para gerargráficosProgramador “enxerga” apenas a interfaceNão precisa lidar com aspectos específicos do hardware ouidiossincracias de software no sistema gráfico residente(independente do dispositivo)Oferece suporte para gerar e exibir cenas 3D complexas, etambém para gráficos 2D simples

4 / 29

Page 5: Introdução à Opengl com Java - lcad.icmc.usp.brpaulovic/aulas/CG/slides_novos/...Java_GLSL.pdf · Introdução à Opengl com Java OpenGL OpenGL Ambientep/escrevereexecutarprogramasgráficos

Introdução à Opengl com JavaOpenGL

OpenGL

Ambiente p/ escrever e executar programas gráficosMonitor (“tela”) + biblioteca de software – para desenharprimitivas gráficas na tela

API pode ser vista como uma “caixa preta”Entradas: Chamadas a funções da biblioteca feitas peloprograma do usuário; Medidas fornecidas por dispositivos deentrada; etcSaídas: Os gráficos exibidos no monitorDescrita em termos das funções que disponibiliza

5 / 29

Page 6: Introdução à Opengl com Java - lcad.icmc.usp.brpaulovic/aulas/CG/slides_novos/...Java_GLSL.pdf · Introdução à Opengl com Java OpenGL OpenGL Ambientep/escrevereexecutarprogramasgráficos

Introdução à Opengl com JavaOpenGL

API OpenGL

Programa

Em geral, trabalha com um sistema de janelas (“windowsystem”)Inicializações: modo de exibição (“display mode”), janela dedesenho e sistema de coordenadas de referência (associado àjanela)

API oferece centenas de funções...Diferentes funcionalidades

Funções primitivas: o queFunções de atributos: como...

6 / 29

Page 7: Introdução à Opengl com Java - lcad.icmc.usp.brpaulovic/aulas/CG/slides_novos/...Java_GLSL.pdf · Introdução à Opengl com Java OpenGL OpenGL Ambientep/escrevereexecutarprogramasgráficos

Introdução à Opengl com JavaOpenGL

Programação Dirigida a Eventos

Direcionada a eventos (event-driven)programa responde a eventos: clique do mouse, teclapressionada, redimensionamento da janela

7 / 29

Page 8: Introdução à Opengl com Java - lcad.icmc.usp.brpaulovic/aulas/CG/slides_novos/...Java_GLSL.pdf · Introdução à Opengl com Java OpenGL OpenGL Ambientep/escrevereexecutarprogramasgráficos

Introdução à Opengl com JavaOpenGL

OpenGL 3.x

A partir da OpenGL 3Sem suporte para operações sobre matrizes

glRotate, glTranslateVBO & VAO são essenciais

Vertex Buffer Object: Buffer para transferir atributos dosvértices, como coordenadas e cores, da aplicação para a placagráfica.Vertex Array Object: Estrutura que comporta vários VBOs epermite que mais que um atributo seja transferido de uma vez.

Orientado a shaders

8 / 29

Page 9: Introdução à Opengl com Java - lcad.icmc.usp.brpaulovic/aulas/CG/slides_novos/...Java_GLSL.pdf · Introdução à Opengl com Java OpenGL OpenGL Ambientep/escrevereexecutarprogramasgráficos

Introdução à Opengl com JavaOpenGL

Estados do OpenGL

OpenGL rastreia diversas variáveis de estadoTamanho atual de um ponto, cor de fundo da janela, cor dodesenho, etc.O valor corrente permanece ativo até que seja alterado

Tamanho de ponto: glPointSize(3.0)Cor de fundo: glClearColor(red, green, blue, alpha)Limpar janela: glClear(GL_COLOR_BUFFER_BIT) – os bitsdo “color buffer” serão modificados para a cor de fundo

9 / 29

Page 10: Introdução à Opengl com Java - lcad.icmc.usp.brpaulovic/aulas/CG/slides_novos/...Java_GLSL.pdf · Introdução à Opengl com Java OpenGL OpenGL Ambientep/escrevereexecutarprogramasgráficos

Introdução à Opengl com JavaOpenGL

Programando

Um programa OpenGL é definido por meio de implementaçãode uma interface ouvinte (GLEventListener) que controla odesenho em um canvas (GLCanvas)

Adicionar esse canvas a um JFrame e ativar um ”Animator” é oúltimo passo para se criar uma aplicação OpenGL

O ”Animator” define o loop de desenho

10 / 29

Page 11: Introdução à Opengl com Java - lcad.icmc.usp.brpaulovic/aulas/CG/slides_novos/...Java_GLSL.pdf · Introdução à Opengl com Java OpenGL OpenGL Ambientep/escrevereexecutarprogramasgráficos

Introdução à Opengl com JavaOpenGL

Programando

GLEventListener é responsável pelo desenho e outras funções

1 public class Example01 implements GLEventListener {23 public void init(GLAutoDrawable drawable) {4 // inicializar o sistema5 }67 public void display(GLAutoDrawable drawable) {8 // função de desenho9 }

1011 public void reshape(GLAutoDrawable drawable, int x, int y,12 int width, int height) {13 // função de redimensionamento14 }1516 public void dispose(GLAutoDrawable drawable) {17 // função para liberar recursos18 }19 }

11 / 29

Page 12: Introdução à Opengl com Java - lcad.icmc.usp.brpaulovic/aulas/CG/slides_novos/...Java_GLSL.pdf · Introdução à Opengl com Java OpenGL OpenGL Ambientep/escrevereexecutarprogramasgráficos

Introdução à Opengl com JavaOpenGL

Programando

Montando uma aplicação

1 public static void main(String[] args) {2 // Define um profile para trabalhar com a OpenGL 3.03 GLProfile profile = GLProfile.get(GLProfile.GL3);45 // Configuracoes6 GLCapabilities glcaps = new GLCapabilities(profile);7 glcaps.setDoubleBuffered(true);8 glcaps.setHardwareAccelerated(true);9

10 // Cria o canvas (elemento de desenho)11 GLCanvas glCanvas = new GLCanvas(glcaps);1213 // Adiciona o ouvinte de desenho ao canvas14 glCanvas.addGLEventListener(new Example01());1516 ...

12 / 29

Page 13: Introdução à Opengl com Java - lcad.icmc.usp.brpaulovic/aulas/CG/slides_novos/...Java_GLSL.pdf · Introdução à Opengl com Java OpenGL OpenGL Ambientep/escrevereexecutarprogramasgráficos

Introdução à Opengl com JavaOpenGL

Programando (continuação)

1 ...2 // Cria um JFrame e adiciona o canvas3 JFrame frame = new JFrame("Example 01");4 frame.setSize(800, 600);5 frame.getContentPane().add(glCanvas);67 // Cria um "animator" para ativar o loop de desenho8 final AnimatorBase animator = new FPSAnimator(glCanvas, 60);9

10 // Muda o gerenciador de evento de fechamento do JFrame11 frame.addWindowListener(new WindowAdapter() {12 public void windowClosing(WindowEvent e) {13 new Thread(new Runnable() {14 public void run() {15 animator.stop();16 System.exit(0);17 }18 }).start();19 }20 });2122 // Torna o frame visivel e inica o loop de animacao23 frame.setVisible(true);24 animator.start();25 }

13 / 29

Page 14: Introdução à Opengl com Java - lcad.icmc.usp.brpaulovic/aulas/CG/slides_novos/...Java_GLSL.pdf · Introdução à Opengl com Java OpenGL OpenGL Ambientep/escrevereexecutarprogramasgráficos

Introdução à Opengl com JavaOpenGL

Programando

Para a definição de como o pipeline da OpenGL irá funcionarshaders precisam ser escritos em OpenGL ShadingLanguage (GLSL)

GLSL é uma linguagem de alto nível que permite aosdesenvolvedores controlar o pipeline gráfico sem precisar sepreocupar com aspectos específicos de hardware

Similar a linguagem C, suportando laços, comandos de decisão,etc.

14 / 29

Page 15: Introdução à Opengl com Java - lcad.icmc.usp.brpaulovic/aulas/CG/slides_novos/...Java_GLSL.pdf · Introdução à Opengl com Java OpenGL OpenGL Ambientep/escrevereexecutarprogramasgráficos

Introdução à Opengl com JavaOpenGL

OpenGL Shading Language

Cada placa gráfica inclui um compilador GLSL em seu driver –código pode ser otimizado para utilizar as particularidades daplaca

Existem diferentes shaders na OpenGL: vertex, fragment,geometry, etc., cada um com uma função específica dentro dopipeline

Para poderem ser usados, os shaders devem ser carregados,compilados e ”linkados” ao programa sendo executado

15 / 29

Page 16: Introdução à Opengl com Java - lcad.icmc.usp.brpaulovic/aulas/CG/slides_novos/...Java_GLSL.pdf · Introdução à Opengl com Java OpenGL OpenGL Ambientep/escrevereexecutarprogramasgráficos

Introdução à Opengl com JavaOpenGL

Programando (Controlador dos Shaders)

Controla um determinado shader

1 public class Shader {2 //Define os arquivos dos shaders3 public Shader(String vertex, String fragment) {...}45 //Le os shaders, compila e "linka"6 public void init(final GL3 gl) {...}78 //Ativa os shaders9 public void bind() {...}

1011 //Desativa os shaders12 public void dispose() {...}1314 //Define um "pointeiro" para passar constantes para os shaders15 public int getUniformLocation(String varName) {...}1617 //Define um "pointeiro" para passar atributos para os shaders18 public int getAttribLocation(String varName) {...}19 }

16 / 29

Page 17: Introdução à Opengl com Java - lcad.icmc.usp.brpaulovic/aulas/CG/slides_novos/...Java_GLSL.pdf · Introdução à Opengl com Java OpenGL OpenGL Ambientep/escrevereexecutarprogramasgráficos

Introdução à Opengl com JavaOpenGL

Programando (Controlador dos Shaders)

Cria objetos de shader

1 public class ShaderFactory {23 public enum ShaderType {45 SIMPLE_SHADER6 };78 public static Shader getInstance(ShaderType type) {9 if (type == ShaderType.SIMPLE_SHADER) {

10 return new Shader("simple_vertex.glsl", "simple_fragment.glsl");11 }12 return null;13 }14 }

17 / 29

Page 18: Introdução à Opengl com Java - lcad.icmc.usp.brpaulovic/aulas/CG/slides_novos/...Java_GLSL.pdf · Introdução à Opengl com Java OpenGL OpenGL Ambientep/escrevereexecutarprogramasgráficos

Introdução à Opengl com JavaOpenGL

Programando

Utilizando os shaders dentro da nossa aplicação

1 public class Example01 implements GLEventListener {23 private Shader shader; // Gerenciador os shaders4 private int[] vbo; // Vertex Buffer Object5 private int nr_vertices; // Numero de vertices no VBO67 public Aula01() {8 // Carrega os shaders9 shader = ShaderFactory.getInstance(ShaderFactory.ShaderType.←↩

SIMPLE_SHADER);10 }1112 ...13 }

18 / 29

Page 19: Introdução à Opengl com Java - lcad.icmc.usp.brpaulovic/aulas/CG/slides_novos/...Java_GLSL.pdf · Introdução à Opengl com Java OpenGL OpenGL Ambientep/escrevereexecutarprogramasgráficos

Introdução à Opengl com JavaOpenGL

Programando

Define o método de inicialização

1 @Override2 public void init(GLAutoDrawable drawable) {3 // Recupera o pipeline4 GL3 gl = glad.getGL().getGL3();56 // define "cor do fundo"7 gl.glClearColor(0, 0, 0, 0);89 //inicializa os shaders

10 shader.init(gl);1112 //ativa os shaders13 shader.bind();1415 //cria o objeto a ser desenhado16 nr_vertices = create_object(gl);17 }

19 / 29

Page 20: Introdução à Opengl com Java - lcad.icmc.usp.brpaulovic/aulas/CG/slides_novos/...Java_GLSL.pdf · Introdução à Opengl com Java OpenGL OpenGL Ambientep/escrevereexecutarprogramasgráficos

Introdução à Opengl com JavaOpenGL

Programando

Método para criação de um objeto (VBO)

1 private int create_object(GL3 gl) {2 float[] TRIANGLE_VERTICES = new float[]{ -0.5f, -0.5f, 0.0f,3 0.5f, -0.5f, 0.0f,4 0.0f, 0.5f, 0.0f,};56 // Cria um buffer contendo a posição dos vertices7 vbo = new int[1];8 gl.glGenBuffers(1, vbo, 0);9 gl.glBindBuffer(GL3.GL_ARRAY_BUFFER, vbo[0]);

10 gl.glBufferData(GL3.GL_ARRAY_BUFFER, TRIANGLE_VERTICES.length * ←↩Buffers.SIZEOF_FLOAT,

11 Buffers.newDirectFloatBuffer(TRIANGLE_VERTICES), GL3.←↩GL_STATIC_DRAW);

12 gl.glBindBuffer(GL3.GL_ARRAY_BUFFER, 0);1314 // Passa o buffer para o vertex shader15 int vertexPositions = shader.getAttribLocation("a_position");16 gl.glBindBuffer(GL3.GL_ARRAY_BUFFER, vbo[0]);17 gl.glVertexAttribPointer(vertexPositions, 3, GL3.GL_FLOAT, false, 0,←↩

0);18 gl.glEnableVertexAttribArray(vertexPositions);1920 return TRIANGLE_VERTICES.length / 3;21 }

20 / 29

Page 21: Introdução à Opengl com Java - lcad.icmc.usp.brpaulovic/aulas/CG/slides_novos/...Java_GLSL.pdf · Introdução à Opengl com Java OpenGL OpenGL Ambientep/escrevereexecutarprogramasgráficos

Introdução à Opengl com JavaOpenGL

Programando

Vertex shader

1 #version 15023 in vec3 a_position;45 void main(void)6 {7 gl_Position = vec4(a_position, 1.0);8 }

21 / 29

Page 22: Introdução à Opengl com Java - lcad.icmc.usp.brpaulovic/aulas/CG/slides_novos/...Java_GLSL.pdf · Introdução à Opengl com Java OpenGL OpenGL Ambientep/escrevereexecutarprogramasgráficos

Introdução à Opengl com JavaOpenGL

Programando

Fragment shader

1 #version 15023 out vec4 fragColor;45 void main(void)6 {7 fragColor = vec4(1.0, 0.0, 0.0, 1.0);8 }

22 / 29

Page 23: Introdução à Opengl com Java - lcad.icmc.usp.brpaulovic/aulas/CG/slides_novos/...Java_GLSL.pdf · Introdução à Opengl com Java OpenGL OpenGL Ambientep/escrevereexecutarprogramasgráficos

Introdução à Opengl com JavaOpenGL

Programando

Define o método de desenho

1 public void display(GLAutoDrawable drawable) {2 // Recupera o pipeline3 GL3 gl = glad.getGL().getGL3();45 // Limpa o frame buffer com a cor definida6 gl.glClear(GL3.GL_COLOR_BUFFER_BIT);78 // Desenha o buffer carregado em memória (triangulos)9 gl.glDrawArrays(GL3.GL_TRIANGLES, 0, nr_vertices);

1011 // Força execução das operações declaradas12 gl.glFlush();13 }

23 / 29

Page 24: Introdução à Opengl com Java - lcad.icmc.usp.brpaulovic/aulas/CG/slides_novos/...Java_GLSL.pdf · Introdução à Opengl com Java OpenGL OpenGL Ambientep/escrevereexecutarprogramasgráficos

Introdução à Opengl com JavaOpenGL

Programando

Libera recursos alocados

1 public void dispose(GLAutoDrawable glad) {2 // Recupera o pipeline3 GL3 gl = glad.getGL().getGL3();45 // Apaga o buffer6 gl.glBindBuffer(GL3.GL_ARRAY_BUFFER, 0);7 if (vbo[0] > 0) {8 gl.glDeleteBuffers(1, vbo, 0);9 vbo[0] = 0;

10 }11 }

24 / 29

Page 25: Introdução à Opengl com Java - lcad.icmc.usp.brpaulovic/aulas/CG/slides_novos/...Java_GLSL.pdf · Introdução à Opengl com Java OpenGL OpenGL Ambientep/escrevereexecutarprogramasgráficos

Introdução à Opengl com JavaOpenGL

Primitivas

Primitivas básicasPontos, linhas, poli-linhas, polígonos (GL_POINTS,GL_LINES, GL_POLYGON, GL_TRIANGLES, etc.)

Para descrever um objeto, uma lista de vértices é informada

1 private static final float[] TRIANGLE_VERTICES = new float[] {2 -0.5f, -0.5f, 0.0f,3 0.5f, -0.5f, 0.0f,4 0.0f, 0.5f, 0.0f,5 };

25 / 29

Page 26: Introdução à Opengl com Java - lcad.icmc.usp.brpaulovic/aulas/CG/slides_novos/...Java_GLSL.pdf · Introdução à Opengl com Java OpenGL OpenGL Ambientep/escrevereexecutarprogramasgráficos

Introdução à Opengl com JavaOpenGL

Outras Primitivas: Poli-linhas e Polígonos

Poli-linha: GL_LINE_STRIP, GL_LINE_LOOPseqüência de linhas conectadas... fechada ou não

Outras primitivasGL_QUADSGL_TRIANGLE_STRIPGL_TRIANGLE_FANGL_QUAD_STRIP

26 / 29

Page 27: Introdução à Opengl com Java - lcad.icmc.usp.brpaulovic/aulas/CG/slides_novos/...Java_GLSL.pdf · Introdução à Opengl com Java OpenGL OpenGL Ambientep/escrevereexecutarprogramasgráficos

Introdução à Opengl com JavaOpenGL

Outras Primitivas: Poli-linhas e Polígonos

27 / 29

Page 28: Introdução à Opengl com Java - lcad.icmc.usp.brpaulovic/aulas/CG/slides_novos/...Java_GLSL.pdf · Introdução à Opengl com Java OpenGL OpenGL Ambientep/escrevereexecutarprogramasgráficos

Introdução à Opengl com JavaInstalação

Sumário

1 OpenGL

2 Instalação

28 / 29

Page 29: Introdução à Opengl com Java - lcad.icmc.usp.brpaulovic/aulas/CG/slides_novos/...Java_GLSL.pdf · Introdução à Opengl com Java OpenGL OpenGL Ambientep/escrevereexecutarprogramasgráficos

Introdução à Opengl com JavaInstalação

Instalação

Git:Instale o Git:http://git-scm.com/book/en/Getting-Started-Installing-GitClone o repositório:git clone https://bitbucket.org/fatore/cg-2014

Maven:Instale o Maven:

Netbeans: nada a fazerEclipse: https://www.eclipse.org/m2e/download/Linha de comando: http://maven.apache.org/download.cgi

Instale as dependências:mvn install (dentro da pasta clonada)

29 / 29