GLSL Programação de Shaders



Documentos relacionados
Computação Gráfica. GLSL Programação de Shaders

Computação Gráfica. GLSL - Programação de Shaders Iluminação

Computação Gráfica. GLSL - Programação de Shaders Iluminação

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

OpenGL Shading Language

Bruno Pereira Evangelista.

GPU and GLSL. Prof. João Madeiras Pereira 2008/2009

Animação e Visualização Tridimensional

Luiz Gonzaga da Silveira Jr

Computação Gráfica. Renderização em Tempo Real. Erivaldo Xavier de Lima Filho

Prof. Fernando V. Paulovich 16 de maio de SCC Computação Gráca

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

Utilização. de Shaders de efeitos realistas para jogos. Bruno Pereira Evangelista. Pontifícia Universidade Católica de Minas Gerais

Programação em GPU: Passado, Presente e Futuro

Introdução as Unidades de Processamento Gráfico (GPUs) Giovane Roslindo Kuhn

Modelos de Iluminação Métodos de surface-rendering

Introdução ao OpenGL 2.1 e GLSL 1.2

Universidade da Beira Interior Cursos: Matemática /Informática e Ensino da Informática

1. Evolução do OpenGL

Computação Gráfica. Daniela G. Trevisan.

Universidade de Brasília Instituto de Ciências Exatas Departamento de Ciência da Computação. Shader Não Fotorrealístico para Desenho de Mangás

Um Tutorial sobre GPUs

OpenGL. Uma Abordagem Prática e Objetiva. Marcelo Cohen Isabel Harb Manssour. Novatec Editora

Visão Geral de Hardwares de Renderização e Ferramentas de Avaliação. Carlos Eduardo Rodrigues

glslangel: Uma Ferramenta de Depuração para a Linguagem GLSL

Java. Marcio de Carvalho Victorino

INTRODUÇÃO À LINGUAGEM C++

Periféricos e Interfaces Ano lectivo 2003/2004 Docente: Ana Paula Costa. Aula Teórica 20

Computação Paralela. Desenvolvimento de Aplicações Paralelas João Luís Ferreira Sobral Departamento do Informática Universidade do Minho.

JSP - ORIENTADO A OBJETOS

Geração Procedural de Terrenos em GPU

GUIA DE FUNCIONAMENTO DA UNIDADE CURRICULAR

Introdução a Programação de Jogos

Informática para Ciências e Engenharias 2014/15. Teórica 5

Engenharia Informática Computação Gráfica

3 Classes e instanciação de objectos (em Java)

Classificação da imagem (ou reconhecimento de padrões): objectivos Métodos de reconhecimento de padrões

8. Síntese de Imagens: Cálculo de Cor

Cap. 7 Coloração (Shading) e Iluminação Global

Unidade IV: Ponteiros, Referências e Arrays

Algoritmos I Aula 13 Java: Tipos básicos, variáveis, atribuições e expressões

Faculdade de Ciências Universidade Agostinho Neto Departamento de Matemática e Engenharia Geográfica Ciências da Computação

TECNOLOGIAS DA INFORMAÇÃO E COMUNICAÇÃO. SISTEMAS DE GESTÃO DE BASE DE DADOS Microsoft Access TECNOLOGIAS DA INFORMAÇÃO E COMUNICAÇÃO

Linguagem de Programação I. Orientação a Objetos em Java

LICENCIATURA EM COMPUTAÇÃO PROCESSADOR TEGRA 2

Modelos de Iluminação e Reflexão

Hardware (Nível 0) Organização. Interface de Máquina (IM) Interface Interna de Microprogramação (IIMP)

CURSO DE PROGRAMAÇÃO EM JAVA

OpenGL. Alberto B. Raposo

Introdução a Java. Hélder Nunes

Iluminação e sombreamento

Linguagem C Tipos de Dados. void; escalares; sizeof Vectores; strings em C Estruturas Introdução ao pré-processador

Escrito por Vinícius Godoy de Mendonça Seg, 06 de Abril de :10 - Última atualização Seg, 06 de Abril de :10

Entrada e Saída. Interface entre periféricos, processador e memória. Fonte: Minho - Portugal 1

Frederico Damasceno Bortoloti. Adaptado de: Claudio Esperança Paulo Roma Cavalcanti

