Baixe o app para aproveitar ainda mais
Prévia do material em texto
Unidade I – Sistemas Gráficos .............................................................. 4 Arquitetura De Placas Gráficas ...................................................................... 4 Processador Gráfico ...................................................................................... 5 Memória Vídeo ............................................................................................. 5 Ramdac ....................................................................................................... 6 A Interface Vga Standard:............................................................................. 6 Bios Vídeos .................................................................................................. 6 Interface : ................................................................................................... 6 A Sua Importância no Desempenho Do Projeto .............................................. 7 Analisar tipos de placa e sua importância dentro da computação gráfica. .................................................................................................. 7 Perfil Doméstico ........................................................................................... 7 Perfil Profissional Básico................................................................................ 8 Perfil Gamer ................................................................................................. 8 Perfil Entusiasta ........................................................................................... 8 Perfil Profissional Avançado ........................................................................... 8 Pipeline Gráfico ............................................................................................ 9 ESPAÇO DO OBJETO .............................................................................. 9 Object Space: .............................................................................................. 9 World Space: ............................................................................................... 9 Camera Space: ............................................................................................. 9 Clipping Space: ............................................................................................ 9 Canonical Space: ........................................................................................ 10 Engine De Renderização (Engine 3D) ........................................................... 10 Transformações 3D: ................................................................................... 10 Projeção 3D → 2D ...................................................................................... 11 Culling: ...................................................................................................... 11 Clipping: .................................................................................................... 12 Rasterização: ............................................................................................. 12 A sua importância para a montagem de sistemas de base. ................ 13 Montagem De Sistemas De Base ................................................................. 13 Bibliotecas gráficas mais utilizadas (OpenGL e DirectX) .................... 15 Introdução ................................................................................................. 15 A melhor biblioteca gráfica dependendo do seu uso e a sua importância dentro da computação gráfica. ....................................... 17 OpenGl: ..................................................................................................... 17 DirectX ...................................................................................................... 17 Unidade II – Funcionamento interno de um Game ............................ 19 Itrodução As Apis ....................................................................................... 19 AS API NATIVAS .................................................................................. 19 A Api Gráfica do Windows ........................................................................... 19 As Api Nativas ............................................................................................ 19 Xwindow .................................................................................................... 20 Qt ............................................................................................................. 20 GTK ........................................................................................................... 20 WxWidgets ................................................................................................ 21 Linguagens básicas para programação em API. ................................. 21 API ............................................................................................................ 21 Framework .............................................................................................. 21 Exemplos de Bibliotecas .............................................................................. 22 C++ .......................................................................................................... 22 O Processo de Game Loop .......................................................................... 23 Como Fazer ............................................................................................... 23 Na Prática .................................................................................................. 24 Inicialização/Carregamento ......................................................................... 25 Game Loop ................................................................................................ 25 Unload/Shutdown ....................................................................................... 25 Unidade III – Programando Shaders I ............................................... 25 Tipos de shaders e suas características .............................................. 25 Introdução ................................................................................................. 25 O Pipeline Programável ............................................................................... 27 Vrsão Shader ............................................................................................. 27 Geometry Shader ....................................................................................... 28 Pixel Shader (Fragment Shader) .................................................................. 28 Efeitos básicos com shaders ............................................................... 29 Introdução ................................................................................................. 29 Tipos De Efeitos ......................................................................................... 29 Iluminação ................................................................................................. 29 Textura ...................................................................................................... 30 Operações Matemáticas .............................................................................. 30 Tansparência ............................................................................................. 31 Unidade IV – Programando Shaders II ............................................... 31 Efeitos Avançados Com Shaders .................................................................. 31 Bibliografia ................................................................................................. 33 Unidade I – Sistemas Gráficos Arquitetura de placas gráficas A placa gráfica (em inglês graphic adapter), tanbém chamadas de placa vídeo ou acelerador gráfico, é o elemento do computador encarregadoconverter os dados numéricos e transformar em dados gráficos. Os computadores de mais baratos, as placas de vídeo estão incorporadas na placa-mãe, não possuem memória dedicada, e por isso utilizam a memória viva do sistema, normalmente denomina-se memória compartilhada. O papel da placa gráfica era inicialmente o envio de pixéis gráficos para uma tela, bem como um conjunto de manipulação de gráficos simples: Deslocação dos blocos; Traçado de linhas; Traçado de polígonos; As placas gráficas recentes estão agora equipadas com processadores especializados no cálculo de cenários gráficos complexos em 3D! PRINCIPAIS COMPONENTES Processador gráfico; Memória vídeo; RAMDAC; BIOS vídeos. Processador gráfico Um processador gráfico (chamado GPU, para Graphical Processing Unit), constituindo o coração da placa gráfica e encarregue de tratar as imagens em função da resolução e da profundidade de codificação selecionada. O GPU é assim um processador especializado possuindo instruções evoluídas de tratamento da imagem, nomeadamente em 3D. Devido à temperatura que pode atingir o processador gráfico, às vezes tem um radiador e um ventilador. Memória vídeo A memória vídeo encarregada de conservar as imagens tratadas pelo processador gráfico antes da afixação. Quanto maior é a quantidade de memória vídeo, melhor a placa gráfica poderá gerir texturas aquando da afixação de cenas em 3D. Fala-se geralmente de frame buffer para designar a parte da memória vídeo que serve para armazenar as imagens antes de afixação. As placas gráficas são tributárias do tipo de memória utilizada na placa, porque o seu tempo de resposta é determinante para a velocidade de afixação das imagens, bem como a quantidade de memória, jogando com o número e a resolução das imagens que podem ser armazenadas no frame. RAMDAC O RAMDAC (random access memory digital-analog converter) permite converter as imagens numéricas armazenadas no frame proteção em sinais analógicos a enviar ao monitor. A frequência do RAMDAC determina as taxas de atualização (número de imagens por segundo, exprimido em Hertz - Hz) que a placa gráfica pode suportar. A interface VGA standard: As placas gráficas estão quase sempre equipadas com um conector VGA 15 pinos (Mini SubD, composto de 3 séries de 5 pinos), geralmente de cor azul, permitindo nomeadamente a conexão de uma tela CRT. Este tipo de interface permite enviar para as telas 3 sinais analógicos que correspondem às componente vermelhas, azuis e verdes da imagem. BIOS vídeos O BIOS vídeos contém os parâmetros da placa gráfica, nomeadamente os modos gráficos que esta suporta. Interface : Trata-se do tipo de bus utilizado para conectar a placa gráfica à placa-mãe. O canal AGP está especialmente previsto para aceitar débitos consideráveis de dados, necessário para a afixação de sequências vídeo ou 3D. O bus PCI Expres possui melhor desempenho que o canal AGP e deve substituí-lo. A sua importância no desempenho do projeto Placa de vídeo, ou aceleradora gráfica, é um componente de um computador que envia sinais deste para o monitor, de forma que possam ser apresentadas imagens ao utilizador. Normalmente possui memória própria. Nos computadores de baixo custo, as placas de vídeo estão incorporadas na placa- mãe, não possuem memória dedicada, e por isso utilizam a memória viva do sistema, normalmente denomina-se memória compartilhada. Como a memória viva de sistema é geralmente mais lenta do que as utilizadas pelos fabricantes de placas de vídeo, e ainda dividem o barramento com o processador e outros periféricos para acessá-la, este método torna o sistema mais lento. Isso é notado especialmente quando se usam recursos tridimensionais. Já em computadores bons e mais sofisticados, o adaptador de vídeo pode ter um processador próprio, o GPU ou acelerador gráfico. Trata-se de um processador capaz de gerar imagens e efeitos visuais tridimensionais, e acelerar os bidimensionais, aliviando o trabalho do processador principal e gerando um resultado final melhor e mais rápido. O resultado final normalmente é medido considerando-se o número de vezes por segundo que o computador consegue redesenhar uma cena, cuja unidade é o FPS (quadros por segundo). Analisar tipos de placa e sua importância dentro da computação gráfica. Perfil doméstico Se você é um usuário que utiliza seu computador apenas para navegar na internet, criar documentos, ouvir músicas e realizar tarefas simples, saiba que a aquisição de uma boa placa de vídeo não é necessária para seu perfil. Todas as tarefas que você quiser realizar são possíveis em uma simples placa onboard, que você já deve possuir em seu computador. Perfil profissional básico Se você trabalha com edição de imagens e vídeos ou outras tarefas na parte de design, não tenha dúvida que uma placa de vídeo offboard é fundamental para você. É importante optar pelo menos por uma placa intermediária, visto que alguns programas trabalham com ferramentas tridimensionais e podem desfrutar da GPU. Perfil Gamer Como o próprio nome sugere, os usuários que se encaixam neste grupo são aqueles que procuram se divertir com os mais diversos tipos de games. Obviamente que você não precisa da melhor placa disponível no mercado para executar os jogos mais recentes, porém, caso esteja procurando por tecnologias recentes, uma placa top talvez seja a mais indicada. Perfil entusiasta Você adora ter o melhor e não pode viver sem overclock? Então, você é um entusiasta! Uma placa com duas GPUs é o mais indicado. Talvez, seja interessante até optar por uma configuração SLI ou CrossFire. Perfil profissional avançado Se você deseja montar um estúdio para edição de vídeos em alta definição ou para criação de animações profissionais, então, você se encaixa neste perfil. Placas comuns da série GeForce e Radeon não atendem suas necessidades. Opte por componentes mais robustos, como a ATI FirePro ou a NVIDIA Quadro. Pipeline gráfico Na computação gráfica 3D, o pipeline de gráficos refere-se a sequência de passos utilizados para criar uma representação raster 2D de uma cena 3D. É um dos conceitos mais importantes de computação gráfica existentes e é importante entendê-lo para dominar as APIs gráficas OpenGL e DirectX, pois diversas funções destas APIs agem sobre diferentes estágios do pipeline. ESPAÇO DO OBJETO Object space: Este é o espaço aonde ocorre a modelagem do objeto a partir das primitivas geométricas. Neste espaço não há uma importância de qual sistema de coordenadas foi adotado e o objeto ainda está modelado em espaços infinitos. World space: Este espaço engloba todo universos e permite-nos expressar as coordenadas de forma absoluta, transição do sistema de coordenadas do objeto para o sistema de coordenadas 3D(mundo virtual). A sua origem é a posição da câmera. Camera space: No espaço da câmera iremos escolher o posicionamento da câmera, o alcance de visualização e qual será tipo de projeção. Nem sempre a câmera será igual as coordenadas e assim precisaremos, transportar a cena para o plano da câmera. Clipping space: Nesse espaço está interligada processamentos gráficos, porquê é neste espaço aonde é feito o recorte das primitivas gráfica, e com isso interferindo no processos que são feitos durante a geração desse espaço. Desde o primeiro momento, aonde começamos do espaço do objeto até ao espaço do universo, é feita diversas transformações de primitivas. Logo após é feito o posicionamento da câmera, que indica o que será virtualizado e que posteriormente serão exibidos na tela. Canonical space: O espaço canônico é o espaço que basicamente faz o mapeamento dos pontos para centralizar o volume gerado na etapa anterior para o espaço canônico, formandoo Volume Canônico. Já fizemos muitos movimentos nos objetos que queremos renderizar e muito provavelmente eles estão distantes da origem. Portanto, é nesse espaço que iremos garantir o que será exibido na tela. A tela, é composta pelos valores de largura e altura que sempre são positivas e que o seu "eixo" é no canto superior esquerdo da tela. ENGINE DE RENDERIZAÇÃO (ENGINE 3D) O engine 3D será responsável basicamente pelo pipeline gráfico, que é o processo de gerar imagens 2D partindo de modelos 3D. Este processo é dividido em diversas etapas, sendo as mais importantes: Transformações 3D; Projeção 3D → 2D; Culling; Clipping; Rasterização (iluminação e texturização). Transformações 3D: Nesta etapa aplica-se o movimento aos modelos 3D. Este movimento consiste no seguinte: A cada passo do jogo uma matriz irá acumulando o resultado de todos os movimentos que o objeto sofreu ao longo de seu histórico. Antes de visualizar a cena, será aplicada esta matriz sobre cada vértice que o compõem, posicionando-o no local que lhe corresponde naquele instante; Projeção 3D → 2D: Os vértices que compõem o objeto são coordenadas 3D, porém a imagem do modelo deverá ser desenhada numa superfície bidimensional (tela do computador). Nesta etapa, os vértices do modelo serão projetados sobre o plano de projeção da câmera. É comum encontrar esta etapa do pipeline junto com a etapa de transformações 3D, pois em última instância realizar esta projeção consiste numa aplicação de matriz de transformação também. Culling: Existem inúmeras formas de otimizar o processamento gráfico de um jogo. Uma destas consiste nos métodos de culling (Cull em inglês significa "refugo, escolher, selecionar de dentro de um grupo"). Assim, o que as técnicas de culling terão de fazer é saber escolher polígonos adequadamente, de forma que numa determinada situação, estejam presentes apenas aqueles que realmente importam para a visualização a partir do ponto em que a câmera se encontra. Pode-se pensar também da seguinte forma: quais dos polígonos de uma cena deverão ser enviados para o pipeline da placa gráfica? Obviamente não se deseja enviar algum que não terá nenhuma influência na visualização, mas até que ponto é simples realizar esta escolha, de forma rápida. Existem muitos algoritmos que farão este tipo de escolha. Em muitos casos a eficiência deste procedimento estará atrelada ao tipo de agrupamento e ordem de polígonos (um terreno possui uma distribuição de polígonos completamente diferente de que um personagem ou do que um labirinto). O culling pode ser feito em qualquer estágio do pipeline gráfico. Entretanto, é preferível eliminar os polígonos que não interessam o quanto antes para evitar processamento desnecessário sob polígonos que futuramente poderão ser eliminados. Vale a pena ressaltar que um método de culling não anula outro: podem-se ter os efeitos somados em muitos casos. Clipping: Ao projetar polígonos sobre o plano de projeção da câmera, alguns polígonos cairão totalmente dentro da área da tela e outros cairão parcialmente dentro, ou seja, apenas uma parte do polígono estará na tela de projeção. Para estes polígonos é necessário realizar o clipping (recorte), que consiste em criar novas arestas e vértices; Rasterização: Finalmente, a última etapa do processo de renderização consiste em preencher os polígonos adequadamente, aplicando o material com o qual estão definidos. Inicialmente poder-se-ia pensar em fazer este processo através de um cálculo de iluminação para cada um dos pixels (per pixel) do interior de um polígono. Entretanto isto seria demasiadamente caro em termos computacionais. Para viabilizar este processo realiza-se uma interpolação (rasterização) entre a cor de cada um dos vértices que compõem o polígono. Desta forma, o cálculo de iluminação é feito apenas para cada vértice (per vertex) visível da malha. Esta rasterização também poderia demandar bastante tempo de processamento, pois apesar de ser algo simples de ser feito, existem pixels numa tela. (processo realizado por um hardware específico a placa gráfica, ou GPU – Graphic Processor Unit.) A sua importância para a montagem de sistemas de base. Montagem de sistemas de base O processo básico de geração de imagens tridimensionais por computador para aplicações em tempo real ou interativas, amplamente conhecido por pipeline de visualização. Trata-se de uma estratégia de visualização que proporciona um compromisso razoável velocidade de desenho versus realismo. O propósito desta técnica consiste em criar uma projeção 2D da cena tridimensional, tomando em linha de conta a iluminação e a perspectiva de visualização. O processo assume como entrada uma cena tridimensional, consistindo de objetos descritos por polígonos1, fontes de luz e parâmetros de visualização, e à qual vai ser aplicada uma sequência de andares de cálculo: 1 - Atravessar a base de dados que contém o modelo matemático da cena; 2 - Aplicar o modelo de reflexão local de acordo com o algoritmo de sombreamento; 3 - Aplicar as transformações geométricas de acordo com a posição e a direção de um observador; 4 - Eliminar as faces escondidas (operação designada por back-faces culling); 5 - Executar o recorte e opcionalmente a transformação perspectiva; 6 - Calcular os pixéis que irão ser ativados (scan-conversion); 7 - Calcular a cor de cada um dos pixéis (algoritmo incremental de sombreamento); 8 - Remover as superfícies ocultas; 9 - Implementar eventuais efeitos visuais (ex: mapeamento de texturas, transparências, sombras); 10 - Filtrar os ruídos (anti-aliasing); 11 - Escrever a informação respeitante aos pixels na memória de imagem para visualização (implementa implicitamente a projeção 2D). O fluxo de atividade entre o processo de atravessamento da base de dados da cena e a visualização da imagem numa tela pode ser agrupado em dois grandes blocos funcionais distintos: O bloco dos cálculos geométricos (passos 2, 3, 4 e 5) que fundamentalmente converte as primitivas gráficas descritas em coordenadas do Mundo em primitivas descritas em coordenadas de tela. O bloco de rasterização (passos 6, 7, 8, 9, 10) que converte informação geométrica em pixels na tela com informação de cor. O processamento geométrico opera no Espaço-Objeto e a rasterização opera no Espaço-Imagem. Como se referiu anteriormente, a visualização de cenas tridimensionais numa tela bidimensional implica a execução de uma projeção. Saliente-se que a execução dos passos 1 a 10 envolve operações tridimensionais, ou seja, operações onde é necessário conhecer obrigatoriamente as três coordenadas, como, por exemplo, a profundidade, para poder resolver o problema da visibilidade. Deste modo, a projeção é realizada implicitamente apenas no passo 11 quando se guarda a informação de cor dos pixéis, pois só aqui se acede à informação em x e y, através do acesso à memória de imagem. Bibliotecas gráficas mais utilizadas (OpenGL e DirectX) Introdução De maneira errônea, muitas pessoas acreditam que Computação Gráfica é saber usar programas para editar fotos ou trabalhar com desenhos vetoriais, tais como PhotoShop, Core Draw, 3DStudio… no entanto isso seria limitar a área ao simples uso de aplicações com finalidades específica para criação e manipulação de figuras, desenhos, cores, texturas. Atualmente todas as áreas da computação dependem de aplicações gráficas de alto desempenho. Isso requer naturalmente, grandes recursos de hardware para processar estes ambientes e interfaces, além naturalmente da necessidade de programadores experientes para lidar com as mais diversas bibliotecas e tecnologias existentes. A Computação Gráfica é uma área da Ciência da Computação dedicada ao estudo e desenvolvimento de técnicase algoritmos para geração de imagens, bem como análise e manipulação das mesmas. Está presente em diversas áreas do conhecimento, que vão desde aplicações para Engenharia em projetos e modelagem de objetos, simuladores e na criação de jogos eletrônicos. A Computação Gráfica surge somente após a criação de periféricos gráficos de entrada e saída, pois antes as informações eram representadas somente por meio de caracteres alfanuméricos. A quantidade de cálculos matemáticos em aplicações gráficas necessita de muita memória e recursos de processamento em termos de velocidade. Para aproveitar melhor a capacidade de hardware e facilitar a criação de aplicações gráficas, o mais comum é que programadores utilizem bibliotecas prontas que trazem uma infinidade de funcionalidades rotinas comuns. No caso específico da Computação Gráfica, programadores necessitam de rotinas gráficas para elaborar rapidamente programas sem ter a preocupação de desenvolver algoritmos básicos, tais como um segmento de reta, inclinação, preenchimento de objetos e etc. A Open Graphics Library – OpenGL pode ser compreendida como um conjunto de rotinas gráficas e de modelagem que facilita o desenvolvimento de aplicações gráficas, sejam elas bidimensionais ou tridimensionais. A OpenGL é gerenciada por um consórcio independente formado em 1992 formado por diversas empresas tais como 3DLabs, Apple, NVIDIA, SGI, ORACLE (SUN), Microsoft e diversas outras. A OpenGL se trata de uma API para a criação de programas gráficos 2D e 3D multiplataforma que serve tanto para estações de trabalho potentes ou computadores pessoais. Seu funcionamento é semelhante a uma biblioteca da linguagem de programação C. Um programa ou aplicação baseado em OpenGL pode ser escrito em alguma linguagem de programação que utiliza uma ou mais rotinas da biblioteca OpenGL. Para facilitar o desenvolvimento de aplicações gráficas, há algumas bibliotecas que nos auxiliam com diversas funções para criar janelas e gerenciar eventos. As mais utilizadas são a GLU e a GLUT. A GLU (OpenGL Utility Library) é mais comum e instalada com a OpenGL. Seguem uma rígida padronização nos nomes das funções, sendo utilizado sempre o prefixo glu. Destacamos que é usada na definição de matrizes para projeção e orientação da visualização, mapeamento de coordenadas e desenho de superfícies quadráticas. A GLUT (OpenGL Utility Toolkit) foi desenvolvida para facilitar o desenvolvimento de interfaces. É um kit de ferramentas independente de plataforma que inclui alguns elementos de GUI (Graphical User Interface). Com a CLUT podemos por exemplo criar menus pop-ups, gerenciar eventos de teclado, mouse. Entendemos que a GLUT encapsula a complexidade das APIs dos vários sistemas de janelas que existem hoje em dia. A melhor biblioteca gráfica dependendo do seu uso e a sua importância dentro da computação gráfica. OpenGl: OpenGL é definida como "um programa de interface para hardware gráfico". Na verdade, OpenGL é uma biblioteca de rotinas gráficas e de modelagem, bi (2D) e tridimensional (3D), extremamente portável e rápida. Usando OpenGL é possível criar gráficos 3D com uma qualidade visual próxima de um ray tracer. Entretanto, a maior vantagem na sua utilização é a rapidez, uma vez que usa algoritmos cuidadosamente desenvolvidos e otimizados pela Silicon Graphics, Inc., líder mundial em Computação Gráfica e Animação. DirectX DirectX é um Conjunto de APIs multimídia da Microsoft para Windows. É composto por diversas APIs como DirectInput, directSound, direct3D, além de alguns outros. É muito utilizado em diversos aplicativos para Windows (uma vez que não é multiplataforma) sendo jogo um tipo desses aplicativos A versão mais atual da API Direct3D, a principal dentre as que vem com a API é a 11. Nas edições atuais algumas APIs foram depreciadas e por isso não são inclusas com o DirectX, sendo uma delas a DirectSound. Como a evolução da Computação Gráfica depende da evolução do hardware, recentemente, as novas gerações de placas gráficas possibilitaram o desenvolvimento de várias aplicações e um grande avanço em muitas áreas da CG. Por exemplo, os jogos eletrônicos hoje apresentam imagens com alto grau de realismo, além de permitir a conexão de jogadores através da Internet. Muitas imagens podem ser geradas em tempo real devido à possibilidade de programar o hardware gráfico. Isso também tem beneficiado a área de visualização, que, em geral, trabalha com uma grande quantidade de dados que pode ser armazenada na memória das placas gráficas. Por isso, a programação de hardware gráfico tem sido uma área em grande evolução. A Unidade de Processamento Gráfico – do inglês “Graphics Processing Unit"(GPU) foi desenvolvida inicialmente como um hardware destinado a aumentar a eficiência e o poder de processamento gráfico para tarefas de renderização. Hoje, a GPU apresenta-se como um hardware de processamento versátil e de alto poder de computação. Tornou-se uma possibilidade real na busca por soluções para processamento em grandes volumes de dados, seja como complemento, seja como alternativa ao uso de CPUs multicore ou de sistemas distribuídos. A utilização da GPU em computações de propósito geral é de especial interesse, uma vez que para diversas aplicações, ainda não existem formulações sequenciais suficientemente rápidas de serem computadas. Unidade II – Funcionamento interno de um Game INTRODUÇÃO AS APIS Existem muitas bibliotecas de programação de uma interface gráfica para um software. E a portabilidade, a rapidez de execução, a velocidade e o custo de desenvolvimento, a estabilidade e a licença de seu software dependerão da sua escolha de biblioteca de gráfica. AS API NATIVAS A Api gráfica do Windows Alguns sistemas implementam sua interface gráfica no próprio sistema operacional, é o caso do Windows cuja parte gráfica se encontra dentro do núcleo do sistema operacional. Como mencionado anteriormente, a interface gráfica do Windows não é implementada no nível do usuário, mas no nível do kernel, que tem a vantagem de obter interfaces de rápida execução. No entanto, o uso direto da API (Application Programming Interface ou Interface de Programação de Aplicativos) do Windows também tem muitas desvantagens: AS API NATIVAS Esta API tem pouca abstração, o gerenciamento da IHC (Interação humano- computador) é feito através do uso de funções de baixo nível. Desenvolver uma IHC com esta API vai demorar mais e pode esconder alguns bugs. No entanto, uma biblioteca, cuja abordagem é de baixo nível poderá, eventualmente, permitir mais possibilidades em gráficos. Esta API não é portátil. O seu software não pode ser usado fora do Windows, a menos que você use a emulação. Você pode usar esta API em C ou C++ usando os MFC e, claro, em vários idiomas. Note que a programação de interfaces gráficas como uso da API do Windows é, muitas vezes, mais confortáveis com IDE como o Microsoft Visual C++. Xwindow É uma biblioteca de terceiros, mas como ela se situa na base do sistema IHC, em alguns Sistemas Operacionais como o Linux/Unix. Você pode usar XWindows para desenvolver interfaces gráficas, mas ainda neste caso você corre o risco de ter uma biblioteca com pouca abstração e que, portanto, exigirá mais tempo de desenvolvimento. Por outro lado, você obterá um software totalmente portátil: XWindow também existe no Windows. Outro ponto importante, algumas implementações do Xwindow são livres (XFree, XOrg). Qt Qt é uma biblioteca gráfica portátil, disponível para o Unix/Linux e o Windows. Ele é conhecido por ter uma arquitetura confortável. Qt é destinado ao uso em C++, mas você também pode usá-lo com muitas outras linguagens (C/Python, etc ...). Como exemplo de Qt, basta ver o desktop KDE no Linux ou no softwareAmarok. GTK Como a Qt, GTK é uma biblioteca livre e portátil. Também é apreciada. O software Gimp, por exemplo, foi feito com a Gtk. Outro exemplo é o desktop Gnome usado no Linux. Gtk foi escrita em C mas pode ser utilizada em várias outras linguagens. WxWidgets Sua particularidade é a de produzir janelas com a mesma aparência como se ela tivesse sido programada usando a API nativa do sistema. Linguagens básicas para programação em API. API Uma API (Aplicação Programável Interface, ou “interface de programação” ou “interface para o acesso programado às aplicações) é um conjunto de funções que permitem aceder aos serviços de uma aplicação, através de uma linguagem de programação. Uma API permite fornecer um certo nível de abstração ao programador, o que quer dizer que ela mascara a complexidade do acesso a um sistema ou a uma aplicação, propondo um jogo de funções standard das quais só os parâmetros e os valores devolvidos são conhecidos. Assim, por analogia com um automóvel, o motorista não tem de conhecer o funcionamento mecânico do motor de um veículo para poder conduzi-lo. Apenas uma interface, composto por um volante, pedais, quatro piscas, faróis de nevoeiro, buzina, etc. lhe é acessível: trata-se, de certa maneira, da interface proposta ao utilizador. Graças ao API, um programador não tem, por conseguinte, de se preocupar com a forma como uma aplicação distante funciona, nem com a maneira como as funções foram aplicadas para poder utilizá-las num programa. Uma API pode estar disponível para uma linguagem específica ou estar disponível para várias linguagens de programação. Framework O termo “Aplication Framework” (traduzam “Quadro de aplicação”, “planos de aplicação” ou “base de aplicação”) designa um conjunto estruturado de API, organizado num ambiente de execução. O termo “Aplicação Framework” é utilizado geralmente sob a forma abreviada de “Framework” Exemplos de bibliotecas – OpenGL: conjunto de funções para desenhar diretamente no buffer da placa de vídeo; – OpenCV: conjunto de funções para processamento de imagem e visão computacional; – OpenAL: conjunto de funções para processamento, síntese e execução de áudio. Na prática, para usar uma biblioteca basta incluir uma chamada para ela no início do código, por exemplo: Para usar OpenGL em C ou C++ devemos ter uma linha no início do código assim: #include “GL/gl.h” “gl.h” é uma INTERFACE de programação que contém declarada todas as funções de OpenGL que você pode usar no seu programa. A diferença entre uma biblioteca e um aplicativo é que: Um aplicativo tem um executável (arquivos binários no Linux ou “.exe” no windows) e Uma biblioteca não tem, pois ela é só um conjunto de funções pré- compiladas (no linux arquivos. O, no windows arquivos .dll) Não faz sentido bibliotecas serem executadas do nada, elas devem ter suas funções chamadas por aplicativos. C++ Linguagem de programação compilada multi-paradigma (seu suporte inclui linguagem imperativa, orientada a objetos e genérica) e de uso geral. A linguagem é considerada de médio nível, pois combina características de linguagens de alto e baixo níveis. Desde os anos 1990 é uma das linguagens comerciais mais populares, sendo bastante usada também na academia por seu grande desempenho e base de utilizadores. Bjarne Stroustrup desenvolveu o C++ (originalmente com o nome C com classes) em 1983 no Bell Labs como um adicional à linguagem C. Novas características foram adicionadas com o tempo, como funções virtuais, sobrecarga de operadores, herança múltipla, gabaritos e tratamento de exceções. Após a padronização ISO realizada em 1998 e a posterior revisão realizada em 2003, uma nova versão da especificação da linguagem foi lançada em dezembro de 2014, conhecida informalmente como C++ O Processo de Game Loop É a estrutura base de qualquer implementação de Jogo Digital e deve ser corretamente estruturado para que tenhamos o comportamento correto em nosso Jogo. “O personagem está parado esperando que o usuário acione alguma coisa para que ele possa executar, mas o jogo está acontecendo...” A partir da visão do personagem, nos mostra que para que as coisas fluam dentro do jogo não é necessário nenhum evento externo. O fluxo do jogo segue na linha do tempo atualizando o estado de cada objeto, independentemente de qualquer comando. Essaé a ideia de Game Loop. COMO FAZER Olhando o referencial do programador, vamos formalizar a ideia de Game Loop e transforma-la em um pseudo-código. Primeiramente podemos perceber que o Game Loop é executado incessantemente e que a única situação em que ele para, é quando o jogo não está em execução. Uma estrutura que formaliza essa ideia do ponto de vista das linguagens de programação são os laços de repetição. Um exemplo prático bem simplório seria: O comando onEnterFrame no actionScript. onEnterFrame=function(){ código que se repetirá durante a espera de um comando } Outro seria um laço de while While (jogo_parado){ código que se repetirá durante a espera de um comando Incrementa algo } O CONCEITO enquanto (oJogoEstaRodando) inicio calcule a proxima posicao do inimigo com base na atual se (o inimigo atingiu a parede) inverta a direção senão assume a posicao calculada fim se pinte a situacao de jogo atual espere 40 milisegundos fim NA PRÁTICA while (isRunning) { game.processLogics(); game.renderGraphics(); sleep(40); } O método sleep public void sleep(int millis) { try { Thread.sleep(millis); } catch (InterruptedException e) {} } O ciclo de vida de um jogo Um jogo normalmente passa pelas seguintes fases: Inicialização/Carregamento; Game Loop; Unload/Shutdown. Inicialização/Carregamento Define os valores padrão e preliminares, consulta e inicializa informações baseadas no usuário, carrega os conteúdos gráficos e os não gráficos, etc. Game Loop Executa a lógica de repetição do jogo e os cálculos de layout e renderização. Unload/Shutdown Salva o estado atual, libera e descarrega conteúdos, etc. Unidade III – Programando Shaders I Tipos de shaders e suas características INTRODUÇÃO Até pouco tempo atrás, pelos idos de 2003, predominava a renderização gráfica pelas GPUs através do pipeline fixo, pelo qual passa todo o dado de uma aplicação gráfica 3D que usava efetivamente uma placa de vídeo. Apesar de rápido e com a velocidade crescendo a cada dia, tal processo apresentava limitações, uma vez que não era possível ter um controle fino sobre o dado que era passado pelo pipeline, sendo que estes se sujeitavam aos algoritmos internos realizados na renderização e presentes dentro da própria GPU. Com a necessidade de realismo e desempenhos combinados crescendo sempre, motivada pela demanda dos consumidores quer sejam eles usuários comuns de aplicações gráficas, quer sejam pesquisadores científicos, muitos métodos haviam surgido para aumentar o realismo na imagem, vários deles através da renderização de multipasse. Entretanto, isto não foi o suficiente e a disputa comercial aliada aos rápidos avanços na área de computação gráfica, tiveram como consequência o surgimento dos shaders, ou seja, o nascimento das primeiras placas de vídeo com pipeline programável. Destas placas a primeira placa de vídeo com alguma presença de shaders foi a Geforce 3 TI que possibilitava ao desenvolvedor programar um vertex shader. Obviamente, que como era uma tecnologia nova, ela enfrentava uma série de limitações que com o tempo foram superadas ou, minimizadas. Seguindo o modelo criado pela Geforce 3 TI, outras placas de vídeo começaram a incorporar shaders em sua arquitetura, dando maior flexibilidade e controle do programador sobre os programas gráficos produzidos.Não demorou muito para que o DirectX 8 introduzisse suporte a shaders e para que o OpenGL 1.4 o fizesse também na forma de uma extensão padronizada pela ARB (Architeture Review Board), organização que era responsável na época pela decisão quanto aos rumos do OpenGL. Contudo, ainda que tal flexibilidade fosse possível, o código para que fosse possível manipulá-la era um tipo de Assembly, padronizado pela ARB. Porém, ainda que padronizado o assembly da placa de vídeo, como de qualquer outro hardware, é programação em baixo nível, sendo propensa a erros. Dessa dificuldade surgiram pesquisas que culminaram nas invenções das linguagens de shading de alto nível CG, HLSL, GLSL, as quais baseavam suas estruturas no C e, conseqüentemente retiravam uma grande parte da complexidade da implementação, bem como, diminui o tempo de aprendizagem da linguagem, por se basear numa linguagem amplamente conhecida e difundida, o C. Assim desde 2003 até 2009, ano da presente publicação muitos avanços ocorreram como o aprimoramento dos pixeis e vertex shaders, a criação do shader de geometria, a unificação dos shaders nas placas de vídeo mais modernas e o amplo interesse acadêmico na GPU e o possível uso desta para uso não apenas de aplicações gráfica, mas de aplicações de propósito geral, GPGPU (General Purpose GPU). O PIPELINE PROGRAMÁVEL O pipeline programável nada mais é do que a repetição dos eventos que ocorrem no pipeline fixo, mas com um controle mais fino pela parte do programador, já que permite que este programe certos estágios do pipeline, alterando a saída que resultaria deste em sua versão fixa. Para isto existem três tipos de shader. O vertex shader, o geometry shader e o pixel shader. Cada um deles será explicado mais adiante com suas características, a fim de expor a funcionalidade de cada um, deixando claro porquê é usado e como é usado. VERTEX SHADER Tem por responsabilidade substituir o processo de manipulação dos vértices presente no pipeline fixo, permitindo ao programador manipular as transformações geométricas, o posicionamento e cor dos vértices, bem como o processo de iluminação e geração de coordenas de textura na parte dos vértices. Diante de suas responsabilidades o vertex shader é extensivamente usado, estando presente nos mais variados tipos de algoritmos aplicados ao programa em si e, portanto, tem importância fundamental no contexto do pipeline programável. Frente a esta posição ele vêm sofrendo constantes avanços, evoluindo junto e, em paralelo, aos outros shaders, à medida que o hardware evolui. GEOMETRY SHADER O Geometry Shader não tem correspondência no pipeline fixo de renderização. Sua principal função é a de criar ou remover vértices, permitindo um maior controle na geometria que passa pelo pipeline programável, aumentando ou diminuindo o nível de detalhe de acordo com o necessário, permitindo com que uma enorme variedade de efeitos sejam possíveis, como melhor interpolação de vértices com a adição de novos vértices quando necessário, renderização de silhueta, entre outros. Apesar de ser flexível e capaz de uma série de efeitos interessantes o Geometry Shader é relativamente novo, sendo incluído na API DirectX em sua versão 10, no ano de 2006, este shader é ineficiente se comparado com os outros e deve ser usado cuidadosamente para que se tire proveito de seus benefícios e o resultado seja um shader eficiente em sua tarefa. PIXEL SHADER (FRAGMENT SHADER) Para dar mais poder de expressão e flexibilidade aos artistas e programadores as linguagens de shading foram inventadas. As primeiras delas eram offline, uma vez que para a época (1995) era proibitiva a renderização em tempo real com código de shading programável. Assim softwares como o Renderman e XXX foram inteiramente produzidas para se utilizarem renderização por software. Com o tempo foram inventadas outras linguagens para o mesmo fim até que finalmente surgissem as linguagens de shading para shaders de Placas de vídeo renderizando em tempo real. bbEfeitos básicos com shaders INTRODUÇÃO Efeitos são entidades que podem encapsular vários shaders diferentes, além de configurações dos estados do pipeline fixos necessárias para a execução do mesmo. Em cada efeito é possível criar uma ou mais técnicas, que são utilizadas na renderização das malhas. Cada técnica criada deve definir quais shaders serão utilizados para o processamento de vértices, geometria e pixels. Isso permite, por exemplo, que duas técnicas diferentes possam utilizar um mesmo processamento de vértices, mas possuam diferentes processamentos de pixels. A técnica a ser utilizada na renderização de um objeto pode ser escolhida em tempo de execução de acordo, por exemplo, com os recursos do hardware gráfico do usuário. TIPOS DE EFEITOS Iluminação; Texturas; Operações matemáticas. ILUMINAÇÃO Teoria – Phong Lighting - Esta técnica para o cálculo de iluminação foi desenvolvida por Bui Tuong Phong na universidade de Utah em 1973. Na época de sua concepção ela foi considerada radical (pois era simples demais comparado com os modelos da época), entretanto hoje é o mais utilizado em aplicações de tempo real. O modelo Phong é essencialmente uma aproximação empírica de um sistema de iluminação local (sistemas que consideram apenas a luz que incide diretamente nos objetos). Ele descreve como uma superfície reflete a luz, sendo uma combinação da reflexão difusa, da reflexão especular e da reflexão ambiente. Para uma explicação mais física (incluindo conceitos de Irradiancia, radiancia ... ) recomendo a segunda parte do livro Principles of Digital Image Synthesis. TEXTURA Uma das primeiras formas de acrescentar detalhes em uma renderização sem acrescentar geometrias é através da utilização de texturas. Geralmente uma textura é uma imagem 2D composta por texels (texture elements) que é aplicada sobre um triângulo. Esta definição restringe uma gama de aplicações interessantes que podemos fazer, por este motivo textura para este tutorial deve ser vista por uma visão mais geral: É uma função que mapeia uma coordenada n-dimensional a uma informação de 4 componentes que pode representar uma cor. OPERAÇÕES MATEMÁTICAS Na fase de modelagem são definidas as formas geométricas, bem como suas posições e proporções. Ou seja, o espaço virtual é confeccionado considerando, principalmente, o dimensionamento físico dos objetos que constituem a cena. Após a modelagem, torna-se necessário aplicar um conjunto de algoritmos que melhorem a impressão visual da cena, ou seja, deve-se aplicar um acabamento final para que a imagem possua características foto-realísticas, aproximando o ambiente virtual do real. Dessa maneira, há sensação de imersão de um usuário em um jogo ou em um aplicativo gráfico qualquer (daí a necessidade de um bom posicionamento e movimentação da câmera virtual). Para criar esse realismo são utilizados algoritmos de textura como bump mapping, parallax mapping e displacement maping. Além disso, também podem ser utilizados algoritmos de iluminação global, como radiosidade ou ray-tracing, ou até mesmo o acréscimo de efeitos na iluminação local, como técnicas para gerar sombras, refração e outros.Esta última etapa é essencial para obter uma alta qualidade na cena, porém o custo computacional é muito alto dificultando a criação de projetos que necessitam de tonalização em tempo real. TRANSPARÊNCIAS Para criar esse realismo são utilizados algoritmos de textura como bump mapping, parallax mapping e displacement maping. Além disso, também podem ser utilizados algoritmos de iluminação global, como radiosidade ou ray-tracing, ou até mesmo o acréscimo de efeitos na iluminação local, como técnicas para gerar sombras, refração e outros. Esta última etapa é essencial para obter uma alta qualidadena cena, porém o custo computacional é muito alto dificultando a criação de projetos que necessitam de tonalização em tempo real. Unidade IV – Programando Shaders II Efeitos avançados com shaders TIPOS DE EFEITOS Reflexos; Contornos; Vector-shaders; Screen-space; Post-processing. Reflexos: Cria efeitos de reflexo, junto com o efeito de iluminação. Contornos: Detecta e modifica os contornos em tempo real. Vertex shader : Manipula vértices e consequentemente o formato de objetos. Esses vértices são então enviados para os geometry shaders. Screen-space: (Mapeamento de espaço na tela) Mapeamento de espaço na tela é uma técnica para projetar texturas planas da câmera. A configuração do nó para isso é bastante simples. O nó da posição da tela indica a posição do pixel atual que está sendo processado, no espaço da tela. Ele é definido como "lado a lado" para evitar que se estenda por toda a tela. Post-processing: (pós-processamento) Esta configuração possui efeitos diferentes para cada jogo. O mais comum são efeitos de luz como o "bloom" (que é quando a luz se espalha suavemente pelo cenário) ou o "motion blur" (que simula o borrão de luz quando há movimentos rápidos). Outro efeito deste parâmetro é a simulação da mudança de luz quando se passa de um ambiente muito escuro para um muito iluminado, como aquele clarão que nos deixa cego até nossos olhos se acostumarem, e vice-versa. BIBLIOGRAFIA HUGHES, John F. et al. Computer graphics: principles and practice. Pearson Education, 2013. LENGYEL, Eric. Mathematics for 3D game programming and computer graphics. Cengage Learning, 2012. BORESKOV, Alexey; SHIKIN, Evgeniy. Computer Graphics: From Pixels to Programmable Graphics Hardware. CRC Press, 2013. BIBLIOGRAFIA COMPLEMENTAR: BUCKLAND, Mat. Programing AI By Example. Texas: Wordware Publishing, Inc., 2005. 521 p. LUNA, Frank D. Introduction to 3D game programming with DirectX 10. Jones & Bartlett Publishers, 2008. WRIGHT, Richard S. et al. OpenGL SuperBible: comprehensive tutorial and reference. Pearson Education, 2010.
Compartilhar