1. Evolução do OpenGL
|
|
|
- Gilberto Castanho Sales
- 10 Há anos
- Visualizações:
Transcrição
1 Universidade Federal de Santa Maria Departamento de Eletrônica e Computação Prof. Cesar Tadeu Pozzer Disciplina: Computação Gráfica Avançada [email protected] 04/12/2012 OpenGL Shading Language 1. Evolução do OpenGL Versão 1.0 (1992) Versão 1.1 (1997) Vertex Array Versão 1.2 (1998) Textura 3D Versão 1.3 (2001) Multi-textura, etc. Versão 1.4 (2002) Mipmap automático, etc. Versão 1.5 (2003) Vertex buffer, etc. Versão 2.0 (2004) Inclusão da Linguagem de shading Versão 2.1 (2006) - Versão 3.0 (2008) funções tornaram-se deprecated, restando 126 funções. A programação por shader torna-se obrigatória ( Versão 3.1 (2009) As funções deprecadas foram removidas da API. Versão 3.2 (2009) Introduz os contextos core e de compatibilidade. Este último para incluir as funções deprecadas, enquanto o contexto core trabalha apenas com as novas funcionalidades. Versão 3.3 (2010) Lançado simultaneamente com a versão 4.0. Traz recursos avançados para as GPUs antigas. Mas não inclui os novos estágios do pipeline programável. Versão 4.0 (2010) Novos estágios de pipeline programável. Tesselation Control e Tesselation Evaluation Shader. Versão 4.3 (2012) Última versão lançada até o momento. Inclui o compute shader. Todas as versões do OpenGL são backward compatible, até a versão 3.0. Uma evolução das placas de vídeo pode ser vista em: Comparativo DirectX Windows Controle centralizado Microsoft Evolução refletida em versões OpenGL Multi-plataforma Comitê OpenGL ARB (Architecture Review Board) Evolução refletida em extensões 1
2 2. Pipeline Programável x Convencional Operações por vértice Aplicação Transformação Modelagem e Visualização Iluminação Projeção Clipping Mapeamento de Tela Rasterização Mapeamento de Textura Combinação Fog/Blend Teste α, s, z Frame Buffer Operações por pixel Aplicação Geometria Rasterização Estágios funcionais do pipeline. Extraído de [2] Estágios funcionais do pipeline. Extraído de [2] 2
3 Aplicação Clipping Vertex Shader Tesselation Control Shader Tesselation Rasterização Fragment Shader Testes de Framebuffer Tesselator Tesselation Evaluation Shader Framebuffer Blending and Logic Write Masking Geometry Shader Transform Feedback Framebuffer Pipeline do OpenGL 4.x. Os estágios em serrilhado são opcionais. Operações substituídas (não executadas) Transformação de vértices (modelview matrix) Projeção (projetction matrix) Textura (texture matrix) Transformação de normais Transformação, re-escala, normalização Iluminação por vértice Cor do material Geração de coordenadas de textura Texturização Fog Operações não substituídas Clipping contra frustum Divisão da perspectiva Mapeamento de tela Transformação de viewport Transformação de Z Clamping de cores [0,1] 3
4 3. Placas Gráficas com suporte a programação em GPU Nvidia ATI DirectX Shader Model OpenGL GeForce Radeon Radeon X300 X GeForce Radeon X1050 X c GeForce c GeForce Radeon HD GLSL Radeon HD ?? O Shader Model está associado com a versão do DirectX. O OpenGL na versão 1.5 oferece recursos a shaders por meio de extensões. A partir da versão 2.0, estes recursos estão na API nativa. Para uma avaliação de desempenho dos diversos modelos de GPUs da Nvidia e ATI, consulte as seguintes páginas: Recursos da Linguagem GLSL Oferece processamento por pixel (por meio do fragment shader), o que permite cálculos de iluminação muito mais realistas, como mostrado nas seguintes figuras
5 Shader desenvolvido por Victor Chitolina Schetinger 2009 Oferece processamento por vértices (por meio do vertex shader), o que permite inclusive modificar objetos da GLUT (que não oferece acesso ao código de geração das primitivas), como nos seguintes exemplos, onde o Utah Teapot foi deformado de várias maneiras. Pelo programa GLSL demo, da 3dLabs ( podese ter uma idéia melhor das funcionalidades da linguagem. 5
6 5. Arquitetura do OpenGL Shading Language 5.1. Vertex Processor Transformações de vértices Transformações de normais Geração de coordenadas de textura Transformação de coordenadas de textura Iluminação 5.2. Fragment Processor Definição da cor dos fragmentos Definição do z dos fragmentos C/C++ program Vertex Shader program Fragment Shader program Frame Buffer CPU Vertex Shader Processor Fixed Functionality Processor Fragment Shader Processor GPU Obs: Atualmente, o Vertex Processor e o Fragment Processor das placas gráficas estão sendo substituídos por Stream Processor, que são processadores genéricos na placa de vídeo que podem desempenhar qualquer das duas tarefas. Cada Stream Processor opera paralelamente aos demais (SIMD Single Instruction Multiple Data), dando a placa gráfica características de processamento vetorial. Além de Vertex e Fragment (pixel) shaders, com o surgimento do Directx 10 surgiu o Geometry Shader. Ele permite criar primitivas gráficas na placa de vídeo. Executa após o Vertex Shader. Atualmente o Geometry Shader é suportando no OpenGL por meio de extensões. As seguintes tabelas apresentam um quadro comparativo entre o número de unidades vertex/pixel/stream em alguns modelos de placa de vídeo da ATI/Nvidia. Deve-se observar que somente o número de unidades não é fator determinante de desempenho. Deve-se também observar o clock da GPU e velocidade e 6ransferência da memória de vídeo. 6
7 Vertex Shaders Processors Pixel Shaders Processors Stream Processing units ATI Radeon 2 4 X1050/ X1600 X HD HD HD HD 3870 X x 2 HD 4870 X x 2 HD HD HD Tabela comparativa dos processadores Nvidia. Vertex Shaders nvidia Processors GeForce Pixel Shaders Processors Stream Processing units Cuda Cores GX2 8 x 2 24 x GTS Ultra GX2 128 x GTX GTX x GTX GTX GTX GTX x 2 O seguinte diagrama exemplifica em detalhes o relacionamento entre os processadores e a aplicação. Também ilustra todas as variáveis que podem ser usadas ao se escrever um shader. 7
8 glvertex3f() glcolor3f() glnormal() glvertexattrib() Built-in Attribute Variables gl_color gl_secondarycolor gl_normal gl_vertex gl_multitexcoord gl_fogcoord User-defined Attribute Variables StartColor Velocity Elevation Density etc Texture Maps Vertex Processor Built-in Varying Variables gl_front/backcolor gl_frontsecondarycolor gl_backsecondarycolor gl_texcoord[] gl_fogfragcoord Special Output Variables gl_position gl_pointsize gl_clipvertex User-Defined Varying Variables Normal Density Tmp Sum Etc. User-defined Uniform Variables LightPosition ModelScaleFactor EyePos etc. Funcionalidade fixa do OpenGL Rasterização Built-in Varying Variables gl_color gl_secondarycolor gl_normal gl_texcoord[] Special Input Variables gl_fragcoord gl_frontfacing Built-in Uniform Variables gl_projectionmatrix (mat4) gl_modelviewmatrix gl_modelviewprojectionmatrix gl_normalmatrix gl_texturematrix gl_front/backmaterial (struct) gl_lightsource[] gl_fog Texture Maps Fragment Processor Special Output Variables gl_fragcolor gl_fragdepth etc Attribute: Variáveis que mudam freqüentemente. Somente podem ser usadas no Vertex Processor. Uniform: Variáveis que não mudam freqüentemente. Podem ser passadas para o Vertex ou Fragment Processors. Varying: variáveis para passagem de dados entre os processors. Entrada e saída do Fragment e Vertex Processors. Adaptada de [1]. 8
9 O quadro anterior ilustra as variáveis das versões antigas do OpenGL (pré OpenGL 3.3). O quadro a seguir serve pra ilustrar o novo estado das variáveis nas versões 3.3 e mais novas do OpenGL. Vale notar que foram alterados os qualificadores das variáveis (Attribute, Uniform e Varying) nas versões novas do OpenGL (>=3.3). Os qualificadores Attribute e Varying foram removidos da linguagem GLSL, restando apenas o qualificador Uniform. Os qualificadores in e out foram incluídos para indicarem variáveis de entrada e saída dos shaders. As informações do quadro a seguir podem ser encontradas em [8]. 9
10 Built-in Vertex Shader Inputs in int gl_vertexid in int gl_instanceid Vertex Shader User defined Vertex Shader Inputs VAOs and Attributes Built-in Tesselation Control Shader Inputs in gl_pervertex - vec4 gl_position - float gl_pointsize - float gl_clipdistance in int gl_patchverticesin in int gl_primitiveid in int gl_invocationid Built-in Vertex Shader Outputs out gl_pervertex - vec4 gl_position - float gl_pointsize - float gl_clipdistance Built-in Tesselation Evaluation Shader Inputs in gl_pervertex - vec4 gl_position - float gl_pointsize - float gl_clipdistance User defined Vertex Shader Outputs Density Tangent Mass etc. Tesselator Tesselation Control Shader Built-in Tesselation Control Shader Outputs out gl_pervertex - vec4 gl_position - float gl_pointsize - float gl_clipdistance patch out float gl_tesslevelouter[4] patch out float gl_tesslevelinner[2] in int gl_patchverticesin in int gl_primitiveid in vec3 gl_tesscoord patch in float gl_tesslevelouter[4] patch in float gl_tesslevelinner[2] Built-in Geometry Shader Outputs out gl_pervertex - vec4 gl_position - float gl_pointsize - float gl_clipdistance out int gl_primitiveid out int gl_layer Tesselation Evaluation Shader Geometry Shader Built-in Tesselation Evaluation Shader Outputs out gl_pervertex - vec4 gl_position - float gl_pointsize - float gl_clipdistance Built-in Geometry Shader Inputs in gl_pervertex - vec4 gl_position - float gl_pointsize - float gl_clipdistance in int gl_primitiveidin Fixed Function Pipeline Raster Write to Frame buffer User defined Fragment Shader Outputs *out float fragcolor Built-in Fragment Shader Outputs *out float gl_fragdepth Built-in Fragment Shader Inputs in vec4 gl_fragcoord in bool gl_frontfacing in float gl_clipdistance in vec2 gl_pointcoord in int gl_primitiveid Fragment Shader Built-in Fragment Shader Uniforms struct gl_depthrangeparameters - float near - float far - float diff gl_depthrange 10
11 6. A Linguagem GLSL (OpenGL Shading Language) 6.1. Tipos A linguagem GLSL é muito semelhante a linguagem C/C++, com algumas características removidas e outras adicionadas. Além do tipo void, a linguagem oferece 6 tipos de variáveis, que podem ser declaradas em qualquer parte do código. São elas: Escalares: int, float, bool. Vector: Podem ser int, float, bool e podem conter 2, 3 ou 4 coordenadas. Para acessar as componentes de cada vetor pode-se utilizar os argumentos (x, y, z, w), (r, g, b, a) ou (s, t, p, q). Ex: position.x, cor.r, etc. vec2 vetor de 2 floats ivec3 vetor de 3 inteiros bvec4 vetor de 4 booleanos. Matrix: Todas as matrizes são do tipo float, e pode assumir dimensão 2, 3 ou 4. (mat2, mat3, mat4). São geralmente utilizadas para guardar transformações lineares. Se transform é uma mat4, então transform[2] é um tipo vec4 (e representa a terceira coluna). Pode-se também acessar cada componente com transform[1][2]. Samplers: Usados para acessar texturas. Estruturas: semelhante a sintaxe da linguagem C, exceto que para definir variáveis, deve-se omitir a palavra struct. Arrays: Podem ser de qualquer tipo. Como a linguagem não dispõe de ponteiros, deve-se utilizar o operador [] para acessar os elementos. Ex: vec4 points[10]; Exemplos de declaração, inicialização e acesso: float a, b=3.0, c; int a; const int size = 4; //constante que nao pode ser alterada attribute float t; //nao pode ser inicializado (attribuite, uniform ou varying) varying int color; mat2 m = mat2(1); //valor é replicado para cada componente da diagonal principal int a = 10; float f = float(a); //conversão de tipo float f = 10; //gera warning struct Ponto int x, y; ; Ponto p; p.x = 10; vec3 cor = vec3(1); //este valor é replicado para cada componente. vec4 dup = vec4(1,2,3,4); vec4 v = vec4(1, 2, 3, 4); //construtor dup = v.xxyy; dup = v.wxyz; dup.wx = vec2(5.0, 6.0); //mantem as demais componentes inalteradas vec4 tmp = dup + v; tmp = dup + f; //f é escalar. Faz soma com cada componente. 11
12 f = tmp[2]; //indixacao em matriz e vetor tmp--; //decrementa cada componente //1 1 //2 2 m[0][0] = 1; //comandos para montar a matriz acima m[1][0] = 1; m[0][1] = 2; m[1][1] = 2; vec2 v = m[0]; //a indexacao eh por coluna. v.x = 1 e v.y = 2 Controle de fluxo: o ponto de entrada é a função main, que deve ser única para cada shader. Para permitir controle de execução, pode-se utilizar if-else, while, do-while e for Funções built-in Pode haver sobrecarga de funções, desde que os parâmetros de entrada sejam diferentes. Quase toda as funções tem suporte a tipos float, vec2, vec3 e vec4, como no seguinte exemplo. float sin(float radians) vec2 sin(vec2 radians) vec3 sin(vec3 radians) vec4 sin(vec4 radians) Quando o argumento for um vetor, por exemplo, as operações são realizadas para cada componente separadamente, ou seja, se for passado um vec4, são realizadas 4 operações trigonométricas, uma para cada componente. Os resultados são armazenados na variável de retorno. As seguintes tabelas apresentam algumas das funções disponibilizadas na linguagem GLSL. Para maiores detalhes, consulte [1]: Trigonométricas: X radians(x) X degrees(x) X sin, cos, tan, asin, acos, atan(x) Conversão de graus para radianos Conversão de radianos para graus Funções trigonométricas Comuns: X abs(x) Retorna o valor absoluto X sign(x) Retorna 1 ou -1 X floor, ceil(x) Arredondamento X min, max(x,x) X clamp(x, float, float), step, smoothstep Funções para geração texturas procedurais Geométricas: float length(x) float distance(x,x) float dot(x) vec3 cross(vec3) X normalize(x) Comprimento de um vetor Distância entre 2 pontos Produto escalar Produto vetorial. Vetor com tamanho unitário Matrizes ( X = mat2, mat3 ou mat4): X matrixcompmult(x,x) Multiplica componente a componente, diferentemente de m1 * m2. Relacionais para vetores (X = vec2, vec3, vec4, ivec2, ivec3 ou ivec4): bx lessthan(x,x) Compara componentes dos vetores 12
13 bx lessthanequal(x,x) bx greaterthan(x,x) bx greaterthanequal(x,x) bx Equal, notequal(x,x) bool any(x) bool all(x) Ruído (Para síntese procedural): DIM noise1, noise2, noise3, noise4(x) Compara componentes dos vetores Compara componentes dos vetores Compara componentes dos vetores Compara componentes dos vetores Retona 1 se qualquer componente for true. X deve ser bool Retona 1 se todas componentes são true. X deve ser bool Retorna um ruido n-dimensional em função de X. Se dimensão for 1, retorna um float. Se for 2, um vec2, etc. Exemplos de funções built-in vec3 cor = texture2d(texture, position).rgb; //nao pega o alpha cor = clamp(cor, 0.0, 1.0); //passando (cor,0,1) não funciona. Tem que ser float. gl_fragcolor = vec4( cor, 1); vec3 v1 = vec3(0.0, 1.0, 2.0), res; res = cos(v1); //aplica o cosseno para cada componente do vetor if(res.x!= res.y) gl_fragcolor = vec4( 1,0,0, 1); vec2 v1 = vec2(2, 3); vec2 v2 = vec2(1, 4); bvec2 v3 = lessthan(v1, v2); //v3 contem (false, true) pois 2>1 e 1<4 if(v3.y == true) gl_fragcolor = vec4( 1,0,0, 1); 7. Estrutura de um programa GLSL Um programa que faça uso de GLSL é escrito em duas partes: uma que contém o código C/C++/GL e outra que contém o código GLSL. O código em GLSL é compilado e anexado ao código de um programa, como ilustrado no diagrama da seguinte figura. Cada programa pode ter 1 ou mais shaders. Para anexar um shader a um programa utiliza-se o comando glattachshader(). Um programa GLSL pode ter semente um shader de vértice (GL_VERTEX_SHADER), somente um shader de fragmento (GL_FRAGMENT_SHADER), ambos ou vários de cada, porém pode haver uma única função main em cada shader. 13
14 Um programa OpenGL pode ter 1 ou mais programas GLSL, porém no máximo um único ativo a cada momento. Para tornar um programa GLSL ativo deve-se utilizar o comando gluseprogram() [5], passando como argumento o programa a ser usado (que neste caso é um identificador inteiro) ou 0 caso se desejar desabilitar esta funcionalidade. Neste caso será usada a funcionalidade fixa do OpenGL par vértice e fragmento. GLuint p = glcreateprogram(); gllinkprogram(p); gluseprogram(p); int v[1]; glgetintegerv(gl_current_program, v); printf("\rprograma ativo: %d", v[0]); Se um programa GLSL tiver somente o shader de fragmento, por exemplo, será usada a funcionalidade fixa do OpenGL para fazer o processamento dos vértices. O contrário ocorre se existir somente o shader de vértice. Ao se usar a um programa de vértice, Funções de Interface C-GLSL A linguagem GLSL oferece um conjunto de funções para realizar o envio de parâmetros da aplicacão escrita em C/C++ para a GPU. As mais comuns são [4]: GLint glgetuniformlocation(gluint p, const GLchar *name); Retorna a localização de uma variável Uniform, dada por name, em um programa p. Tendo-se a localização da variável dentro do código do shader, pode-se então usar o comado gluniform para passar valores a esta variável. GLint glgetattriblocation(gluint p, const GLchar *name); Retorna a localização de uma variável attribute, dada por name, em um programa p. Tendo-se a localização da variável dentro do código do shader, pode-se então usar o comado glvertexattrib para passar valores a esta variável. void gluniform1234if(glint location, TYPE v); Usado para passar valores à variáveis Uniform localizadas dentro do código do shader. Pode-se passar vários parâmetros, dependendo do tipo da variável dentro do código do shader. O parâmetro location é obtido com o comando glgetuniformlocation. void glvertexattrib1234sfd(glint location, TYPE v); 14
15 Usado para passar valores à variáveis Attribute localizadas dentro do código do shader. Pode-se passar vários parâmetros, dependendo do tipo da variável dentro do código do shader. O parâmetro location é obtido com o comando glgetattriblocation. Exemplos de uso GLint loc_u_time; GLint loc_u_light; Glint loc_a_color; float u_lightpos[3] = 1,2,3; void main() GLuint p = glcreateprogram(); gllinkprogram(p); gluseprogram(p); loc_u_light = glgetuniformlocation(p, "lightposition"); loc_u_time = glgetuniformlocation(p, "time"); loc_a_color = glgetattriblocation(p, "color"); glutmainloop(); void display() gluniform1f(loc_u_time, u_time++); gluniform3f(loc_u_light, u_lightpos[0], u_lightpos[1], u_lightpos[2]); glbegin(gl_triangles); glvertexattrib3f(loc_a_cor, 0.0, 1.0, 0.0); glvertex(); glend(); 8. A Biblioteca GLEW A biblioteca GLEW (OpenGL Extension Wrangler - é uma biblioteca open source multi-plataforma em C/C++ que simplifica o uso de extensões e novas versões OpenGL. Ela provê um mecanismo eficiente para determinação da versão OpenGL e extensões que são suportadas na plataforma diretamente do driver da placa gráfica. Para instalar esta biblioteca deve-se copiar os seguintes arquivos nos seguintes diretórios: Arquivo bin/glew32.dll lib/glew32.lib include/gl/glew.h include/gl/wglew.h Local %SystemRoot%/system32 VC Root/Lib VC Root/Include/GL VC Root/Include/GL onde VC Root para o compilador Microsoft.Net é /Vc7/PlatformSDK. No pacote existem dois programas utilitários (glewinfo e visualinfo) que exibem informações do sistema como recurso disponíveis de cada versão OpenGL bem como extensões suportadas, como pode ser visto nas seguintes figuras. Ambos os programas exibem a versão do OpenGL suportado. 15
16 GLEW Extension Info GLEW version Reporting capabilities of pixelformat 1 Running on a GeForce FX 5200/AGP/SSE2 from NVIDIA Corporation OpenGL version is supported GL_VERSION_1_1: GL_VERSION_1_2: glcopytexsubimage3d: gldrawrangeelements: glteximage3d: gltexsubimage3d: GL_VERSION_1_3: glactivetexture: glclientactivetexture: glcompressedteximage1d: glcompressedteximage2d: glcompressedteximage3d: OK OK OK OK OK OK OK OK OK OK OK OK OpenGL vendor string: NVIDIA Corporation OpenGL renderer string: GeForce FX 5200/AGP/SSE2 OpenGL version string: OpenGL extensions (GL_): GL_ARB_depth_texture, GL_ARB_fragment_program, GL_ARB_fragment_program_shadow, GL_ARB_fragment_shader, GL_ARB_half_float_pixel, GL_ARB_imaging, GL_ARB_multisample, GL_ARB_multitexture, GL_ARB_occlusion_query, GL_ARB_pixel_buffer_object, GL_ARB_point_parameters, GL_ARB_point_sprite, GL_ARB_shadow, 9. Programando em GLSL Na função main da aplicação, além das inicializações tradicionais do GL, deve-se tambem inicializar o GLSL. Para isso chama-se a função init_glsl(). Esta função verifica o suporte à linguagem GLSL (por meio da GLEW) e chama a função setshaders() que inicializa os shaders, os compila e então cria o programa, informando por possíveis erros de codificação. O código dos shaders é lido pela função textfileread(). Costuma-se utilizar 2 arquivos fontes, um para o vertex e outro para o fragment shader, com extensões.vert e.frag. int main(int argc, char** argv) glutinit(&argc, argv); glutinitdisplaymode (GLUT_DOUBLE GLUT_RGB); glutinitwindowsize (600, 600); glutinitwindowposition (100, 100); glutcreatewindow("fragment Shader"); glutdisplayfunc(display); glutidlefunc(display); glutreshapefunc(reshape); glutkeyboardfunc(keyboard); init_gl(); shader1 = new Glsl("tea_1.vert", "tea_1.frag"); loc_u_time = shader1->getuniformloc("time"); printf("%d ", loc_u_time_1); void setshaders() char *vs = NULL,*fs = NULL,*fs2 = NULL; v = glcreateshader(gl_vertex_shader); f = glcreateshader(gl_fragment_shader); vs = textfileread("hello.vert"); fs = textfileread("hello.frag"); const char * ff = fs; const char * vv = vs; glshadersource(v, 1, &vv, NULL); glshadersource(f, 1, &ff, NULL); 16
17 glutmainloop(); return 0; free(vs); free(fs); glcompileshader(v); glcompileshader(f); p = glcreateprogram(); glattachshader(p,f); glattachshader(p,v); gllinkprogram(p); //gluseprogram(p); void init_glsl(char *vert, char *frag) GLenum err = glewinit(); if (GLEW_OK!= err) fprintf(stderr, "Error: %s\n", glewgeterrorstring(err)); fprintf(stdout, "Status: Using GLEW %s\n", glewgetstring(glew_version)); if (GLEW_ARB_vertex_shader && GLEW_ARB_fragment_shader) printf("ready for GLSL\n"); else printf("not totally ready :( \n"); exit(1); if (glewissupported("gl_version_2_0")) printf("ready for OpenGL 2.0\n"); else printf("opengl 2.0 not supported\n"); exit(1); setshaders(vert, frag); if (glgeterror()!= GL_NO_ERROR ) printprograminfolog(p); display() shader1->setactive(true); void printshaderinfolog(gluint obj) int infologlength = 0; int charswritten = 0; char *infolog; glgetshaderiv(obj, GL_INFO_LOG_LENGTH, &infologlength); if (infologlength > 0) infolog = (char *)malloc(infologlength); glgetshaderinfolog(obj, infologlength, &charswritten, infolog); printf("%s\n",infolog); free(infolog); void printprograminfolog(gluint obj) int infologlength = 0; int charswritten = 0; char *infolog; glgetprogramiv(obj, GL_INFO_LOG_LENGTH, &infologlength); if (infologlength > 0) infolog = (char *)malloc(infologlength); glgetprograminfolog(obj, infologlength, &charswritten, infolog); 17
18 printf("%s\n",infolog); free(infolog); 10. Exemplos de uso Para uma lista mais detalhada de shaders, consulte [6] Deformando geometrias Para isso, no programa de vértice deve-se mudar as coordenadas de cada vértice antes de se aplicar a transformação ftransform(). Com isso muda-se as coordenadas geradas pela aplicação. O argumento uniform time é usado para simular uma animação controlada dos vértices de forma global. O programa de fragmento neste caso é opcional. Foi usado uma abordagem que muda a cor dos vértices em função de suas coordenadas, neste caso pelas variáveis varying cor1 e cor2. uniform int flag; uniform float time; varying float cor1, cor2; void main() if( flag == 1 ) vec4 v = vec4(gl_vertex); v.z = v.z + sin(v.z*10.0+time)/10.0; v.x = v.x + sin(v.x*10.0+time)/10.0; cor1 = (sin(v.z*10.0)+2.0)/2.0; cor2 = (sin(v.x*5.0)+2.0)/2.0; // the following three lines provide the same result //gl_position = gl_projectionmatrix * gl_modelviewmatrix * gl_vertex; //gl_position = gl_modelviewprojectionmatrix * gl_vertex; //gl_position = ftransform(); gl_position = gl_modelviewprojectionmatrix * v; else //desenha o bule sem nenhuma transformacao gl_position = ftransform(); cor1 = cor2 = 1; varying float cor1, cor2; void main() gl_fragcolor = vec4(cor1, cor2, 0, 1.0); 10.2 Gerando texturas Procedurais A geração de texturas na placa pode ser um processo bem simplificado. Pode-se utilizar funções procedurais como noise ou funções trigonométricas. Pode-se utilizar a coordenada do vértice como parâmetro ou algum atributo específico passado pela aplicação. A cor de cada pixel é então escrita diretamente no buffer de cor pelo programa de fragmento. 18
19 10.3 Acessando texturas As texturas, geradas em formato RGB888 na aplicação, com tons entre [0, 255] quando lidas pelo programa de shader, possuem componentes que variam entre [0,1], a mesma variação de cor que deve ser enviada para o buffer de cor, como no seguinte exemplo. uniform sampler2d texture_0 vec3 cor = texture2d(texture_0, position).rgb; gl_fragcolor = vec4(cor.x, cor.y, cor.z, 0); Neste exemplo, texture é um sampler2d, que pode ser associado com cada unidade de textura da placa. Geralmente as placas tem no mínimo 4 unidades de textura. Para se vincular uma textura com uma unidade de textura, pode-se utilizar os seguintes comandos na aplicação em C++. glactivetexture(gl_texture0); glenable(gl_texture_2d); glbindtexture( GL_TEXTURE_2D, tex1 ); glactivetexture(gl_texture1); glenable(gl_texture_2d); glbindtexture( GL_TEXTURE_2D, tex2 ); No seguinte exemplo passa-se duas texturas para o programa de fragmento. Uma é aplicada na metade do quadrado e a outra na outra metade, segundo um fator de brilho que é comum para ambos. varying float x_coord; void main() x_coord = gl_vertex.x; //guarda a coordenada antes da transformação. gl_position = ftransform(); //gl_texcoord[0] --> built-in varying variable //gl_multitexcoord0 --> built-in attribute variable gl_texcoord[0] = gl_multitexcoord0; uniform sampler2d texture_0; uniform sampler2d texture_1; uniform float brilho; varying float x_coord; void main() vec2 position = gl_texcoord[0].st; vec3 cor; if(x_coord < 0) cor = texture2d(texture_0, position).rgb; //nao pega o alpha else cor = texture2d(texture_1, position).rgb; //nao pega o alpha cor*=brilho; cor = clamp(cor, 0.0, 1.0); //os parametros 0.0 e 1.0 devem ser float. gl_fragcolor = vec4( cor, 1); 10.4 Renderizando para Textura Este recurso é muito útil em diversos aspectos. Ele pode ser usado para gerar texturas que venham a ser usadas no próprio contexto, como por exemplo renderizar a imagem vista a partir de um espelho retrovisor, recurso este muito usado em jogos 3D, ou para realizar processamento genérico em GPU. Para este segundo caso pode-se por 19
20 exemplo usar a GPU para fazer algum tipo de processamento sobre uma matriz de dados (geralmente enviados para a placa via uma textura), e pegar o resultado lendo-se a matriz de cor do framebuffer. Para se ler o resultado do framebuffer, pode-se utilizar uma estratégia muito simples: Definir uma projeção ortográfica do tamanho da textura a ser processada, criar a textura, copiar a informação para a textura, ativar o programa de shader, enviar um quadrado do tamanho da textura para ser processado, recuperar a imagem do framebuffer com glcopytexsubimage2d() ou glcopyteximage2d() e usar esta informação da maneira adequada. static unsigned char data[3*dim *DIM]; glenable (GL_TEXTURE_2D); glgentextures(1, &tex); glbindtexture(gl_texture_2d, tex); glteximage2d(gl_texture_2d, 0, GL_RGB, DIM, DIM, 0, GL_RGB, GL_UNSIGNED_BYTE, data); void display(void) glclear(gl_color_buffer_bit GL_DEPTH_BUFFER_BIT); //renderiza para o buffer do OpenGL usando o programa de shader shader1->setactive(true); //envia um quadrado para ser processado com a dimensao da textura glbegin(gl_quads); glvertex2f(0, 0); glvertex2f(0, DIM); glvertex2f(dim,dim); glvertex2f(dim, 0); glend(); glflush (); glcopytexsubimage2d(gl_texture_2d, 0, 0, 0, 0, 0, DIM_JANELA, DIM_JANELA); //glcopyteximage2d(gl_texture_2d, 0, GL_RGB, 0, 0, DIM_JANELA, DIM_JANELA, 0); //limpa a imagem gerada no framebuffer glclear (GL_COLOR_BUFFER_BIT GL_DEPTH_BUFFER_BIT); //usa-se a textura lida shader1->setactive(false); // faz alguma coisa com a textura glutswapbuffers(); 10.5 Iluminação Difusa Antes de iniciar a renderização e iluminação de uma cena, a luz do OpenGL é transformada para coordenadas de olho (câmera) antes de chegar no pipeline de rasterização. Para que isso ocorra, a chamada gllightfv(gl_light0, GL_POSITION, lightposition) deve ser feita logo após a chamada da função glulookat() e antes de qualquer transformação sobre objetos. Para a transformação da luz é utilizada a matriz de ModelView, para que a translação/rotação sofrida pela câmera seja considerada. A matriz de ModelView (neste caso apenas a matriz de View, pois a matriz não possui nenhuma transformação aplicada sobre modelos) contém translações e rotações para levar a câmera à origem do sistema de coordenada do mundo, neste caso a coordenada (0,0,0), olhando em direção ao eixo z negativo (para dentro da tela). Esta sequência de etapas deve ser usada quando a luz estiver em coordenadas do mundo, e não associada a posição de algum objeto da cena, como no caso de uma luminária colocada sobre uma mesa. 20
21 lebump/simplebump.html O vetor lightposition deve ser definido em coordenadas homogêneas, com a componente w=1, para que transformações de translação também sejam levadas em conta. Se a componente w for zero, apenas as operações de rotação serão aplicadas. Deve-se observar que após a aplicação da matriz de View, as coordenadas relativas de posição de fonte luminosa, olho e vértices devem ser as mesmas (para o vetor normal se aplica outra regra). O seguinte exemplo ilustra a transformação de uma luz posicionada em (0,1,0), objeto centrado na origem e o observador na posição (0, 10, 0). Ao final da transformação, o observador está na origem do sistema. void display() GLfloat light_position[] = 0.0, 1, 0.0, 1.0 ; //w tem que ser 1. glmatrixmode(gl_modelview); glloadidentity(); glulookat(0,10,0, 0,0,0, 0,0,-1); gllightfv(gl_light0, GL_POSITION, light_position); renderscene(); (0,10,0) (0,0, -10) (0,1,0) (0,0, -9) 21
22 Caso a posição da luz seja definida como uma variável Uniform, esta pode ser transformada pela matriz de View (sem transformações aplicadas sobre objetos) antes de ser passada para o programa de shader (mais eficiente, pois o cálculo é feito uma única vez para toda a cena), ou processada no vertex shader, como no seguinte exemplo. Neste exemplo, lightsourcepos é definida como um vec3 e por isso precisa ser convertida para vec4, não esquecendo de colocar a coordenada homogênea como 1. void display(void) glmatrixmode(gl_modelview); glloadidentity(); glulookat(0,10,0, 0,0,0, 0,0,-1); gluniform3f(loc_u_light, 0,1,0); renderscene(); uniform vec3 lightsourcepos; varying vec3 luzpos; varying vec3 normal; void main() luzpos = vec3( gl_modelviewmatrix * vec4(lightsourcepos,1) ); coord = vec3( gl_modelviewmatrix * gl_vertex ); normal = normalize(gl_normalmatrix * gl_normal ); //somente funciona se a modelview for ortogonal //normal = normalize( mat3(gl_modelviewmatrix) * gl_normal); gl_position = ftransform(); Para aplicar a matriz de ModelView sobre a luz antes de ser enviada ao pipeline gráfico, deve-se inicialmente ler a matriz do pipeline fixo do OpenGL com o comando glgetdoublev( GL_MODELVIEW_MATRIX, v), ou ler da classe MyGL com o comando getmodelviewmatrix(). Para o exemplo em questão, tem-se a seguinte matriz de ModelView, lembrando-se que ela contém apenas a transformação do comando glulookat(). Como exemplo, multiplicando-se o ponto da luz [0,1,0,1] por esta matriz obtém-se o ponto [0,0,-9,1], como mostrado na figura acima. 1 0 ModelView = Para a transformação de normais, deve-se utilizar a matriz inversa transposta da ModelView (M -1 ) T. Essa matriz, de dimensão 3x3, é definida no pipeline de shader do OpenGL como gl_normalmatrix (ver trecho de código acima). Isso se faz necessário caso a ModelView tenha matrizes de escala, deixando assim de ser uma matriz ortogonal (a transporta não é igual a inversa). Se a matriz for ortogonal, temos que M -1 =M T, ou seja, (M T ) T =M. Caso a matriz for ortogonal, pode-se aplicar a ModelView diretamente também sobre os vetores normais, desconsiderando-se neste caso a componente homogênea (parte que contem translações). Deve-se lembrar de que vetores normais são sempre definidos em relação à origem, e não estão associados a uma coordenada no espaço, não necessitando assim sofrer transformações de translação. 22
23 Outra forma de fazer a iluminação é usando coordenadas do objeto. Neste caso, tanto coordenadas de normal, olho, vértices e fontes luminosas são mantidos de forma inalterada no processo de iluminação, como mostrado no seguinte exemplo, relativo à configuração de cena 3D mostrada anteriormente. varying vec3 luzpos; varying vec3 normal; varying vec3 coord; void main() luzpos = lightsourcepos; normal = normalize(gl_normal); coord = vec3(gl_vertex); //ou gl_vertex.xyz gl_position = ftransform(); Em ambos os espaços de iluminação (olho ou objeto), utiliza-se o mesmo fragment shader no processo de iluminação, como mostrado no seguinte exemplo. varying vec3 luzpos, normal, coord; void main() float intensity; vec3 vetdirluz; //o vetor direcao deve ser normalizado apos a subtracao. vetdirluz = normalize( luzpos - coord ); intensity = max(dot(normal,vetdirluz),0.0); gl_fragcolor = vec4(intensity,intensity,intensity,0); 10.6 Iluminação por Toon Shading Para simular iluminação tipo toon shading deve-se definir intervalos do ângulo da luz com o vetor normal da superfície, como no seguinte exemplo. varying vec3 normal, lightdir; void main() float intensity; vec4 color; intensity = max(dot(lightdir,normal),0.0); if (intensity > 0.98) color = vec4(0.8,0.8,0.8,1.0); else if (intensity > 0.5) color = vec4(0.4,0.4,0.8,1.0); else if (intensity > 0.25) color = vec4(0.2,0.2,0.4,1.0); else color = vec4(0.1,0.1,0.1,1.0); gl_fragcolor = color; 10.7 Bump Mapping Como o bump mapping consiste em perturbar a normal da superfície, deve-se ter uma função para coordenar essa perturbação. Para isso costuma-se usa um normal map, que nada mais é que uma textura que armazena informação sobre um vetor direção em cada pixel. A componente red de cada pixel armazena o valor do vetor direção no eixo x, o green para o y e o blue para o eixo z. Dessa forma, como os vetores normais geralmente são perpendiculares a superfície, há uma predominância da cor azul, como mostrado na seguinte figura. 23
24 Eixo y Eixo x Eixo z Considerando-se vetores normais normalizados, cada componente xyz varia entre [-1, 1]. Como a textura somente pode conter valores positivos, deve-se fazer uma conversão de valores, utilizando-se a seguinte equação: cor = (normal+1)*127,5. Isso leva os valores entre [0, 255]. No programa de shader, cada pixel é lido com valor entre [0, 1]. Fazendo-se normal=(cor*2)-1 retoma-se o valor original da normal. Existem diversos programas usados para fazer a conversão de uma imagem normal em uma normal map. Nessa conversão deve-se tomar a imagem original, obter um mapa de alturas e pela derivada de pixels vizinhos e encontrar o vetor normal de cada pixel, como mostrado na seguinte figura. A aplicação desse mapa de normal em superfícies alinhadas aos eixos cartesianos é uma tarefa relativamente fácil (ver demo glsl_bump do site). Considerando-se por exemplo uma superfície no plano xz (chão), basta fazer as normais, que estavam no eixo z, apontar para o eixo y e aplicar a técnica de bump-mapping. Caso a textura for aplicada em superfícies quaisquer, faz-se uso de um formalismo matemático mais elaborado. Uma vez que a normal de cada face pode apontar em qualquer direção, para cada normal deve-se fazer uma transformação no vetor direção da luz, isso porque os vetores normais não estão no mesmo espaço que o vetor da luz. Para fazer essa conversão, deve-se levar a luz para um espaço chamado espaço tangente, que é definido por uma base ortonormal (vetores ortogonais e normalizados) de 3 vetores para cada vértice. Um vetor é o próprio vetor normal da superfície (N), o outro é um vetor tangente (T) a superfície, e por último o vetor binormal (B) definido pelo produto vetorial dos outros dois vetores. Esses 3 vetores definem a matriz TBN, que é dada por Tx Ty Tz TBN = Bx B y Bz N x N y N z Tendo-se essa matriz, pode-se definir o vetor de luz no espaço tangente, multiplicando o vetor direção da luz relativo a cada vértice por essa matriz, como mostrado no seguinte programa de vértice. Para mais detalhes veja [6] e Usa-se então o vetor lightvec no programa de fragmentos. 24
25 11. Exercícios Práticos em Laboratório 1. Estudar e modificar o exemplo de deformação do teapot 2. Gerar um quadrado e aplicar um displacement em cada vértice, segundo uma variável que controla o tempo 3. Criar uma textura procedural qualquer e aplicar sobre um quadrado 4. Com texturas: a. Fazer o blending (morphing) de duas texturas com interpolação paramétrica entre ambas. Usar o parâmetro t para alternar suavemente entre uma imagem e outra; b. Dadas duas imagens, mostrar elas em tiras: 100 pixels da primeira, os 100 próximos da outra, e assim por diante; c. Função para clarear e escurecer uma imagem, com controle pelo mouse; d. Transformar a imagem em tons de cinza (luminância); e. Borrar uma imagem, como em uma fotografia desfocada; f. Mostrar a textura somente nas proximidades do mouse (círculo), com um degrade. O resto da tela deve ser preto. Faça uma variante onde a imagem é mostrada em cores na proximidade do mouse e no resto em tons de cinza; g. Implementar uma lupa que segue o mouse sobre uma imagem. Defina um fator de escala de ampliação ou redução; h. Simular cálculos de GPGPU em shader e comparar o desempenho com o processador. Usar função para leitura de textura do buffer de vídeo; i. Desenvolver um algoritmo para fazer detecção de bordas em imagens em tons de cinza. j. Transformar uma imagem de colorida para monocromática de forma suave. 5. Simular toon shading sem usar fontes luminosas; 6. Simular bump mapping sob superfícies planas e orientadas em eixos com um normal map; 7. Simular bump mapping em qualquer superfície; 8. Simular uma lanterna sem usar os recursos de iluminação do OpenGL. Referências Bibliográficas [1] Rost, Randi. OpenGL Shading Language (OpenGL Orange Book). Addison Wesley [2] Celes, W. Notas de Aula. PUC-Rio, [3] LigthHouse3D - tutorials. Disponível em: [4] OpenGL Shading Language API Man Pages. Disponível em: [5] OpenGL Org. [6] Jacobo Rodriguez Villar. TyphoonLabs' OpenGL Shading Language tutorials. Disponível em [7] OpenGL Org. Rendering Pipeline Overview. [8] OpenGL.org, Built-in Variable (GLSL). [9] Normal Matrix: [10] Transformação de Luz: [11] Bump Mapping com shaders: 25
OpenGL Shading Language
OpenGL Shading Language Guilherme S. Moura ([email protected]) Saulo A. Pessoa ([email protected]) Vladimir Alves ([email protected]) Felipe Maia O que é? High Level Shading Language para OpenGL Descreve shaders
Computação Gráfica. GLSL Programação de Shaders
Computação Gráfica GLSL Programação de Shaders António Ramires Fernandes - Computação Gráfica 07/08 GLSL Sumário Evolução do Hardware Gráfico PCs Pipeline Gráfico Fixo Pipeline Gráfico Programável Processador
GLSL Programação de Shaders
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
Computação Gráfica. GLSL - Programação de Shaders Iluminação
Computação Gráfica GLSL - Programação de Shaders Iluminação António nio Ramires Fernandes - Multimédia Resumo Tipos de Dados, Funções e Controle de Fluxo GLSL - Minimal GLSL - Cores GLSL - Iluminação Direcional
Computação Gráfica. GLSL - Programação de Shaders Iluminação
Computação Gráfica GLSL - Programação de Shaders Iluminação António Ramires Fernandes - Computação Gráfica 07/08 Resumo Tipos de Dados, Funções e Controle de Fluxo GLSL - Minimal GLSL - Cores GLSL - Iluminação
Bruno Pereira Evangelista. www.brunoevangelista.com
Bruno Pereira Evangelista www.brunoevangelista.com 2 Introdução Shaders Pipeline de Renderização Evolução dos Shaders Como Programar Shaders Programando Shaders com XNA Ferramentas Conclusões 3 Durante
OpenGL. Uma Abordagem Prática e Objetiva. Marcelo Cohen Isabel Harb Manssour. Novatec Editora
OpenGL Uma Abordagem Prática e Objetiva Marcelo Cohen Isabel Harb Manssour Novatec Editora Capítulo 1 Introdução A Computação Gráfica é uma área da Ciência da Computação que se dedica ao estudo e ao desenvolvimento
Animação e Visualização Tridimensional
Animação e Visualização Tridimensional Mestrado em Engenharia Informática e de Computadores Alameda º mini-teste 22 de Outubro de 204 O mini-teste tem a duração máxima de 45 minutos, tolerância incluída.
Introdução ao OpenGL 2.1 e GLSL 1.2
Introdução ao OpenGL 2.1 e GLSL 1.2 Felipe Bessa Coelho Universidade de São Paulo 25 de Setembro de 2012 Felipe Bessa Coelho (USP) OpenGL+GLSL 2012 1 / 49 Sumário 1 Objetivos 2 Transformações geométricas
Utilização. de Shaders de efeitos realistas para jogos. Bruno Pereira Evangelista. Pontifícia Universidade Católica de Minas Gerais
Utilização de Shaders para criação de efeitos realistas para jogos Bruno Pereira Evangelista Pontifícia Universidade Católica de Minas Gerais Sumário 2/48 Apresentação pessoal Introdução Pipeline de renderização
Orientação a Objetos
1. Domínio e Aplicação Orientação a Objetos Um domínio é composto pelas entidades, informações e processos relacionados a um determinado contexto. Uma aplicação pode ser desenvolvida para automatizar ou
6. Geometria, Primitivas e Transformações 3D
6. Geometria, Primitivas e Transformações 3D Até agora estudamos e implementamos um conjunto de ferramentas básicas que nos permitem modelar, ou representar objetos bi-dimensionais em um sistema também
8. Síntese de Imagens: Cálculo de Cor
8. Síntese de Imagens: Cálculo de Cor O processo de determinar a aparência (ou seja, a textura e a cor) das superfícies visíveis é chamado de shading. Essa aparência da superfície depende das propriedades
Iluminação e sombreamento
OpenGL Iluminação e sombreamento Sombreamento OpenGL calcula a cor de cada pixel e parte disso depende de qual é a iluminação usada no cenário e de como os objetos no cenário refletem ou absorvem a luz
Computação Gráfica. Renderização em Tempo Real. Erivaldo Xavier de Lima Filho [email protected]
Computação Gráfica Renderização em Tempo Real Erivaldo Xavier de Lima Filho [email protected] Computação Gráfica É a síntese de imagens por computador Consiste de vários passos: o Modelagem o Renderização
Tipos de Dados, Tipos Abstratos de Dados Estruturas de Dados
Tipos de Dados, Tipos Abstratos de Dados Estruturas de Dados Tipo de dados, tipo abstrato de dados, estruturas de dados Termos parecidos, mas com significados diferentes Tipo de dado Em linguagens de programação
Luiz Gonzaga da Silveira Jr
Luiz Gonzaga da Silveira Jr O p e n G L evolução recente Luiz Gonzaga da Silveira Jr OpenGL 4.x: D3D a guerra não acabou OpenGL 4.2 - novas funcionalidades: Contadores atômicos para shaders Tesselação
INTRODUÇÃO À LINGUAGEM C++
INTRODUÇÃO À LINGUAGEM C++ 1 - VARIÁVEIS Variáveis espaço de memória reservado para armazenar tipos de dados, com um nome para referenciar seu conteúdo. Observações importantes Todas as variáveis devem
FCG2006 Prova sobre OpenGL e Rastreamento de Raios
FCG2006 Prova sobre OpenGL e Rastreamento de Raios Aluno(a): matrícula: 1. O programa SimpleLight.c mostrado no Quadro 1 produz a janela mostrada na Figura 1. A partir do código, calcule coordenadas na
Introdução a Prática em OpenGL
Introdução a Prática em OpenGL Universidade de São Paulo USP Disciplina de Computação Gráfica Profª Maria Cristina PAE: Thiago Silva Reis Santos Agosto de 2010 Sumário Bibliotecas Necessárias Instalação
Resumo da Matéria de Linguagem de Programação. Linguagem C
Resumo da Matéria de Linguagem de Programação Linguagem C Vitor H. Migoto de Gouvêa 2011 Sumário Como instalar um programa para executar o C...3 Sintaxe inicial da Linguagem de Programação C...4 Variáveis
Prof. Esp. Adriano Carvalho
Prof. Esp. Adriano Carvalho O que é um Programa? Um arquivo contendo uma sequência de comandos em uma linguagem de programação especifica Esses comandosrespeitam regras de como serem escritos e quais
OPERADORES E ESTRUTURAS DE CONTROLE
OPERADORES E ESTRUTURAS DE CONTROLE 3.1 Operadores Os operadores indicam o tipo de operação matemática que será executada gerando novos valores a partir de um ou mais operadores. São muito utilizados em
COMPUTAÇÃO GRÁFICA REPRESENTAÇÃO DE IMAGENS
COMPUTAÇÃO GRÁFICA REPRESENTAÇÃO DE IMAGENS Curso: Tecnológico em Análise e Desenvolvimento de Sistemas Disciplina: COMPUTAÇÃO GRÁFICA 4º Semestre Prof. AFONSO MADEIRA ARQUITETURA GRÁFICA Frame-buffer
INTRODUÇÃO A OPENGL. Computação Gráfica
INTRODUÇÃO A OPENGL Computação Gráfica OpenGL (Open Graphic Library) Biblioteca de rotinas gráficas e de modelagem, bi e tridimensional, extremamente portável e rápida. Não é uma linguagem de programação,
UNIVERSIDADE FEDERAL DO RIO GRANDE DO SUL INSTITUTO DE INFORMÁTICA INFORMÁTICA APLICADA
Responda 1) Quem desenvolveu a linguagem C? Quando? 2) Existe alguma norma sobre a sintaxe da linguagem C? 3) Quais são os tipos básicos de dados disponíveis na linguagem C? 4) Quais são as principais
Busca. Pesquisa sequencial
Busca Banco de dados existem para que, de tempos em tempos, um usuário possa localizar o dado de um registro, simplesmente digitando sua chave. Uma tabela ou um arquivo é um grupo de elementos, cada um
Imagem e Gráficos. vetorial ou raster?
http://computacaografica.ic.uff.br/conteudocap1.html Imagem e Gráficos vetorial ou raster? UFF Computação Visual tem pelo menos 3 grades divisões: CG ou SI, AI e OI Diferença entre as áreas relacionadas
OpenGL. http://www.opengl.org. Alberto B. Raposo
OpenGL http://www.opengl.org Alberto B. Raposo OpenGL: o que é? API Interface para programador de aplicação Aplicação API abstrata API Hardware & Software Dispositivo de saída Dispositivo de entrada Por
ARRAYS. Um array é um OBJETO que referencia (aponta) mais de um objeto ou armazena mais de um dado primitivo.
Cursos: Análise, Ciência da Computação e Sistemas de Informação Programação I - Prof. Aníbal Notas de aula 8 ARRAYS Introdução Até agora, utilizamos variáveis individuais. Significa que uma variável objeto
Algoritmos e Programação (Prática) Profa. Andreza Leite [email protected]
(Prática) Profa. Andreza Leite [email protected] Introdução O computador como ferramenta indispensável: Faz parte das nossas vidas; Por si só não faz nada de útil; Grande capacidade de resolução
Estrutura de Dados Básica
Estrutura de Dados Básica Professor: Osvaldo Kotaro Takai. Aula 4: Tipos de Dados O objetivo desta aula é apresentar os tipos de dados manipulados pela linguagem C, tais como vetores e matrizes, bem como
Trabalho 3: Agenda de Tarefas
INF 1620 Estruturas de Dados Semestre 08.2 Trabalho 3: Agenda de Tarefas O objetivo deste trabalho é a implementação de um conjunto de funções para a manipulação de uma agenda de tarefas diárias, de forma
PROGRAMAÇÃO ESTRUTURADA. CC 2º Período
PROGRAMAÇÃO ESTRUTURADA CC 2º Período PROGRAMAÇÃO ESTRUTURADA Aula 07: Funções O comando return Protótipo de funções O tipo void Arquivos-cabeçalho Escopo de variáveis Passagem de parâmetros por valor
2. OPERADORES... 6 3. ALGORITMOS, FLUXOGRAMAS E PROGRAMAS... 8 4. FUNÇÕES... 10
1. TIPOS DE DADOS... 3 1.1 DEFINIÇÃO DE DADOS... 3 1.2 - DEFINIÇÃO DE VARIÁVEIS... 3 1.3 - VARIÁVEIS EM C... 3 1.3.1. NOME DAS VARIÁVEIS... 3 1.3.2 - TIPOS BÁSICOS... 3 1.3.3 DECLARAÇÃO DE VARIÁVEIS...
Programação Orientada a Objetos com PHP & MySQL Sistema Gerenciador de Banco de Dados: Introdução e configuração de bases de dados com Postgre e MySQL
Programação Orientada a Objetos com PHP & MySQL Sistema Gerenciador de Banco de Dados: Introdução e configuração de bases de dados com Postgre e MySQL Prof. MSc. Hugo Souza Iniciando nossas aulas sobre
Curso de Computação Gráfica (CG) 2014/2- Unidade 1- Modelagem de objetos. Exercício 1 (individual) - Entrega: quarta 13/08
Curso de Computação Gráfica (CG) 2014/2- Unidade 1- Modelagem de objetos Exercício 1 (individual) - Entrega: quarta 13/08 Escolha um objeto entre os que possivelmente compõem uma clínica médica de exames
Apostila de PowerPoint 2013
Iniciando o Power Point 2013...01 Nova apresentação baseada no modelo...01 Escolhendo o esquema de cores do fundo do slide manualmente...02 Modificando o layout do slide... 03 Inserindo textos no slide...
Sistema de Numeração e Conversão entre Sistemas. Prof. Rômulo Calado Pantaleão Camara. Carga Horária: 60h
Sistema de Numeração e Conversão entre Sistemas. Prof. Rômulo Calado Pantaleão Camara Carga Horária: 60h Representação de grandeza com sinal O bit mais significativo representa o sinal: 0 (indica um número
Linguagem de Programação JAVA. Técnico em Informática Professora Michelle Nery
Linguagem de Programação JAVA Técnico em Informática Professora Michelle Nery Agenda Regras paravariáveis Identificadores Válidos Convenção de Nomenclatura Palavras-chaves em Java Tipos de Variáveis em
AMBIENTE PARA AUXILIAR O DESENVOLVIMENTO DE PROGRAMAS MONOLÍTICOS
UNIVERSIDADE REGIONAL DE BLUMENAU CENTRO DE CIÊNCIAS EXATAS E NATURAIS CURSO DE CIÊNCIAS DA COMPUTAÇÃO BACHARELADO AMBIENTE PARA AUXILIAR O DESENVOLVIMENTO DE PROGRAMAS MONOLÍTICOS Orientando: Oliver Mário
Introdução a Java. Hélder Nunes
Introdução a Java Hélder Nunes 2 Exercício de Fixação Os 4 elementos básicos da OO são os objetos, as classes, os atributos e os métodos. A orientação a objetos consiste em considerar os sistemas computacionais
Prof. Fernando V. Paulovich http://www.icmc.usp.br/~paulovic [email protected]. 3 de maio de 2011. SCC0250 - Computação Gráca
Transformações Geométricas 3D SCC0250 - Computação Gráca Prof. Fernando V. Paulovich http://www.icmc.usp.br/~paulovic [email protected] Instituto de Ciências Matemáticas e de Computação (ICMC) Universidade
Introdução aos cálculos de datas
Page 1 of 7 Windows SharePoint Services Introdução aos cálculos de datas Aplica-se a: Microsoft Office SharePoint Server 2007 Ocultar tudo Você pode usar fórmulas e funções em listas ou bibliotecas para
PROGRAMAÇÃO ESTRUTURADA. CC 2º Período
PROGRAMAÇÃO ESTRUTURADA CC 2º Período PROGRAMAÇÃO ESTRUTURADA Aula 06: Ponteiros Declarando e utilizando ponteiros Ponteiros e vetores Inicializando ponteiros Ponteiros para Ponteiros Cuidados a serem
JSP - ORIENTADO A OBJETOS
JSP Orientação a Objetos... 2 CLASSE:... 2 MÉTODOS:... 2 Método de Retorno... 2 Método de Execução... 2 Tipos de Dados... 3 Boolean... 3 Float... 3 Integer... 4 String... 4 Array... 4 Primeira:... 4 Segunda:...
DOCUMENTAÇÃO DO FRAMEWORK - versão 2.0
DOCUMENTAÇÃO DO FRAMEWORK - versão 2.0 Índice 1 - Objetivo 2 - Descrição do ambiente 2.1. Tecnologias utilizadas 2.2. Estrutura de pastas 2.3. Bibliotecas já incluídas 3 - Características gerais 4 - Criando
Introdução à Programação
Introdução à Programação Introdução a Linguagem C Construções Básicas Programa em C #include int main ( ) { Palavras Reservadas } float celsius ; float farenheit ; celsius = 30; farenheit = 9.0/5
Capítulo 5. ARQUIVOS E FUNÇÕES MATEMÁTICAS INTRÍNSECAS
Capítulo 5. ARQUIVOS E FUNÇÕES MATEMÁTICAS INTRÍNSECAS OBJETIVOS DO CAPÍTULO Conceitos de: arquivo de saída, biblioteca, funções matemáticas intrínsecas Criar e usar arquivos para mostrar resultados da
Trabalho Prático n. 2
Trabalho Prático n. 2 Programação com Quadtrees Métodos de Programação I 2003/04 Preâmbulo Este trabalho prático é constituído por duas secções. A primeira contém questões obrigatórias, e a segunda questões
Computação Gráfica. 5385: Licenciatura em Engenharia Informática. Cap. 3 Janelas e Visores. Janelas e Visores
Computação Gráfica 5385: Licenciatura em Engenharia Informática Cap. 3 Janelas e Visores Janelas e Visores Sumário Definições domínio de imagem (ecrã) janela de ecrã domínio da cena (IR 2 ) janela visor
Revisão: Introdução. - Integração com o AutoManager; 1 Atualização de versão do banco de dados PostgreSQL
Urano Indústria de Balanças e Equipamentos Eletrônicos Ltda. Rua Irmão Pedro 709 Vila Rosa Canoas RS Fone: (51) 3462.8700 Fax: (51) 3477.4441 Características do Software Urano Integra 2.2 Data: 12/05/2014
A4 Projeto Integrador e Lista de Jogos
A4 Projeto Integrador e Lista de Jogos 1ª ETAPA PROJETO INTEGRADOR (2 pontos na A4) Como discutido em sala de aula, a disciplina de algoritmos I também fará parte do projeto integrador, para cada grupo
2ª LISTA DE EXERCÍCIOS CLASSES E JAVA Disciplina: PC-II. public double getgeracaoatual() {return geracaoatual;}
2ª LISTA DE EXERCÍCIOS CLASSES E JAVA Disciplina: PC-II Exercício : Construtores são métodos especiais sem tipo de retorno (nem mesmo void) e de mesmo nome que a classe que são invocados quando da criação
Algoritmos e Programação Estruturada
Algoritmos e Programação Estruturada Virgínia M. Cardoso Linguagem C Criada por Dennis M. Ritchie e Ken Thompson no Laboratório Bell em 1972. A Linguagem C foi baseada na Linguagem B criada por Thompson.
Feature-Driven Development
FDD Feature-Driven Development Descrição dos Processos Requisitos Concepção e Planejamento Mais forma que conteúdo Desenvolver um Modelo Abrangente Construir a Lista de Features Planejar por
ULA Sinais de Controle enviados pela UC
Solução - Exercícios Processadores 1- Qual as funções da Unidade Aritmética e Lógica (ULA)? A ULA é o dispositivo da CPU que executa operações tais como: Adição Subtração Multiplicação Divisão Incremento
9 Comandos condicionais
9 Comandos condicionais Um comando condicional é uma instrução empregada quando se deseja criar um desvio, isto é, a opção de executar-se ou não um determinado trecho de código, segundo uma condição. Em
Introdução à Programação em OpenGL. Prof. Márcio Bueno {cgtarde,cgnoite}@marciobueno.com
Introdução à Programação em OpenGL Prof. Márcio Bueno {cgtarde,cgnoite}@marciobueno.com OPENGL (Open Graphical Library) OpenGL é uma interface de software (API Aplication Program Interface) para aceleração
Computação Gráfica. GLSL - Programação de Shaders Toon Mapping; Texturas
Computação Gráfica GLSL - Programação de Shaders Toon Mapping; Texturas António nio Ramires Fernandes - Multimédia GLSL - Programação de Shaders Resumo Toon Shading Coordenadas de Textura Lattice Stripes
Computação Gráfica. Texturas
Computação Gráfica Texturas António Ramires Fernandes + Luís Paulo Santos- Computação Gráfica 08/09 Texturas Aplicar imagens 1D,2D ou 3D a primitivas geométricas Utilizações: Simular materiais: madeira,
Aula 3 - Registro de Imagem
Aula 3 - Registro de Imagem 1. Registro de Imagens Registro é uma transformação geométrica que relaciona coordenadas da imagem (linha e coluna) com coordenadas geográficas (latitude e longitude) de um
Algoritmos e Programação II. Sobrecarga
Algoritmos e Programação II Baseado no Material do Prof. Júlio Machado Sobrecarga Em várias linguagens é comum encontrarmos rotinas que fazem basicamente a mesma coisa, porém, têm nomes distintos porque
APOSTILA DE EXCEL 2007
APOSTILA DE EXCEL 2007 1. Introdução Quando você cria uma planilha nova, a tela do computador é dividida em linhas e colunas, formando uma grade. A interseção de uma linha e de uma coluna é chamada de
Desenvolvimento OO com Java Orientação a objetos básica
Desenvolvimento OO com Java Orientação a objetos básica Vítor E. Silva Souza ([email protected]) http://www.inf.ufes.br/~vitorsouza Departamento de Informática Centro Tecnológico Universidade Federal
INF 1005 Programação I
INF 1005 Programação I Aula 03 Introdução a Linguagem C Edirlei Soares de Lima Estrutura de um Programa C Inclusão de bibliotecas auxiliares: #include Definição de constantes:
OpenGL. O que é OpenGL. O Pipeline do OpenGL. Listas de Exposição
OpenGL O que é OpenGL OpenGL é uma interface de software para dispositivos de hardware. Esta interface consiste em cerca de 150 comandos distintos usados para especificar os objetos e operações necessárias
Programação Orientada a Objetos com PHP & MySQL Cookies e Sessões. Prof. MSc. Hugo Souza
Programação Orientada a Objetos com PHP & MySQL Cookies e Sessões Prof. MSc. Hugo Souza Se você precisar manter informações sobre seus usuários enquanto eles navegam pelo seu site, ou até quando eles saem
Edwar Saliba Júnior. Dicas, Comandos e Exemplos Comparativos entre Linguagem Algorítmica e Linguagem C / C++
Edwar Saliba Júnior Dicas, Comandos e Exemplos Comparativos entre Linguagem Algorítmica e Linguagem C / C++ Belo Horizonte 2009 Sumário 1 Nota:... 2 2 Comandos e Palavras Reservadas:... 3 3 Dicas... 4
Formação em game programming: 01 - Introdução à programação
Formação em game programming: Para que um jogo eletrônico funcione adequadamente como foi projetado, é necessário que ele esteja corretamente programado. Todas as funções de controle de personagens e objetos
Curso: Ciência da Computação Disciplina: Construção de Compiladores Período: 2010-1 Prof. Dr. Raimundo Moura
UFPI CCN DIE Curso: Ciência da Computação Disciplina: Construção de Compiladores Período: 2010-1 Prof. Dr. Raimundo Moura O projeto Desenvolver um compilador de um subconjunto básico da linguagem PORTUGOL.
Prof. Fernando V. Paulovich http://www.icmc.usp.br/~paulovic [email protected]. 3 de maio de 2011. SCC0250 - Computação Gráca
Introdução à Opengl com Java SCC0250 - Computação Gráca Prof. Fernando V. Paulovich http://www.icmc.usp.br/~paulovic [email protected] Instituto de Ciências Matemáticas e de Computação (ICMC) Universidade
www.nddigital.com.br Manual de Administração DPS Printer 2.1 NDDigital S/A - Software
www.nddigital.com.br Manual de Administração DPS Printer 2.1 NDDigital S/A - Software 2 Introdução Este manual foi elaborado para administradores, para entendimento do funcionamento do produto e administração
MICROSOFT OFFICE EXCEL 2007
LEIAME Nenhuma informação da APOSTILA - MICROSOFT OFFICE EXCEL 2007 poderá ser copiada, movida ou modificada sem autorização prévia e escrita do autor. MICROSOFT OFFICE EXCEL 2007 Efetue cálculos, analise
GEADA. Gerador de Expressões Algébricas em Digrafos Acíclicos. para versão 1.0, de agosto/2008. Autor: Márcio Katsumi Oikawa
GEADA Gerador de Expressões Algébricas em Digrafos Acíclicos para versão 1.0, de agosto/2008. Autor: Márcio Katsumi Oikawa 1 1 Introdução O GEADA (Gerador de Expressões Algébricas em Digrafos Acíclicos)
Capítulo 2: Introdução à Linguagem C
Capítulo 2: Introdução à Linguagem C INF1005 Programação 1 Pontifícia Universidade Católica Departamento de Informática Programa Programa é um algoritmo escrito em uma linguagem de programação. No nosso
Dicas para usar melhor o Word 2007
Dicas para usar melhor o Word 2007 Quem está acostumado (ou não) a trabalhar com o Word, não costuma ter todo o tempo do mundo disponível para descobrir as funcionalidades de versões recentemente lançadas.
INF1007 - PROGRAMAÇÃO II LISTA DE EXERCÍCIOS 15
INF1007 - PROGRAMAÇÃO II LISTA DE EXERCÍCIOS 15 1. Um número racional é expresso por dois inteiros: um numerador e um denominador (este último diferente de zero!). Implemente um TAD para representar números
Linguagem e Técnicas de Programação I Operadores, expressões e funções. Prof. MSc. Hugo Souza Material desenvolvido por: Profa.
Linguagem e Técnicas de Programação I Operadores, expressões e funções Prof. MSc. Hugo Souza Material desenvolvido por: Profa. Ameliara Freire Operadores básicos Toda linguagem de programação, existem
4.2 Produto Vetorial. Orientação sobre uma reta r
94 4. Produto Vetorial Dados dois vetores u e v no espaço, vamos definir um novo vetor, ortogonal a u e v, denotado por u v (ou u v, em outros textos) e denominado produto vetorial de u e v. Mas antes,
cast poderia ser usado também para transformar um real (float) em inteiro. A sintaxe C (float)i pode ser substituída em C++ por float(i).
Cast (conversão) Um tipo de dado pode ser convertido momentaneamente em outro tipo com um cast. Em linguagem C a sintaxe usada é formada pelo tipo desejado entre parênteses precedendo a expressão a ser
Unidade IV: Ponteiros, Referências e Arrays
Programação com OO Acesso em Java a BD Curso: Técnico em Informática Campus: Ipanguaçu José Maria Monteiro Pontifícia Universidade Católica do Rio de Janeiro PUC-Rio Departamento Clayton Maciel de Informática
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
Tabela de Símbolos Análise Semântica A Tabela de Símbolos Fabiano Baldo Após a árvore de derivação, a tabela de símbolos é o principal atributo herdado em um compilador. É possível, mas não necessário,
Aluísio Eustáquio da Silva
1 Aluísio Eustáquio da Silva SciLab Programável Material didático usado em aulas de Programação de Computadores, Algoritmos e Lógica de Programação Betim Maio de 2012 2 PROGRAMAÇÃO O SciLab permite que
CURSO BÁSICO DE PROGRAMAÇÃO AULA 9. Introdução a linguagem C Estruturas de decisão
CURSO BÁSICO DE PROGRAMAÇÃO AULA 9 Introdução a linguagem C Estruturas de decisão Introdução à Linguagem C Linguagem compilada. Desenvolvida sobre os paradigmas de programação procedural. Uma das linguagens
Especificação do 3º Trabalho
Especificação do 3º Trabalho I. Introdução O objetivo deste trabalho é abordar a prática da programação orientada a objetos usando a linguagem Java envolvendo os conceitos de classe, objeto, associação,
CONVENÇÃO DE CÓDIGO JAVA
CONVENÇÃO DE CÓDIGO JAVA Eligiane Ceron - Abril de 2012 Versão 1.0 Conteúdo Considerações iniciais... 2 Introdução... 2 Extensão de arquivos... 2 Arquivos de código Java... 2 Comentários iniciais... 2
CURSO BÁSICO DE PROGRAMAÇÃO AULA 8. Introdução ao Linux Introdução a linguagem C
CURSO BÁSICO DE PROGRAMAÇÃO AULA 8 Introdução ao Linux Introdução a linguagem C Linux Linux é um termo utilizado para se referir a sistemas operacionais que utilizem o núcleo Linux. Existem muitas distribuições
Manual do Desenvolvedor Criptografia de Arquivos do WebTA
Manual do Desenvolvedor Criptografia de Arquivos do WebTA Versão 1.4 Índice 1. Objetivo..3 2. Processo..3 3. API de Criptografia - Biblioteca Java..4 3.1 WEBTACryptoUtil..4 3.1.1 decodekeyfile..4 3.1.2
LAB. 1. Introdução à OpenGL
LAB. 1 Introdução à OpenGL OpenGL O que é? É uma biblioteca de funções gráficas. É uma API (Application Programming Interface) gráfica 2D e 3D Primitivas vectoriais e rasterizadas (imagens) Capaz de gerar
JavaServer Pages. Também são conhecidas pela sigla correspondente (JSP). Representam mais uma tecnologia da plataforma JEE.
Slide 1 Conceito Também são conhecidas pela sigla correspondente (JSP). Representam mais uma tecnologia da plataforma JEE. Uma JSP é uma página HTML com código Java embutido com o objetivo de fornecer
4 O Workflow e a Máquina de Regras
4 O Workflow e a Máquina de Regras O objetivo do workflow e da máquina de regras é definir um conjunto de passos e regras configuráveis. Ao longo de sua execução, um usuário consegue simplificar o seu
Persistência de Dados
Persistência de s Universidade do Estado de Santa Catarina - Udesc Centro de Ciências Tecnológicas - CCT Departamento de Ciência da Computação Tecnologia de Sistemas de Informação Estrutura de s II - DAD
Dispositivos de Entrada e Saída
Dispositivos de Entrada e Saída Prof. Márcio Bueno {cgtarde,cgnoite}@marciobueno.com Fonte: Material do Prof. Robson Pequeno de Sousa e do Prof. Robson Lins Dispositivos de Entrada Teclado, Mouse, Trackball,