Linguagem de Programação JAVA. Técnico em Informática Professora Michelle Nery

Introdução à Programação. Armazenamento de Grande Quantidade de Informação Usando Vetores

Formação para o terceiro trimestre

Tabela de Símbolos. Análise Semântica A Tabela de Símbolos. Principais Operações. Estrutura da Tabela de Símbolos. Declarações 11/6/2008

Algoritmos e Programação Estruturada

Bacharelado em Ciência e Tecnologia Processamento da Informação. Equivalência Portugol Java. Linguagem Java

Algoritmos e Programação (Prática) Profa. Andreza Leite andreza.leite@univasf.edu.br

Instituto Tecnológico de Aeronáutica. Prof. Carlos Henrique Q. Forster Sala 121 IEC. Luiz Felipe Simões Hoffmann

Algoritmos e Programação

Universidade da Beira Interior. Sistemas Distribuídos

FCG2006 Prova sobre OpenGL e Rastreamento de Raios

Desmistificando Shaders em XNA 4.0

Pipeline Gráfico Cluter & Durand, MIT

Introdução Programando com OpenGL Exemplos. O que é OpenGL? [1]

Imagem e Gráficos. vetorial ou raster?

Pesquisa: localização de um Registo num Ficheiro (para aceder ao registo: ler/alterar informação) R. P. António Viera, 23. R. Carlos Seixas, 9, 6º

Análise de complexidade

Introdução à Engenharia ENG1000

Tipos de Dados, Tipos Abstratos de Dados Estruturas de Dados

Apontamentos de Computação Gráfica

Pandora s Box Graphics Engine - Uma Engine Gráfica com Aplicação em Visualização de Campos Tensoriais

Pesquisa e organização de informação

Modelação 3D. Sumário COMPUTAÇÃO GRÁFICA E INTERFACES. Introdução. Introdução. Carlos Carreto

INF2610 Renderização em Tempo Real. Waldemar Celes. 23 de Março de 2017

Programação WEB I Estruturas de controle e repetição

Universidade da Beira Interior Cursos: Engenharia Informática, Matemática /Informática e Ensino da Informática

Programação científica C++

Introdução a Computação

Formação em game programming: 01 - Introdução à programação

Curso Adonai QUESTÕES Disciplina Linguagem JAVA

OpenGL 3.* INF Rendering em Tempo Real. Waldemar Celes Departamento de Informática, PUC-Rio

Prof. Fernando V. Paulovich 3 de maio de SCC Computação Gráca

Identificação das variáveis de entrada; resultados/variáveis de saída e método ou solução. (procedimentos e funções)

LP II Estrutura de Dados. Introdução e Linguagem C. Prof. José Honorato F. Nunes honorato.nunes@ifbaiano.bonfim.edu.br

Engenharia de Software

Modelos de Iluminação Locais

Programação de Sistemas

Prof. Esp. Adriano Carvalho

Paulo Sérgio Rodrigues. Exercícios de Laboratório

CÓD Webcam Magnética MANUAL DO USUÁRIO

Orientação a Objetos com Java

Tipo de Dados em Linguagem C

Ao longo do presente capítulo será apresentada uma descrição introdutória da tecnologia FPGA e dos módulos básicos que a constitui.

Computação Gráfica. Texturas

Transcrição:

Universidade do Minho Mestrado em Informática UCE - Computação Gráfica GLSL Programação de Shaders António Ramires Fernandes GLSL Sumário Evolução do Hardware Gráfico PCs Pipeline Gráfico Fixo Pipeline Gráfico Programável Processador de Vértices Processador de Fragmentos GLSL Aplicação OpenGL Shader I/O Sintaxe Exemplos GLSL vs. Cg vs. HLSL vs. Renderman 2 1

GLSL Sumário Evolução do Hardware Gráfico PCs Pipeline Gráfico Fixo Pipeline Gráfico Programável Processador de Vértices Processador de Fragmentos GLSL Aplicação OpenGL Shader I/O Sintaxe Exemplos GLSL vs. Cg vs. HLSL vs. Renderman 3 Evolução do Hardware Gráfico PCs Controladores VGA (Video Graphics Array) Introduzido em 1987 pela IBM Todo o esforço computacional é realizado pelo CPU. O VGA é utilizado somente como frame buffer. 4 2

