![Page 1: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/1.jpg)
Shaders
Bruno José DembogurskiInstituto de Computação - UFF
![Page 2: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/2.jpg)
Agenda
Introdução Shaders Tipos de dados Input/Output Funções e Estruturas de controle Exemplos e Códigos Conclusões
![Page 3: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/3.jpg)
Introdução
Poder da computação gráfica hoje GPGPU Por que?
![Page 4: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/4.jpg)
Introdução
Crescimento absurdo no poder de processamento
O hardware é relativamente barato Flexibilidade Como?
![Page 5: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/5.jpg)
Introdução
JOGOS ! Industria exige cada vez mais poder
de processamento Gera bilhões de dólares por ano Incentiva cada vez mais o
desenvolvimento do hardware E acaba por baixar o custo
![Page 6: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/6.jpg)
Introdução
Desde 2000 o poder aplicado ao processamento de vértices e fragmentos tem crescido a uma taxa absurda
![Page 7: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/7.jpg)
Introdução GPUs são rápidas...
3.0 GHz Intel Core2 Duo (WoodCrest Xeon 5160) Poder: 48 GFLOPS – pico Memory Bandwidth: 21GB/s – pico Preço: 874 dólares
NVIDIA GeForce 8800GTX: Poder: 330 GFLOPS Memory Bandwidth: 55.2 GB/s Preço: 599 dólares
![Page 8: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/8.jpg)
Introdução
“NVIDIA Tesla Computing Solutions now with the world's first teraflop parallel processor “
![Page 9: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/9.jpg)
Introdução
![Page 10: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/10.jpg)
Introdução
Versão simplificada da pipeline
GPUCPU
ApplicationApplication Transform& Light
Transform& Light RasterizeRasterize ShadeShade Video
Memory(Textures)
VideoMemory
(Textures)
Xfo
rmed, Lit V
ertice
s (2
D)
Graphics State
Render-to-texture
AssemblePrimitivesAssemblePrimitives
Vertice
s (3
D)
Scre
ensp
ace
triangle
s (2
D)
Fra
gm
ents (p
re-p
ixels)
Fin
al P
ixels (C
olo
r, D
epth
)
![Page 11: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/11.jpg)
Introdução
Processador deVértices Programável
GPU
Transform& Light
Transform& Light
CPU
ApplicationApplication RasterizeRasterize ShadeShade VideoMemory
(Textures)
VideoMemory
(Textures)
Xfo
rmed, Lit V
ertice
s (2
D)
Graphics State
Render-to-texture
AssemblePrimitivesAssemblePrimitives
Vertice
s (3
D)
Scre
ensp
ace
triangle
s (2
D)
Fra
gm
ents (p
re-p
ixels)
Fin
al P
ixels (C
olo
r, D
epth
)
FragmentProcessorFragmentProcessor
VertexProcessor
VertexProcessor
Processador defragmentosProgramável
![Page 12: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/12.jpg)
Introdução
Geração de geometria programável
GPUCPU
ApplicationApplication VertexProcessor
VertexProcessor RasterizeRasterize Fragment
ProcessorFragmentProcessor
VideoMemory
(Textures)
VideoMemory
(Textures)
Xfo
rmed, Lit V
ertice
s (2
D)
Graphics State
Render-to-texture
Vertice
s (3
D)
Scre
ensp
ace
triangle
s (2
D)
Fra
gm
ents (p
re-p
ixels)
Fin
al P
ixels (C
olo
r, D
epth
)
AssemblePrimitivesAssemblePrimitives
GeometryProcessorGeometryProcessor
Acesso a memória mais flexivel
![Page 13: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/13.jpg)
Shaders
Shaders são programas que executam em determinadas etapas da pipeline
Não são aplicações stand-alone Necessitam de uma aplicação que
utilize um API (OpenGL ou Direct3D)
![Page 14: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/14.jpg)
Shaders
No caso: Vertex shader – Vertex Processor Fragment shader – Fragment Processor Geometry shader – Geometry Processor
![Page 15: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/15.jpg)
Shaders
Vertex Processor Transforma do espaço de mundo para o
espaço de tela Calcula iluminação per-vertex
![Page 16: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/16.jpg)
Shaders
Geometry Processor Como os vértices se conectam para
formar a geometria Operações por primitiva
![Page 17: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/17.jpg)
Shaders
Fragment Processor Calcula a cor de cada pixel Obtém cores de texturas
![Page 18: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/18.jpg)
Shaders
Hoje temos que a programação de shaders é feita em linguagens de alto nível
No estilo de c/c++ As principais que temos hoje:
GLSL – OpenGL Shader Language HLSL – High Level Shader Language Cg – C for Graphics
![Page 19: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/19.jpg)
Shaders
Temos algumas ferramentas que servem tanto para criação e edição de shaders: NVIDIA FX Composer 2.5 RenderMonkey ATI
![Page 20: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/20.jpg)
Shaders
![Page 21: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/21.jpg)
Shaders
![Page 22: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/22.jpg)
Shaders
![Page 23: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/23.jpg)
Tipos de dados
Estruturas bem intuitivas Vetores:
vec2, vec3 e vec4 – floating point ivec2, ivec3 e ivec4 – interger bvec2, bvec3 e bvec4 – boolean
Matrizes mat2, mat3 e mat4 – floating point
![Page 24: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/24.jpg)
Tipos de dados
Texturas Sampler1D, Sampler2D, Sampler3D - texturas 1D, 2D e 3D SamplerCube – Cube map textures Sampler1Dshadow, Sampler2DShadow – mapa de profundidade 1D e 2D
![Page 25: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/25.jpg)
Input/Output
Existem 3 tipos de input em um shader: Uniforms Varyings Attributes
![Page 26: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/26.jpg)
Input/Output
Uniforms Não mudam durante o rendering Ex: Posição da luz ou cor da luz Esta presente em todos os tipos de
shader Varyings
Usando para passar dados do vertex shader para o fragment shader ou geometry shader
![Page 27: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/27.jpg)
Input/Output Varyings
São read-only no fragment e geometry shader mas read/write no vertex shader
Para usar deve-se declarar a mesma varying em todos os programas
Attributes Estão presentes apenas nos Vertex
shaders São valores de input mudam em cada
vertice
![Page 28: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/28.jpg)
Input/Output
Attributes Ex: Posição do vértice ou normais São apenas read-only
![Page 29: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/29.jpg)
Input/Output
Exemplos de Input Attibutes no vertex shader gl_Vertex – vetor 4D, posição do vértice gl_Normal – vetor 3D, Normal do vértice gl_Color – vetor 4D, cor do vértice gl_MultiTexCoordX – vetor 4D,
coordenada de textura na unit X
Existem vários outros atributos
![Page 30: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/30.jpg)
Input/Output
Exemplos de Uniforms gl_ModelViewMatrix gl_ModelViewProjectionMatrix gl_NormalMatrix
![Page 31: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/31.jpg)
Input/Output
Exemplos de Varyings gl_FrontColor - vetor 4D com a cor frontal
das primitivas gl_BackColor – vetor 4D com a cor de
trás das primitivas gl_TexCoord[N] – vetor 4D representando
a n-ésima coordenada de textura
![Page 32: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/32.jpg)
Input/Output
Exemplos de output: gl_Position – vetor 4D representando a
posição final do vértice gl_FragColor – vetor 4D representando a
cor final que será escrita no frame buffer gl_FragDepth – float representando o
depth que será escrito do depth buffer
![Page 33: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/33.jpg)
Input/Output
Também é possível definir attributes, Uniforms e varyings
Ex: Passar um vetor tangente 3D por todos os vértices da sua aplicação
É possível especificar o atributo “tangente” attribute vec3 tangente;
![Page 34: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/34.jpg)
Input/Output
Alguns outros exemplos: uniform sampler2D my_color_texture; varying vec3 vertex_to_light_vector; varying vec3 vertex_to_eye_vector; attribute vec3 binormal;
![Page 35: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/35.jpg)
Funções e Estruturas de Controle
Similar a linguagem C Suporta estruturas de loop e decisão
If/else For Do/while Break Continue
![Page 36: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/36.jpg)
Funções e Estruturas de Controle
Possui funções como: Seno (sin) Cosseno (cos) Tangente (tan) Potencia (pow) Logaritmo (log) Logaritmo (log2) Raiz (sqrt)
![Page 37: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/37.jpg)
Exemplos e Códigos
Antes de criar os shaders mesmo temo que definir uma função (no caso de GLSL) para carregar e enviar os shaders para o hardware
Esta função já é bem difundida e fácil de encontrar e manipular
![Page 38: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/38.jpg)
Exemplos e Códigosvoid setShaders()
char *vs = NULL,*fs = NULL,*fs2 = NULL;
v = glCreateShader(GL_VERTEX_SHADER);f = glCreateShader(GL_FRAGMENT_SHADER);
vs = textFileRead("minimal.vert");fs = textFileRead("minimal.frag");
const char * vv = vs;const char * ff = fs;
glShaderSource(v, 1, &vv,NULL);glShaderSource(f, 1, &ff,NULL);
free(vs);free(fs);
glCompileShader(v);glCompileShader(f);
p = glCreateProgram();glAttachShader(p,v);glAttachShader(p,f);
glLinkProgram(p);glUseProgram(p);
![Page 39: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/39.jpg)
Exemplos e Códigos
O código shader mais simples (Estilo Hello World) Vertex Shader
void main() {
gl_Position = ftransform();
}
![Page 40: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/40.jpg)
Exemplos e Códigos
O código shader mais simples (Estilo Hello World) Fragment Shader
void main() {
gl_FragColor = vec4(0.4,0.4,0.8,1.0);
}
![Page 41: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/41.jpg)
Exemplos e Códigos
Resultado:
![Page 42: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/42.jpg)
Exemplos e Códigos
Toon shading Vertex shader
varying vec3 normal;
void main(){
normal = gl_Normal; gl_Position = ftransform();}
![Page 43: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/43.jpg)
Exemplos e Códigos Toon shading
Fragment shaderuniform vec3 lightDir;varying vec3 normal;
void main(){ float intensity;
vec4 color; intensity = dot(lightDir,normalize(normal));
if (intensity > 0.95) color = vec4(1.0,0.5,0.5,1.0);
else if (intensity > 0.5) color = vec4(0.6,0.3,0.3,1.0);
else if (intensity > 0.25) color = vec4(0.4,0.2,0.2,1.0);
else color = vec4(0.2,0.1,0.1,1.0);
gl_FragColor = color; }
![Page 44: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/44.jpg)
Exemplos e Códigos
Toon shading
![Page 45: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/45.jpg)
Exemplos e Códigos Mexendo na geometria
Shader achatar o modelo 3D, ou seja, z = 0void main(void)
{ vec4 v = vec4(gl_Vertex); v.z = 0.0;
gl_Position = gl_ModelViewProjectionMatrix * v;
}
![Page 46: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/46.jpg)
Exemplos e Códigos
Resultados
![Page 47: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/47.jpg)
Exemplos e Códigos Distorcendo ainda mais a geometria
void main(void) {
vec4 v = vec4(gl_Vertex); v.z = sin(5.0*v.x )*0.25; gl_Position = gl_ModelViewProjectionMatrix * v;
}
![Page 48: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/48.jpg)
Exemplos e Códigos
Resultados
![Page 49: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/49.jpg)
Exemplos e Códigos
É possível fazer uma animação com os vértices
Para isso precisamos de uma variável que mantenha a passagem do tempo ou dos frames
Não temos como fazer isso no vertex shader, logo temos que definir essa variável na aplicação OpenGL
![Page 50: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/50.jpg)
Exemplos e Códigos E passar para o shader na forma de
uma variável Uniform
uniform float time;
void main(void) {
vec4 v = vec4(gl_Vertex); v.z = sin(5.0*v.x + time*0.01)*0.25; gl_Position = gl_ModelViewProjectionMatrix * v;
}
![Page 51: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/51.jpg)
Exemplos e Códigos No caso a função de render ficaria:
void renderScene(void) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();gluLookAt(0.0,0.0,5.0, 0.0,0.0,0.0, 0.0f,1.0f,0.0f);
glUniform1fARB(loc, time);
glutSolidTeapot(1);time+=0.01;
glutSwapBuffers(); }
![Page 52: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/52.jpg)
Exemplos e Códigos
Vídeo
![Page 53: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/53.jpg)
Exemplos e Códigos
Texturing GLSL tem que ter acesso as coordenadas
de textura por vértice GLSL provê variáveis do tipo Attribute,
para cada unidade de textura (max 8) attribute vec4 gl_MultiTexCoord0..8
![Page 54: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/54.jpg)
Exemplos e Códigos
Texturing Precisa calcular a coordenada de textura Armazenar em uma variável varying
gl_TexCoord[i] onde i é a unidade de textura utilizada gl_TexCoord[0] = gl_MultiTexCoord0;
![Page 55: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/55.jpg)
Exemplos e Códigos
Texturing Um simples código para definir
coordenadas de textura para uma textura utilizando a unit 0 Vertex Shader
void main() {
gl_TexCoord[0] = gl_MultiTexCoord0; gl_Position = ftransform(); }
![Page 56: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/56.jpg)
Exemplos e Códigos Texturing
gl_TexCoord é uma variável varying Será utilizada no fragment shader para
acessar as coordenadas de textura interpoladas
Para acessar os valores de textura temos que declarar uma variável do tipo uniform no fragment shader
Para uma textura 2D temos: uniform sampler2D tex;
![Page 57: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/57.jpg)
Exemplos e Códigos
Texturing A função que nos retorna um textel é a
texture2D Os valores retornados levam em
consideração todos as definições de textura feitos no OpenGL (filtering, mipmap, clamp, etc)
![Page 58: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/58.jpg)
Exemplos e Códigos
Texturing O fragment shader ficaria assim:
uniform sampler2D tex;Void main() {
vec4 color = texture2D(tex,gl_TexCoord[0].st);
gl_FragColor = color; }
![Page 59: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/59.jpg)
Exemplos e Códigos Texturing
São necessárias algumas inicializações na aplicação para que o shader possa utilizar a texturaglActivateTexture(GL_TEXTUREi) onde i = 0..8
glGenTextures(1, &Textura); glBindTexture(GL_TEXTURE_2D, Textura); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
GL_NEAREST);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, level, format, Width, Height, 0, GL_RGB,GL_UNSIGNED_BYTE, TexureInfo);
![Page 60: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/60.jpg)
Exemplos e Códigos
Texturing
glEnable (GL_TEXTURE_2D);
glBegin(GLenum Mode);...glEnd();
glDisable (GL_TEXTURE_2D);
![Page 61: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/61.jpg)
Exemplos e Códigos Bump Mapping
Segue as mesmas idéias vistasVertex shader
uniform mat4 view_matrix;uniform mat4 inv_view_matrix;uniform vec4 view_position;uniform vec4 light_position;uniform vec4 lightDir;
attribute vec3 rm_Tangent; attribute vec3 rm_Binormal;
varying vec2 vTexCoord;varying vec3 vLightVector;varying vec3 vHalfAngle; varying vec3 vNormal;
![Page 62: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/62.jpg)
Exemplos e Códigos
Bump Mappingvoid main( void ){ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; vec4 eye_position = gl_ModelViewMatrix * gl_Vertex;
//**---------------------------------------------- //** Passa as coordenadas de textura //**---------------------------------------------- vTexCoord = vec2(gl_MultiTexCoord0);
![Page 63: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/63.jpg)
Exemplos e Códigos
Bump Mapping //**----------------------------------------------
//** Espaço tangente //**---------------------------------------------- vec3 tangent = vec3( rm_Tangent.x, rm_Tangent.y,
rm_Tangent.z); vec3 normal = vec3( gl_Normal.x, gl_Normal.y,
gl_Normal.z); vec3 binormal = vec3(rm_Binormal.x, rm_Binormal.y,
rm_Binormal.z);
![Page 64: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/64.jpg)
Exemplos e Códigos Bump Mapping
//**-------------------------------------------- //** Calcula o vetor de iluminação no espaço de câmera, //** transforma para o espaço tangente. //**-------------------------------------------- vec3 temp_light_position = vec3( vec4(light_position.x,
light_position.y, -light_position.z, light_position.w) * inv_view_matrix);
vec3 temp_light_vector = temp_light_position.xyz - gl_Vertex.xyz;
vLightVector.x = dot( temp_light_vector, tangent ); vLightVector.y = dot( temp_light_vector, binormal ); vLightVector.z = dot( temp_light_vector, normal );
![Page 65: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/65.jpg)
Exemplos e Códigos Bump Mapping
//**------------------------------------------- //**Mesma coisa para o view vector //**------------------------------------------- vec4 oglEyePos = eye_position; oglEyePos.z = -oglEyePos.z; vec3 temp_eye_position = vec3( oglEyePos * inv_view_matrix) ; vec3 temp_view_vector = temp_eye_position - gl_Vertex.xyz; vec3 temp_view_vector2;
temp_view_vector2.x = dot( temp_view_vector, tangent ); temp_view_vector2.y = dot( temp_view_vector, binormal ); temp_view_vector2.z = dot( temp_view_vector, normal );
![Page 66: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/66.jpg)
Exemplos e Códigos
uniform samplerCubeenvironment_map;uniform sampler2D bump_map;uniform sampler2D base_map;varying vec2 vTexCoord;varying vec3 vLightVector;varying vec3 vHalfAngle;
Bump Mapping Fragment Shaderuniform float Kd;uniform float Ka;uniform vec4 diffuse;uniform vec4 ambient;uniform float Ks;uniform vec4 specular;uniform float
specular_power;uniform float reflectance;uniform float bumpiness;uniform mat4 view_matrix;
![Page 67: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/67.jpg)
Exemplos e Códigos Bump Mapping
void main(void){
//**------------------------------------------------------ //** Pega os componente de cor e bump das texturas //** baseadas nas coordenadas passadas //**------------------------------------------------------ vec3 base = texture2D( base_map, vTexCoord ).xyz; vec3 bump = texture2D( bump_map, vTexCoord ).xyz;
![Page 68: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/68.jpg)
Exemplos e Códigos Bump Mapping
//**----------------------------------------------------//** Normaliza os vetores passados pelo vertex shader//**----------------------------------------------------vec3 normalized_light_vector = normalize( vLightVector );vec3 normalized_half_angle = normalize( vHalfAngle );
//**----------------------------------------------------//** Suaviza os niveis de bump//**----------------------------------------------------
vec3 smooth = vec3(0.5, 0.5, 1.0); bump = mix( smooth, bump, bumpiness ); bump = normalize( ( bump * 2.0 ) - 1.0 );
![Page 69: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/69.jpg)
Exemplos e Códigos
Bump Mapping//**--------------------------------------------------------//** Modelo de iluminação//** NxL – Normal x vetor da luz//** NxH – Normal x Half Vector//**--------------------------------------------------------vec3 n_dot_l = vec3(dot( bump, normalized_light_vector ));vec3 n_dot_h = vec3(dot( bump, normalized_half_angle ));
![Page 70: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/70.jpg)
Exemplos e Códigos
Bump Mapping//**--------------------------------------//** Calcula a cor resultante,//** baseado no modelo de iluminação.//** Ambient + Diffuse + Specular//**--------------------------------------vec3 color0 = ( base * ambient.xyz * Ka ) + ( base * diffuse.xyz * Kd * max( vec3(0.0), n_dot_l ) ) + ( specular.xyz * Ks * pow( max( vec3(0.0), n_dot_h ),
vec3(specular_power) ));
![Page 71: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/71.jpg)
Exemplos e Códigos
Bump Mapping
float color0_a = 1.0; //** Define o alfa
gl_FragColor = vec4(color0.xyz, color0_a); //** retorna a cor
![Page 72: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/72.jpg)
Exemplos e Códigos
Bump Mapping
![Page 73: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/73.jpg)
Conclusões
Apenas um introdução Existem muitas outras utilidades para
os shaders Muitos outros efeitos que podem ser
criados
![Page 74: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/74.jpg)
Conclusões
![Page 75: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/75.jpg)
Conclusões
![Page 76: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/76.jpg)
Conclusões
![Page 77: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/77.jpg)
Conclusões
![Page 78: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/78.jpg)
Conclusões
![Page 79: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/79.jpg)
Conclusões
Gears of War Video GRID Video
![Page 80: Shaders Bruno José Dembogurski Instituto de Computação - UFF](https://reader036.vdocuments.com.br/reader036/viewer/2022062418/552fc10b497959413d8c1734/html5/thumbnails/80.jpg)
Referencias
GLSL Quick Guide NeHe Produtions Wiki GLSL LightHouse