Baixe o app para aproveitar ainda mais
Prévia do material em texto
AED - WebGL Aluno: Arthur Guilherme De Sousa Alves Goiânia 2018 Introdução WebGL é uma API (Application Program Interface - do inglês, Interface de Programação de Aplicativos) em JavaScript para a renderização de um contexto 3D para a web [1]. Possui as mesmas funcionalidades do OpenGL ES 2.0 por ser derivada deste, porém aplicadas num contexto HTML. A utilização dessa nova tecnologia foi possível recentemente junto com o lançamento do elemento Canvas do padrão HTML 5, em 2014, e possui a proposta de possibilitar à plataforma web o desenvolvimento de aplicações que utilizem computação gráfica, somente com o uso de navegadores. Isso aumenta a portabilidade dos softwares desenvolvidos, uma vez que o mesmo código que funciona em um laptop, por exemplo, funcione em um smartphone com os recursos necessários. Conceito Geral Num conceito geral, o WebGL possibilida exibir gráficos 3D em tempo real no navegador, porém, o WebGL é uma API 2D, e não uma API 3D, pois o mesmo só se preocupa com as Coordenadas do espaço de disco em 2D e cores, onde o programador fornece as informações necessárias para o WebGL. Para isso, deve-se fornecer dois “shaders” para que o processo acima seja realizado. Um sombreador Vertex que fornece coordenadas do espaço de clipes e um sombreador de fragmento que fornece as cores. As coordenadas do espaço de disco sempre vão de -1 a +1, independentemente do tamanho da sua tela Devemos nos atentar também, para alguns outros fatores, responsáveis por permitir a execução dos códigos dentro do navegador, criando os resultados desejados, como por exemplo: Shaders Nas APIs gráficas, um sombreador é um programa de computador usado para sombreamento: a produção de níveis apropriados de cor em uma imagem, ou seja, Shaders são programas que são executados no hardware gráfico. Em APIs gráficas modernas, elas são partes obrigatórias do pipeline gráfico (o pipeline fixo não é mais suportado). Cada pixel desenhado para a tela deve ser processado por shaders, não importa quão frágil ou frio seja. Alguns tipos de shader são opcionais e podem ser ignorados, mas não todos. Quanto processamento é feito em shaders e quanto é feito na CPU, cabe ao desenvolvedor decidir. Pode-se ter shaders muito simples e fazer tudo na CPU. Outra opção é dividir a carga entre os dois. Ou talvez faça tudo em shaders. Enquanto cabe ao desenvolvedor decidir, o que o desenvolvedor escolher afetará significativamente o desempenho do aplicativo. Pipeline Gráfico para o WebGL Como o WebGL deve ser executado em navegadores, ele deve ser universal o suficiente para funcionar em computadores e dispositivos móveis. Portanto, WebGL e OpenGL ES compartilham muito. O WebGL 1.0 é baseado e equivalente ao OpenGL ES 2.0, e o WebGL 2.0 é baseado e equivalente ao OpenGL ES 3.0. A linguagem de sombreamento usada no WebGL é a mesma usada no OpenGL ES. É chamado de GLSL ES (OpenGL Shading Language). Portanto, esse também é o pipeline do WebGL. Vertex Shader Um shader de vértice é dado a cada um desses vértices e pode mexer com eles. Cabe ao shader de vértices o que ele realmente faz com cada um, mas tem uma responsabilidade: ele deve em algum momento definir algo chamado gl_Position, um vetor 4D float, que é a posição final do vértice na tela. Por si só, é um processo de obtenção de uma posição 3D (um vértice com x, y, z) para uma tela 2D ou projetada para ela. Fragment Shader Muito parecido com o shader de vértice, o shader de fragmento também tem apenas um trabalho obrigatório: ele deve definir ou descartar a variável gl_FragColor , outro vetor 4D float, que é a cor final de nosso fragmento, ou seja, Um Fragment Shader é o estágio Shader que processará um Fragment gerado pela Rasterização em um conjunto de cores e um único valor de profundidade. O fragment shader é o estágio do pipeline OpenGL depois que uma primitiva é rasterizada. Para cada amostra dos pixels cobertos por um primitivo, um "fragmento" é gerado. Cada fragmento possui uma posição de espaço na janela , alguns outros valores e contém todos os valores de saída por vértice interpolados do último estágio de processamento de vértice . A saída de um sombreador de fragmento é um valor de profundidade, um possível valor de estêncil (não modificado pelo sombreador de fragmento) e zero ou mais valores de cores a serem potencialmente gravados nos buffers nos framebuffers atuais. Os shaders de fragmento usam um único fragmento como entrada e produzem um único fragmento como saída. Variáveis do Shader 1. Uniformes são enviados para ambos os shaders de vértice e fragment shaders e contêm valores que permanecem os mesmos em todo o quadro que está sendo renderizado. Um bom exemplo disso pode ser a posição de uma luz. 2. Atributos são valores aplicados a vértices individuais. Atributos estão disponíveis apenas para o shader de vértice. Isso poderia ser algo como cada vértice ter uma cor distinta. Atributos têm um relacionamento de um para um com vértices. 3. Variáveis são variáveis declaradas no shader de vértice que queremos compartilhar com o shader de fragmento. Para fazer isso, certificamos-nos de declarar uma variável variável do mesmo tipo e nome no shader de vértice e no shader de fragmento. Um uso clássico disso seria um vértice normal, já que isso pode ser usado nos cálculos de iluminação. API Para compreendermos o conceito geral do WebGL, deve-se entender o conceito de API: API é um conjunto de rotinas e padrões de programação para acesso a um aplicativo de software ou plataforma baseado na Web. A sigla API refere-se ao termo em inglês "Application Programming Interface" que significa em tradução para o português "Interface de Programação de Aplicativos" Através das APIs, os aplicativos podem se comunicar uns com os outros sem conhecimento ou intervenção dos usuários. Elas funcionam através da comunicação de diversos códigos, definindo comportamentos específicos de determinado objeto em uma interface. A API liga as diversas funções em um site de maneira que possam ser utilizadas em outras aplicações. Sistemas de pagamento online são um bom exemplo de funcionalidade das APIs que rodam de maneira automática. De modo geral, a API é composta de uma série de funções acessíveis somente por meio de programação. Recentemente, a utilização das APIs tem se espalhado nos plugins, que complementam a funcionalidade de um determinado programa. Os desenvolvedores de um programa principal criam uma API específica e fornecem a outros criadores, que desenvolvem plugins para aumentar o potencial e as funcionalidades do programa. Canvas O “Canvas” elemento e o WebGL não são suportados em alguns navegadores mais antigos, mas são suportados em versões recentes de todos os principais navegadores. Para desenhar gráficos na tela, usamos um objeto de contexto JavaScript, que cria gráficos dinamicamente Resumindo, o Canvas é “uma tela de bitmap dependente de resolução que pode ser usada para a renderização de elementos gráficos ou outras imagens visuais rapidamente”. Em termos leigos, o canvas é um elemento novo em HTML5, que permite que se desenhem elementos gráficos usando JavaScript. Ele pode ser usado para renderizar texto, imagens, gráficos, linhas gradientes e outros efeitos dinamicamente. Desenhar na tela se dá através da API de tela 2D. Essa API contém uma variedade de funções que fornecem o poder de se desenhar praticamente o que se queira na tela. Atualmente, a tela suporta uma interface 2D, não 3D Processamento de Imagens WebGL Para desenhar imagens no WebGL, precisamos usar texturas. Da mesma forma que o WebGL espera coordenadas do espaço de clipes ao renderizar em vez de pixels, o WebGL espera coordenadas de textura ao ler uma textura. As coordenadas de textura vão de 0,0 a 1,0,independentemente das dimensões da textura. Para desenhar apenas um único retângulo (bem, 2 triângulos), deve-se informar ao WebGL qual é o lugar na textura a que cada ponto no retângulo corresponde. Ao passar essa informação do shader de vértice para o shader de fragmento usando um tipo especial de variável chamado "variando". É chamado de variável porque varia. O WebGL interpola os valores fornecidos no shader de vértice conforme desenha cada pixel usando o shader de fragmento. Usando o shader de vértice do final da seção anterior, precisamos adicionar um atributo para passar coordenadas de textura e, em seguida, passá-las para o shader de fragmento Diferenças entre OpenGL e WebGL O WebGL é baseado na especificação OpenGL ES 2.0 e mantém a semântica do OpenGL ES para maximizar a portabilidade para dispositivos móveis. Existem algumas diferenças significativas no comportamento de APIs semelhantes entre o OpenGL ES 2.0 e a API OpenGL em sistemas de desktop. Muitos programadores OpenGL estão familiarizados com a semântica na área de trabalho e podem não conhecer essas diferenças de comportamento Abaixo, mostraremos um exemplo do uso do WebGL. //Inicialização - struct VertexShaderInput { float4 Position : POSITION0; float4 Normal : NORMAL0; float2 texcoords : Texcoord0; }; struct VertexShaderOutput { float4 Position : POSITION0; float2 texcoords : Texcoord0; }; // código do vertex shader VertexShaderOutput VertexShaderFunction(VertexShaderInput input) { VertexShaderOutput output; output.Position = mul(input.Position, ModelViewProj); output.texcoords = input.texcoords; return output; } //geração de cores/texturas - Textura de um quadrado float4 CreateRectTexture(VertexShaderOutput input) : COLOR0 { float4 color; if( input.texcoords.x < 0.05 || input.texcoords.y < 0.05 || input.texcoords.y > 0.95 || input.texcoords.x > 0.95 ){ color= float4( 1,0,0,1 ); } else{ color = float4(0,0,0,0); } return color;; } //Representação gráfica Referências Bibliográficas <https://www.html5rocks.com/en/tutorials/webgl/shaders/> Acesso em: 10/12/2018 <https://www.khronos.org/registry/webgl/specs/latest/2.0/>Acesso em: 10/12/2018 <https://www.khronos.org/opengl/wiki/Fragment_Shader>Acesso em: 10/12/2018 <https://gamedevelopment.tutsplus.com/tutorials/getting-started-in-webgl-part-1-introduction-to-s haders--cms-26208>Acesso em: 10/12/2018 <https://mozillabr.org/2017/05/o-firefox-suporta-webgl-2-que-permite-uma-nova-geracao-de-grafi cos-3d-na-web/>Acesso em: 10/12/2018 https://www.html5rocks.com/en/tutorials/webgl/shaders/ https://www.khronos.org/registry/webgl/specs/latest/2.0/ https://www.khronos.org/opengl/wiki/Fragment_Shader https://gamedevelopment.tutsplus.com/tutorials/getting-started-in-webgl-part-1-introduction-to-shaders--cms-26208 https://gamedevelopment.tutsplus.com/tutorials/getting-started-in-webgl-part-1-introduction-to-shaders--cms-26208 https://mozillabr.org/2017/05/o-firefox-suporta-webgl-2-que-permite-uma-nova-geracao-de-graficos-3d-na-web/ https://mozillabr.org/2017/05/o-firefox-suporta-webgl-2-que-permite-uma-nova-geracao-de-graficos-3d-na-web/
Compartilhar