Evolução do Hardware Gráfico PCs GPU (Graphics Processing Unit) Termo introduzido pela nvidia em 1990 quando o termo VGA já não descrevia correctamente o hardware gráfico. 5 Evolução do Hardware Gráfico PCs 1ª Geração de GPUs até 1998 (nvidia TNT2, ATI Rage) Interpolação: capacidade para calcular os pixels a partir dos vértices de um triângulo e aplicar texturas. 6 3

Evolução do Hardware Gráfico PCs 2ª Geração de GPUs 1999-2000 (GeForce 256, GF 2, Radeon 7500) Transformação de Vértices Cálculo de Iluminação (por vértice) 7 Evolução do Hardware Gráfico PCs 3ª Geração de GPUs 2001 (GeForce 3 e 4, Radeon 8500) Programação ao nível dos vértices 8 4

Evolução do Hardware Gráfico PCs 4ª Geração de GPUs 2002-... (GeForce FX, ATI Radeon 9700) Programação ao nível do pixel. 9 Evolução do Hardware Gráfico PCs Actualmente... 3 shaders: Vertex Pixel Geometry 10 5

GLSL Sumário Evolução do Hardware Gráfico PCs Pipeline Gráfico Fixo Pipeline Gráfico Programável Processador de Vértices Processador de Fragmentos GLSL Aplicação OpenGL Shader I/O Sintaxe Exemplos GLSL vs. Cg vs. HLSL vs. Renderman 11 Pipeline Gráfico Vertex Connectivity Vertices Vertex Transformation Transformed Vertices Primitive Assembly and Rasterization Pixel Positions Fragments Pixel Updates Raster Operations Colored Fragments Fragment Texturing and Coloring 12 6

Pipeline Gráfico Vertex Transformation Dados de entrada: Vértices com as coordenadas tal como especificadas na aplicação, e outros atributos como normais, cores, coordenadas de textura. Estado do OpenGL Operações: Transformação do vértice de acordo com as matrizes ModelView e Projection; Transformação de normais (por exemplo: normalização); Iluminação do vértice; Geração/Transformação das coordenadas de textura. 13 Pipeline Gráfico Primitive Assembly Dados de entrada: Vértices transformados Informação de conectividade (GL_TRIANGLE, GL_QUAD,...) Operações: Construção das primitivas gráficas com os vértices já transformados Clipping contra view frustum Back face culling Early Z culling 14 7

Pipeline Gráfico Rasterization Dados de Entrada Primitivas construídas na fase anterior Operações determina o conjunto de pixels cobertos por uma primitiva geométrica Para cada pixel é calculado o seu conjunto de atributos por interpolação dos atributos dos vértices da primitiva Resultado: conjunto de fragmentos 15 Pipeline Gráfico Rasterization (2) Pixel vs. Fragment Pixel representa o conteúdo do frame buffer numa determinada posição: cor, profundidade, localização,... Fragmento: pixel potencial + atributos. 16 8

Pipeline Gráfico Texturização e Cor Os dados de entrada desta fase são os valores interpolados na fase anterior para cada fragmento Nesta fase aplicam-se as texturas e calcula-se a cor do fragmento. 17 Pipeline Gráfico Raster Operations Dados de entrada Localização do pixel fragmentos processados (cor e profundidade) Operações Teste de scissor, alpha, stencil, profundidade (sem early Z cull) Operações de blending: combina a cor do fragmento com a cor do pixel existente no color buffer 18 9

Pipeline Gráfico Resumo Visual LINE( ); TRIANGLE( ) Vertices Geom. Ops. Transf. Vertices Connectivity information Assembly Colored Fragments Fragments Raster Interpolation 19 GLSL Sumário Evolução do Hardware Gráfico PCs Pipeline Gráfico Fixo Pipeline Gráfico Programável Processador de Vértices Processador de Fragmentos GLSL Aplicação OpenGL Shader I/O Sintaxe Exemplos GLSL vs. Cg vs. HLSL vs. Renderman 20 10

