Escolar Documentos
Profissional Documentos
Cultura Documentos
PROCESSAMENTO GRÁFICO
M
OUAT
R/ 2 0 1
272
Leandro Tonietto
INTRODUÇÃO
• SHADERS
• A programação com GLSL requer utilização de shaders.
• O shaders são "pequenos" programas escritos em GLSL para definir
estilo de desenho.
• São definidos em forma de texto, compilados e enviados para
processamento na GPU (Graphics Processing Unit).
• A GPU possui diversos/muitos núcleos de processamento, o que
permite computação de partes de software em paralelo, portanto,
muito mais eficiente do implementação tradicional de software,
que executa na CPU (geralmente, limitada entre 1 — 8 núcleos).
• Um programa de shader requer pelo menos 2 partes: vertex shader
e fragment shader.
• Pipeline gráfico:
• [programmable] Hardware pipeline (pipeline em
hardware, programável)
• Shaders podem ser construídos para sobrepor diversas
etapas/ações do pipeline.
• Fixed-function pipeline (pipeline em funções
predefinidas ou não programáveis)
• Ações executadas no pipeline já estão definidas e não
podem ser substituídas.
• A GPU está preparada para suportar hardware pipeline!
A S V A R I Á V E I S D E E N T R A D A S Ã O U T I L I Z A D A S “ P O R - V É R T I C E ” . P O R TA N T O , O S H A D E R É A S S O C I A D O C O M
C A D A V É R T I C E P R E S E N T E N O V E R T E X B U F F E R ( Á R E A D E M E M Ó R I A PA R A V É R T I C E S N O H A R D W A R E G R Á F I C O ) .
Mar-2022 Prof. Leandro Tonietto !8
SHADER LANGUAGE
• Fragment shader
• Após execução de vertex shader para cada vértice, começa a
etapa de processamento de fragmentos, ou seja, pedaço de
polígono do tamanho de um pixel executa um fragment
shader.
• Também um miniprograma em C com características próprias.
• Fragment shader
#version 410
uniform — indica variável global (acessível
uniform vec4 inColor; em todo programa), proveniente da CPU.
out vec4 fragColor;
out — primeira variável do tipo out é
void main () { interpretada como a variável a ser utilizada
fragColor = inColor; para receber uma cor RGBA (4 floats com
}; valore entre 0 e 1)
C O R E S R G B A VA R I A M D E 0 . 0 A 1 . 0 ( N Ã O D E 0 A 2 5 5 )
// incluir GLEW antes da GLFW para usar versões mais recentes da OpenGL
#include <GL/glew.h> /* include GLEW and new version of GL on Windows */
#include <GLFW/glfw3.h>
// incluir GLEW antes da GLFW para usar versões mais recentes da OpenGL
#include <GL/glew.h> /* include GLEW and new version of GL on Windows */
#include <GLFW/glfw3.h>
É INTERESSANTE DEIXAR LIBS NUM
Prof. Leandro Tonietto DIRETÓRIO COMUM DE BIBLIOTECAS !13
Mar-2022
PROGRAMAÇÃO OPENGLSL
A O P E N G L T R ATA V B O C O M O U M O B J E T O O G A R G A L O D O D E S E N H O E S TÁ N A C O M U N I C A Ç Ã O
IDENTIFICADO NA MEMÓRIA. TEMOS, ENTRE CPU E GPU. LOGO, O IDEAL É MANTER E
P O R TA N T O , U M A I D E N T I F I C A Ç Ã O Q U E V I N C U L A PA S S A R A M A I O R Q U A N T I D A D E P O S S Í V E L D E
C O M T O D O S O S V É R T I C E S D O A R R AY. TA M B É M É D A D O S PA R A A G P U
Mar-2022 U T I L I Z A D O PA R A N O R M A I S E T E X T U R A . Prof. Leandro Tonietto !14
PROGRAMAÇÃO OPENGLSL
GLfloat colors[]={1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f};
GLuint colorsVBO = 0;
glGenBuffers (1, &colorsVBO);
glBindBuffer (GL_ARRAY_BUFFER, colorsVBO);
glBufferData (GL_ARRAY_BUFFER, 9*sizeof (GLfloat), colors, GL_STATIC_DRAW);
O S S H A D E R S S Ã O E X E C U TA D O S E M PA R A L E L O , P O R TA N T O P O R T I P O
DE INFORMAÇÃO DE CADA VÉRTICE, POR ISTO É NECESSÁRIO QUE SE
T E N H A M E S M A C O N F I G U R A Ç Ã O PA R A T O D O S V É R T I C E S .
Mar-2022 Prof. Leandro Tonietto !15
PROGRAMAÇÃO OPENGLSL
• VAO - VERTEX ARRAY OBJECT
• Representa um conjunto de definições de atributos para vértice.
Funciona como uma memória (buffer) para mantermos
localização e demais atributos dos vértices.
PA R TA O U M O B J E T O O U G R U P O D E F A C E S , P O D E M O S T E R U M V B O PA R A
V É R T I C E S , O U T R O PA R A C O R E S ( O U T E X T U R A ) E O U T R O PA R A N O R M A I S .
Mar-2022 Prof. Leandro Tonietto !16
PROGRAMAÇÃO OPENGLSL
• VAO - VERTEX ARRAY OBJECT
GLuint vao = 0;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, vbo); // identifica vbo atual
// habilitado primeiro atributo do vbo (bind atual)
glEnableVertexAttribArray(0);
// associação do vbo atual com primeiro atributo
// 0 identifica que o primeiro atributo está sendo definido
// 3, GL_FLOAT identifica que dados são vec3 e estão a cada 3 float.
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
• Vertex Shaders
• Dados do programa
const char* vertex_shader =
"#version 410\n"
"layout(location=0) in vec3 vp;" vp: um vértice do VBO de vértices
"layout(location=1) in vec3 vc;" vc : um vértice de cor do VBO de cores
"out vec3 color;"
"void main () {" Associação manual de atributos
" color = vc;" com localizações (layout).
" gl_Position = vec4 (vp, 1.0);" A definição out vec3 color
"}";
indica que este parâmetro será
// in - definição de variável de entrada. passado para o próximo estágio.
// out - definição de variável de saída
// layout - vai associar cada variável com um respectivo atributo do VAO
// vec3 - a cada 3 valores um vértice a partir do VAO…
// gl_Position - variável de saída cujo nome é reservado e espera por vec4.
// vec4(vp, 1.0) - um vértice 4D. O 1.0 indica “não calcular perspectiva"
• Fragment Shaders
• Definições do programa.
glfwSwapBuffers (window);
}
!22
PROGRAMAÇÃO OPENGLSL
!23
PROGRAMAÇÃO OPENGLSL
!24
RECURSOS ADICIONAIS
• http://antongerdelan.net/teaching/3dprog1/maths_cheat_sheet.pdf
• Biblioteca de funções:
• http://antongerdelan.net/opengl/maths_funcs.h
• http://antongerdelan.net/opengl/maths_funcs.cpp
• https://www.opengl.org/sdk/docs/
• PDF com guia de referência para OpenGL 4
• Khronos group:
• https://www.khronos.org/opengl/wiki/
• Learn OpenGL:
• https://learnopengl.com