Escolar Documentos
Profissional Documentos
Cultura Documentos
Função do Pipeline
● Gerar imagens bidimensionais dado um
conjunto de primitivas e uma câmera virtual
Descrição
das Pipeline Framebuffer
primitivas 3D
Abrindo o Pipeline
Abrindo o Pipeline – Outra visão
Shader Vertex e Fragment
● Partes programáveis do pipeline
– No modo antigo de usar o OpenGL, essa parte
era configurável
● Antes de usar, é necessário instanciar cada
shader
– Vertex → lida com o processamento de vertex,
antes de se montar as primitivas
– Fragment → lida com o processamento dos
fragmentos antes de se tornarem pixels
Processador de Vertex
Processador Vertex e Fragment
● São baseados em uma linguagem Script
chamada de GLSL
– OpenGL Shading Language
– Muito parecida com a linguagem C
– Para cada shader:
● Precisa ser instalada e compilada
– Programa final
● Precisa se ligado e montado e, posteriormente,
ativado
Trabalhando com o Shader
● Criar um objeto do tipo shader
– glCreateShader
– Para deletar → glDeleteShader
● Carregar o objeto com a fonte do programa
– glShaderSource
● Compilar o programa que está no objeto
– glCompileShader
● Verificar se tudo deu certo até aqui
– glGetShaderiv -> com a diretiva
GL_COMPILE_STATUS
Trabalhando com o Programa
● Criar um objeto do tipo programa
– glCreateProgram
– Para deletar, posteriormente, glDeleteProgram
● Montar um programa
– Necessário 2 shaders, pelo menos
● Um para o vertex e outro para o fragment
● GlAttachShader
Trabalhando com o Programa (2)
● Ligar tudo no programa
– glLinkProgram
● Verificar se não houve erros
– glGetProgramiv com a diretiva
GL_LINK_STATUS
● Usar o programa
– glUseProgram
– Somente a partir de agora o pipeline está
completo e utilizável
Em Código – Shader Vertex
const GLchar **vertex; // ponteiro para onde está localizado o buffer
// com o programa do vertex
glDisableVertexAttribArray(index);
(...)
return;
}
Sobre o Qualificador Uniform
● O valor desta variável só pode ser alterado
após um conjunto de primitivas terem sido
processados
– Pode ser assumido como um valor constante
para as primitivas
– Só pode ter o valor alterado após o termino do
processamento das chamadas do tipo
glDraw*
Sobre o Qualificador Uniform (2)
● Normalmente usado para passar valores
imutáveis em uma primitiva
– Exemplo: matrix de transformações
● Conexão entre o programa (CPU) e a variável
uniforme (shader) :
– glGetUniformLocation(program, name)
– Retorna uma referência para a localização do
uniform dentro do shader
Sobre o Qualificador Uniform (3)
● Para passar um valor:
– Família glUniform*
Exemplo
Transform = glGetUniformLocation(program, “transform”);
glUniformMatrix4fv(transform, 1, GL_FALSE, &trans[0][0]);
glClear(GL_COLOR_BUFFER_BIT);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glEnableVertexAttribArray(pos);
glVertexAttribPointer(pos, 3, GL_FLOAT, GL_FALSE, 0, 0);
glDrawArrays(GL_POINTS, 0, 1);
glDisableVertexAttribArray(pos);
glBindBuffer(GL_ARRAY_BUFFER, 0);
Nota sobre o arquivo math3d.h
● Ordem da multiplicação das matrizes
– Segue a notação vetor coluna
– Pós multiplicação
● A = A.X
● Assim, uma transformação: primeiro uma escala
(S), depois rotação (R) e por fim translação (T)
– Tmp = Tmp.I (I → identidade)
– Tmp = S.Tmp
– Tmp = R.Tmp
– Tmp = T.Tmp
Sobre a passagem do tempo
● Glfw permite obter o tempo transcorrido desde
o inicio do programa
– glfwGetTime()
– Permite calcular intervalos de tempo
● Auxilia na montagens de animações mais suaves
● Exemplo:
– Δx = v . Δt
– x += delta*2/4.f