Pipeline Programável Vertex Connectivity Vertices Vertex Transformation Transformed Vertices Primitive Assembly and Rasterization Pixel Positions Fragments Pixel Updates Raster Operations Colored Fragments Fragment Texturing and Coloring 21 Pipeline Programável Vertex Connectivity Vertices Vertex Processor Transformed Vertices Primitive Assembly and Rasterization Pixel Positions Fragments Pixel Updates Raster Operations Colored Fragments Fragment Processor 22 11

Processador de Vértices Unidade programável que opera em vértices e nos dados associados (normais, coordenadas de textura,...) Esta unidade é responsável por operações como por exemplo: Transformação de vértices (matrizes modelview e projection) Transformação de normais e sua normalização Geração de coordenadas de textura Transformação de coordenadas de textura Iluminação (por vértice)... 23 Processador de Vértices Programas que correm nesta unidade são vertex shaders. Um vertex shader substitui toda a funcionalidade do pipeline fixo...... logo tem de implementar todas as operações desejadas......i.e. não é possível ter um vertex shader para transformar as coordenadas do vértice e ter a iluminação calculada pela componente fixa. 24 12

Processador de Vértices Este processador opera num vértice de cada vez, isoladamente, e sem conhecimento dos restantes vértices. Um vertex shader deve obrigatoriamente calcular uma posição e, opcionalmente, cor e outros atributos. O processador tem acesso ao estado do OpenGL actual, incluindo algumas variáveis pré-calculadas pelo próprio OpenGL. O processador de vértices pode aceder a texturas (no hardware mais recente). 25 Processador de Fragmentos Unidade programável que opera sobre fragmentos. Esta unidade é responsável por operações como por exemplo: Operações sobre valores interpolados (cores, normais, coordenadas de textura, e outros atributos) Acesso a texturas Aplicação de texturas Cálculo de Nevoeiro Cálculo da cor 26 13

Processador de Fragmentos Programas que correm nesta unidade são fragment shaders. Um fragment shader substitui toda a funcionalidade do pipeline fixo...... logo tem de implementar todas as operações desejadas......i.e. não é possível ter um fragment shader para aceder a texturas e ter o nevoeiro calculado pela componente fixa. 27 Processador de Fragmentos Este processador opera num fragmento de cada vez, isoladamente, e sem conhecimento dos fragmentos vizinhos. Um fragment shader pode calcular cor e/ou profundidade ou alternativamente "descartar" o fragmento. O processador tem acesso ao estado do OpenGL actual, assim como algumas variáveis pré-calculadas pelo próprio OpenGL. O fragment shader não pode alterar a coordenada (x,y) do pixel a escrever. O fragment shader não tem acesso ao framebuffer. 28 14

GLSL Sumário Evolução do Hardware Gráfico PCs Pipeline Gráfico Fixo Pipeline Gráfico Programável Processador de Vértices Processador de Fragmentos GLSL Aplicação OpenGL Shader I/O Sintaxe Exemplos GLSL vs. Cg vs. HLSL vs. Renderman 29 GLSL - Aplicação OpenGL Uma aplicação pode substituir a funcionalidade fixa relativamente aos vértices e/ou aos fragmentos, não sendo obrigada a implementar os dois. Para cada shader é necessário proceder a uma compilação. Depois de compilados os shaders são incorporados num programa que depois será linkado. 30 15

OpenGL Setup GLSL - Aplicação OpenGL Program Vertex Shader glcreateshader glshadersource glcompileshader glcreateprogram glattachshader glattachshader gllinkprogram Fragment Shader glcreateshader glshadersource glcompileshader gluseprogram 31 Notas: GLSL - Aplicação OpenGL Um programa pode incluir somente um tipo de shader, por exemplo só incluir vertex shader. Nestes casos para o shader omisso será utilizada a funcionalidade fixa. Depois de um programa estar "linkado", pode-se alterar o código dos shaders, e até compilá-los novamente, sem que isso altere o shader. Se um programa estiver a ser utilizado, ao realizar a operação link de novo, substitui-se o programa actual (caso a operação de link tenha sucesso). 32 16

GLSL - Aplicação OpenGL Código para criação de shaders GLuint v,f,p; v = glcreateshader (GL_VERTEX_SHADER); f = glcreateshader (GL_FRAGMENT_SHADER); vs = textfileread("stripes.vert"); fs = textfileread("stripes.frag"); glshadersource (v, 1, &vs, NULL); glshadersource (f, 1, &fs, NULL); glcompileshader (v); glcompileshader (f); 33 GLSL - Aplicação OpenGL Construção do programa... p = glcreateprogram (); glattachshader(p,v); glattachshader(p,f); gllinkprogram (p); gluseprogram (p); 34 17

GLSL - Aplicação OpenGL InfoLog A cada shader ou programa está associado um log, com mensagens sobre o processo de compilação ou link, respectivamente. Através deste log, para alem de ser possível detectar se as operações ocorreram sem erros, ainda pode ser dada informação relativamente à capacidade do hardware para executar o shader. 35 Comunicação Aplicação -> Shader Os shaders podem ser parametrizados com valores a receber da aplicação. Estes parâmetros são de leitura para os shaders, i.e. os shaders não podem alterar o seu valor. Existem duas categorias para estes valores: Uniform Attribute 36 18

Comunicação Aplicação -> Shader Parâmetros Uniform São parâmetros que não variam ao longo da primitiva, ou seja, não devem ser modificados entre glbegin e glend. Ex: Posição da luz, índice de refracção, etc... Acessíveis no vertex e fragment shader 37 Comunicação Aplicação -> Shader Parâmetros Attribute São tipicamente valores associados a vértices, tal como acontece com normais, ou coordenadas de textura. Ex: A cada vértice pode estar associada uma tangente. Só são acessíveis no vertex shader! 38 19

Comunicação Aplicação -> Shader Parâmetros Attribute: Exemplo glbegin(gl_triangle_strip); glvertexattrib1f(atrito,1.0); glvertex3f(1,2,3); glvertexattrib1f(atrito,2.0); glvertex3f(4,5,6);... glend(); 39 Comunicação Aplicação -> Shader Parâmetros Attribute: Vertex Arrays void setup() { glvertexpointer(3, GL_FLOAT, 0, verts); glcolorpointer (3, GL_FLOAT, 0, colors); glvertexattribpointer (VELOCIDADE, 3, GL_FLOAT, GL_FALSE, 0, velocities); glenableclientstate (GL_VERTEX_ARRAY); glenableclientstate (GL_COLOR_ARRAY); glenablevertexattribarray (VELOCIDADES); } 40 20

Comunicação Vertex -> Fragment Variáveis varying Vertex Shader declaração, ex: varying float intensidade; atribui um valor à variável (i 1,i 2,i 3 ) Fragment shader i 1 i f i 2 declaração idêntica ao vertex shader recebe valor interpolado (i f ) variável só de leitura i 3 41 Vertex Shader I/O Estado OpenGL atributos variáveis uniform Utilizador atributos (tangente) variáveis uniform (posição da luz) Texturas Vertex Processor glposition Variáveis pré-definidas cor coordenadas de textura Variáveis para interpolação Utilizador (varying) intensidade etc... 42 21

Fragment Shader I/O Estado OpenGL variáveis interpoladas variáveis uniform Utilizador variáveis interpoladas (intensidade) variáveis uniform (posição da luz) Texturas Fragment Processor gl_fragcolor gl_fragdepth gl_fragdata[] 43 GLSL - Tipos de Dados Escalares float float a,b=2.0; int int c,d=1; bool bool e,f= true; Vectores vec{2,3,4} vec3 v = vec3(1,2,3); ivec{2,3,4} vec3 a = v, b = vec3(4); bvec{2,3,4} Matrizes mat{2,3,4} mat3 m = mat3(1.0); // matriz identidade mat3 n = mat3(v,a,b); 44 22

GLSL - Tipos de Dados Selectores para Vectores x,y,z,w r,g,b,a s,t,p,q vec3 v = vec3(1.0,2.0,3.0); float f = v.x; // f = 1.0 float y = v[1]; // y = 2.0 vec3 u = v.zyx // u = (3.0,2.0,1.0) Selectores para Matrizes mat2 m = mat2(1.0); // m = matriz identidade vec2 v = m[0]; // v = (1.0,0.0) primeira coluna float f = m[0][0] // f = 1.0 45 GLSL - Tipos de Dados Estructuras Definição struct luz { vec3 pos; vec3 cor; }; Declaração e inicialização Utilização luz luz1; luz luz2 = luz(vec3(1.0,2.0,3.0),vec3(1.0,0.0,0.0)); luz1.pos = vec3(1.0,2.0,3.0); 46 23

GLSL - Tipos de Dados Arrays vec3 pontos[5]; vec4 vertices[]; No caso de um array não definir a sua dimensão, o compilador procura o índice mais elevado no shader. Neste caso os índices têm de ser constantes. 47 GLSL - Tipos de Dados Casting Realizado através de construtores float a = 3.0; int b = int(a); Constantes const int texturas = 10; 48 24

GLSL - Funções Semelhante ao C vec3 f() {... } Tipos dos parâmetros in out inout vec3 f(in vec3 a, out vec3 b) {... } 49 GLSL - Controle de fluxo Instruções iguais ao C if else for while do while 50 25

GLSL - Exemplos Olá Mundo Cor Toon Shader 51 GLSL Olá Mundo A funcionalidade fixa, ff, determina que um vértice deve ser transformado através da seguinte operação: Vres = Matriz PROJECTION * Matriz MODELVIEW * vertex O vertex shader recebe os vértices através da variável: attribute vec4 gl_vertex O vertex shader deve transformar o vértice recebido e escrever o resultado em: vec4 gl_position; Variáveis de estado do OpenGL acessiveis: uniform mat4 gl_modelviewmatrix; uniform mat4 gl_projectionmatrix; uniform mat4 gl_modelviewprojectionmatrix; 52 26

GLSL Olá Mundo Para obter uma funcionalidade semelhante à ff, o vertex shader deverá então calcular gl_position utilizando uma das seguintes opções: gl_position = gl_projectionmatrix * (gl_modelviewmatrix * gl_vertex); gl_position = gl_modelviewprojectionmatrix * gl_vertex; gl_position = ftransform(); Esta última alternativa garante a funcionalidade idêntica à ff. 53 GLSL Olá Mundo Vertex Shader void main (void) { } gl_position = ftransform(); 54 27

GLSL Olá Mundo O Fragment shader é responsável por escrever a variável gl_fragcolor. void main(void) { gl_fragcolor = vec4(1,0,0,1); } 55 GLSL - Cor Código OpenGL glbegin(gl_quads); glcolor3f(1,0,0); glvertex3f(-1,-1,0); glcolor3f(0,1,0); glvertex3f(1,-1,0); glcolor3f(0,0,1); glvertex3f(1,1,0); glcolor3f(1,1,0); glvertex3f(-1,1,0); glend(); 56 28

GLSL - Cor Variáveis de estado acessiveis nos shaders: attribute vec4 gl_color; // só vertex shader struct gl_materialparameters { vec4 emission; // Ecm vec4 ambient; // Acm vec4 diffuse; // Dcm vec4 specular; // Scm float shininess; // Srm }; uniform gl_materialparameters gl_frontmaterial; uniform gl_materialparameters gl_backmaterial; 57 GLSL - Cor Vertex Shader lê cor especificada na aplicação (glcolor) em: attribute vec4 gl_color; Vertex Shader escreve em: varying vec4 gl_frontcolor; varying vec4 gl_backcolor; Fragment Shader lê cor interpolada em: varying vec4 gl_color; Nota: não é a mesma variável que está acessível no vertex shader. Esta variável é interpolada pelo OpenGL a partir das variáveis gl_frontcolor ou gl_backcolor. Fragment Shader escreve em: vec4 gl_fragcolor 58 29

GLSL - Cor Exemplo // Aplicação OpenGL glbegin(gl_quads); glcolor3f(1,0,0); glvertex3f(-1,-1,0); glcolor3f(0,1,0); glvertex3f(1,-1,0); glcolor3f(0,0,1); glvertex3f(1,1,0); glcolor3f(1,1,0); glvertex3f(-1,1,0); glend(); // Vertex Shader void main(void) { } // Fragment Shader gl_frontcolor = gl_color; gl_position = ftransform(); void main() { gl_fragcolor = gl_color; } 59 GLSL - Toon Shading O efeito Cartoon pode ser aproximado de uma forma simples criando um shader com um número limitado de cores. Pretende-se preservar a contribuição especular. Cor escura para zonas fronteira Número reduzido de cores para os restantes casos 60 30

GLSL - Toon Shading Cálculo da cor baseado na intensidade reflectida Número reduzido de cores => discretização Maior intensidade => cor mais clara 61 GLSL Toon Shading Reflexão difusa (Lambert) A intensidade reflectida de um objecto é proporcional ao ângulo entre a direcção da luz e a normal do objecto. Intensidade da luz I = I p * K d * cos (θ) N θ L coeficiente de reflexão difusa 62 31

GLSL Toon Shading Algoritmo if (cos(θ) > 0.98) cor = (0.75, 0.75, 1.0) else if (cos(θ) > 0.65 cor = (0.0, 0.25, 1.0) else if (cos(θ) > 0.25) cor = (0.0, 0.2, 0.6) else cor = (0.2, 0.2, 0.2) 63 GLSL Toon Shading Vertex Shader Transforma vértices e normais (espaço câmara) // Vertex Shader varying vec3 normal; void main(void) { } normal = gl_normalmatrix * gl_normal; normal = normalize(normal); gl_position = ftransform(); 64 32

GLSL Toon Shading varying vec3 normal; Fragment Shader normaliza normal calcula cosseno aplica algoritmo vec4 c0 = (0.2, 0.2, 0.2, 1.0);... vec4 c3 = (0.75, 0.75, 0.75, 1.0); void main() { vec3 n = normalize(normal); co = dot(vec3(0,0,1), n); if (co > 0.98) color = c3 else if (co > 0.65) color = c2; else if (co > 0.25) color = c1; else color = c0; } gl_fragcolor = color; 65 GLSL - Toon Shading varying vec3 normal; Utilização de variáveis Uniform cores e limites uniform vec4 c0,c1,c2,c3; uniform float t0,t1,t2; void main() { vec3 n = normalize(normal); co = dot(vec3(0,0,1), n); if (co > t2) color = c3 else if (co > t1) color = c2; else if (co > t0) color = c1; else color = c0; } gl_fragcolor = color; 66 33

GLSL Mais Exemplos Luzes com shaders ff 67 GLSL Mais Exemplos 68 34

GLSL Mais Exemplos 69 GLSL Sumário Evolução do Hardware Gráfico PCs Pipeline Gráfico Fixo Pipeline Gráfico Programável Processador de Vértices Processador de Fragmentos GLSL Aplicação OpenGL Shader I/O Sintaxe Exemplos GLSL vs. Cg vs. HLSL vs. Renderman 70 35

GLSL vs. HLSL vs. Cg vs. Renderman GLSL vs. HLSL vs. Cg Sintaxe muito semelhante (baseado no C) Idêntica divisão de tarefas entre vértices e pixels Compilação é diferente GLSL -> runtime, Driver HLSL e Cg -> pré-compilação, biblioteca exterior ao driver 71 GLSL vs. HLSL vs. Cg vs. Renderman GLSL vs. HLSL vs. Cg Plataformas OpenGL => GLSL e Cg D3D => HLSL e Cg Variáveis varying GLSL => nome a definir pelo programador HLSL e Cg => slots pré-definidos (TEXCOORD[0],...) 72 36

GLSL vs. HLSL vs. Cg vs. Renderman Renderman Lançamento (muito) anterior (1988) GLSL 2001 HLSL 2002 Cg 2002 Objectivo: Qualidade de Imagem (vs. Real-time) Conceitos com varying e uniform foram herdados pelas novas linguagens 73 Renderman GLSL vs. HLSL vs. Cg vs. Renderman Definição conceptual de shaders Displacement shaders Surface shaders Light shaders Volume shaders Image shaders GLSL, HLSL, Cg Definição com objectivo de mapear no hardware actual Vertex shader Fragment shader 74 37

GLSL - Bibliografia, Ferramentas "OpenGL Shading Language", Randi Rost, Addison-Wesley. OpenGL Shading Language Spec, www.opengl.org/documentation/glsl OpenGL 2.0 Spec, www.opengl.org/documentation/current_version/ RenderMonkey www.ati.com/developer Shader Designer www.typhoonlabs.com FXComposer developer.nvidia.com ShaderGen developer.3dlabs.com 75 38