Renderização: diferenças entre revisões

Conteúdo apagado Conteúdo adicionado
Rendering
Etiqueta: Internetês ou miguxês
bot: revertidas edições de 177.203.79.62 ( modificação suspeita : -40), para a edição 35756219 de 189.105.146.57
Linha 23:
== Renderização de uma página Web ==
Este termo também é usado quando o navegador web (browser) já recebeu uma nova página (script html - por exemplo), mas a tela ainda não esta totalmente formada (quanto a apresentação).
 
Processo Físico
 
Quando olhamos para um objeto ou uma cena, os raios de luz são emitidos, por uma fonte de luz, em todas as direções. Alguns destes raios atingem o objeto que estamos observando. O objeto absorve parte da luz que o atinge, e o restante é refletido por sua superfície. Parte desta luz refletida pode atingir os nossos olhos.
Uma técnica comum usada em computação gráfica, e bastante eficiente, é a emissão de raios, ou ray-tracing. O ray-tracing simula a interação dos raios de luz com o ambiente, seguindo o caminho percorrido por cada raio. O traçado de um grande número de raios, dos quais uma pequena parte apenas contribui de fato para o resultado, teria um custo proibitivo. Por isso, seguimos o caminho do raio ao contrário: a partir do ponto em que ele atinge o olho do observador, voltamos para determinar quais objetos ele atingiu desde que saiu da fonte de luz. Quando o raio atinge o objeto em um certo ponto, podemos determinar se o ponto está sendo iluminado pela fonte, traçando o raio a partir do ponto de intersecção até a fonte de luz. Se o raio atinge a fonte, esse ponto está sendo diretamente iluminado. O ray tracing gera imagens foto-realistas (ou quase), mas para isso incorre em um alto custo computacional, e é lento (geralmente é implementado em software). Existem outras abordagens, em particular o algoritmo scanline, que produz resultados mais limitados, mas tem um custo computacional menor.
 
Métodos Image-Order x Object-Order
O ray-tracing é um método do tipo image-order, que funciona tentando determinar o que acontece para cada raio de luz, um de cada vez, ou seja, determina a imagem pixel a pixel: para pixel, descobre com que cor ele deve ser ‘pintado’. Um processo do tipo object-order funciona renderizando os objetos que compõem a cena, um de cada vez. No exemplo acima, um processo deste tipo tentaria renderizar o chão, e depois o cubo (de forma análoga a que um pintor pintaria um quadro). Em geral, este tipo de processo pode ser implementado em hardware (existe hardware dedicado para renderizar certos tipos de primitivas, como triângulos, por exemplo), garantindo sua rapidez.
 
Surface Rendering x Volume Rendering
Renderizamos as superfícies apenas, sendo que o interior do objeto não é considerado explicitamente. O interior está delimitado pela fronteira, ou superfície, do objeto, mas não é visível (como ocorre com a maioria dos objetos do nosso dia a dia). Esse tipo de rendering é denominado surface rendering, sendo que vamos nos concentrar nele.
Entretanto, esta estratégia não é adequada para renderizar objetos como nuvens, água e neblina, que são translúcidos e deixam a luz passar por eles, "esparramando" os raios de luz em todas as direções. Nesse caso, usa-se outra estratégia denominada volume rendering, que considera também a interação da luz com o interior dos objetos.
 
Modelo de Iluminação
 
Ao atravessarem o espaço, alguns dos raios de luz interceptam os objetos da cena. Quando isso ocorre, os raios interagem com a superfície conforme as propriedades do objeto, de forma a produzir uma cor. Vamos apresentar uma visão geral do fenômeno físico da propagação da energia luminosa e de sua interação com a superfície de um objeto.
Devido à complexidade e alto custo computacional dos modelos reais de iluminação, o modelo físico apresentado é uma aproximação simplificada para o fenômeno real que conserva um bom grau de realismo nas imagens geradas a partir de sua aplicação.
Quando uma energia luminosa incide sobre a superfície de um objeto, ela pode ser absorvida, refletida ou transmitida. Uma parte da energia luminosa incidente na superfície é absorvida e convertida em calor. A parte restante é refletida ou transmitida, sendo que a reflexão ou transmissão da luz é que torna um objeto visível. Se toda a luz incidente é absorvida, o objeto é invisível e é chamado de corpo negro.
A característica da luz refletida pela superfície de um objeto depende da composição, direção e geometria da fonte de luz, da orientação da superfície e das propriedades da superfície do objeto. A luz refletida por um objeto é também caracterizada por ser refletida difusamente ou especularmente, dependendo das propriedades da superfície.
A reflexão especular é o resultado de uma reflexão perfeita, cujo efeito é análogo a uma bola elástica pulando sobre uma superfície lisa. O ângulo segundo o qual a bola deixa a superfície é determinado pelo ângulo segundo o qual a bola a atinge (ângulo de incidência). A reflexão difusa é como uma bola elástica pulando sobre uma superfície completamente rugosa, onde não se pode determinar a priori a direção que a bola irá tomar.
Ao contrário da reflexão especular, a luz refletida difusamente é emitida pela superfície com igual intensidade em todas as direções, sendo de menor intensidade que a luz incidente. Há dois tipos extremos de superfícies que se distinguem quando se considera esse fenômeno:
• Refletoras Idealmente Especulares: aquelas que atuam como perfeitos espelhos (Ex.: metais polidos, água parada).
• Refletoras Idealmente Difusas: aquelas que são opacas ou foscas (Ex.: cortiça ou gesso);
Entretanto, grande parte dos objetos possui superfícies com características intermediárias entre estes dois extremos. A seguir, é apresentado o desenvolvimento de um modelo de iluminação simples, que considera inicialmente a reflexão de luz direta por uma superfície idealmente difusa.
A lei dos co-senos de Lambert governa a reflexão de uma luz proveniente da fonte de luz por uma superfície idealmente difusa. Esta lei determina que a intensidade da luz refletida por uma superfície idealmente difusa é proporcional ao co-seno do ângulo entre a direção da luz incidente e a normal à superfície. Especificamente, 2cos01πθθ ≤≤= dIKI onde I é a intensidade da luz refletida, Il é a intensidade da luz emitida pela fonte e incidente à superfície, Kd (0 ≤ Kd ≤ 1) é a constante de difusão da superfície e θ é o ângulo entre a direção da luz incidente L e a normal à superfície N (figura 1). O coeficiente Kd depende do material e do comprimento de onda da luz incidente. Entretanto, para modelos de iluminação simples, pode ser assumido como sendo constante.
Como esse modelo assume que apenas a fonte de luz é emissora de energia luminosa, os objetos que não recebem luz diretamente da fonte aparecem escuros ou pretos.
Entretanto, em uma cena real cada objeto também recebe luz refletida indiretamente pelos outros objetos da cena, o que caracteriza uma fonte de luz distribuída. A fim de simplificar os cálculos associados a essa iluminação indireta, considera-se uma componente de luz constante vinda do meio ambiente. Esta luz ambiente pode ser acrescentada à equação de Lambert como um termo constante de difusão que caracteriza o componente de luz ambiente. O modelo de iluminação fica, então:
2cos0πθθ ≤≤=+ ldaa IKIKI onde Ia é a intensidade da luz ambiente incidente e Ka (0 ≤
Ka ≤ 1) é a constante de reflexão difusa da luz ambiente. Observe que, se o modelo acima for usado para determinar a intensidade de luz refletida por dois objetos iluminados pela mesma fonte de luz, mas a distâncias diferentes dessa fonte, o resultado seria a mesma intensidade de luz refletida para ambos os objetos. Como vimos, isto é uma simplificação, pois é sabido que a intensidade da luz decresce de forma inversamente proporcional ao quadrado da distância do objeto em relação à fonte. Alguns modelos usam uma constante de atenuação linear (ver Rogers). Se a superfície é colorida, o modelo de iluminação é aplicado individualmente para calcular as intensidades de cada uma das três primárias (vermelho, verde e azul). A seguir, o modelo acima é estendido para incluir a emissão de luz refletida especularmente pelos objetos. A equação que governa a reflexão especular é a equação de Fresnel, que afirma que a reflexão especular da luz é direcional. Para uma superfície idealmente especular, o ângulo de reflexão será igual ao ângulo de incidência e toda energia refletida será na direção do raio refletido (R). Isto implica que o vetor de visão S (Figura 2), é coincidente com o vetor de reflexão R; isto é, o ângulo α é zero. Porém, para superfícies em geral a luz é refletida em todas as direções de um modo não uniforme e aleatório, com intensidade dependendo do ângulo do raio incidente. Este tipo de reflexão não uniforme é também denominada reflexão não coerente. Para superfícies polidas (próximas às idealmente especulares), a distribuição espacial dos raios de luz refletidos especularmente é limitada ou focalizada, criando o efeito conhecido como highlight, enquanto que para superfícies rugosas a luz refletida é espalhada.
Em computação gráfica este modelo é freqüentemente chamado de função de iluminação. A função de iluminação é aplicada individualmente a cada uma das três cores primárias em uma imagem colorida. Isso é uma simplificação (em geral, a reflexão varia para cada componente espectral), mas é simples de implementar e produz resultados aceitáveis.
 
 
Rendering de Modelos Poligonais
 
Polígonos e superfícies quádricas fornecem descrições precisas para objetos Euclideanos simples, como poliedros e elipsóides; superfícies spline e técnicas construtivas são úteis para projetar asas de aviões, engrenagens e outras estruturas de engenharia com superfícies curvas; métodos procedimentais, como fractais e sistemas de partículas, permitem uma representação adequada para nuvens, grama e outros objetos “naturais”; métodos de modelagem físicos usando sistemas de forças interagindo podem ser usados para descrever o comportamento não rígido de um pedaço de tecido; octrees são usadas para representar a estrutura interna de objetos, como os obtidos de imagens médicas geradas por CT; e isosuperfícies, renderings volumétricos e outras técnicas de visualização são aplicadas a conjuntos de dados tridimensionais discretos para obter representações visuais dos dados.
Os esquemas de representação para objetos sólidos são geralmente divididos em duas categorias, apesar de nem todas as representações se enquadrarem exatamente em uma delas. Representações por fronteira (B-reps - Boundary Representations) descrevem um objeto tridimensional como um conjunto de superfícies que separam o interior dos objetos do meio externo. Exemplos típicos de representação por fronteira são superfícies poligonais e superfícies spline. Representações por particionamento espacial (Space partitioning Representations) são usadas para descrever propriedades interiores, particionando a região espacial que contém um objeto em um conjunto de pequenos sólidos adjacentes não sobrepostos (geralmente cubos).
Superfícies Poligonais
A representação por fronteira mais usada para descrever objetos gráficos 3D é um conjunto de superfícies (ou faces) poligonais que definem a fronteira do objeto. Muitos sistemas gráficos armazenam todas as descrições de objetos como conjuntos de superfícies poligonais. Isso simplifica e acelera o rendering das superfícies e a visualização dos objetos, uma vez que todas as superfícies são descritas por equações lineares (ou seja, a equação do plano que contém o polígono). Por esta razão, representações poligonais são geralmente chamadas de "objetos gráficos padrão". Em alguns casos, uma representação poligonal é a única disponível, mas muitos pacotes permitem que objetos sejam descritos por outros esquemas, como superfícies spline, que são posteriormente convertidas para representações poligonais para posterior processamento.
Para um poliedro, uma representação poligonal define precisamente as características da superfície, mas outros objetos precisam ser decompostos (tesselated, ou tiled) para produzir uma representação poligonal aproximada (como no caso de um cilindro, ou de qualquer outro objeto curvo). Representações aproximadas por malhas poligonais são comuns em aplicações de design e modelagem de sólidos, pois uma representação visual tipo fio-de-arame pode ser gerada rapidamente para dar uma indicação da superfície do objeto. Renderings realísticos são produzidos interpolando valores de tonalização ao longo das superfícies poligonais para eliminar ou reduzir a presença das fronteiras entre as arestas dos polígonos, que se visualizadas dão uma aparência facetada ao objeto. Outra maneira de melhorar a aparência visual da aproximação poligonal para um objeto é subdividir a superfície do objeto em faces poligonais menores.
Tabelas de Polígonos
Especificamos uma superfície poligonal com um conjunto de coordenadas de vértices e atributos associados. A medida que são fornecidas informações sobre cada polígono, os dados são colocados em tabelas que são usadas para o subsequente processamento, visualização e manipulação dos objetos da cena. Tabelas de dados poligonais podem ser organizadas em dois grupos: tabelas geométricas e tabelas de atributos. Tabelas de dados geométricos contém coordendas de vértices e parâmetros para identificar a orientação espacial das superfícies poligonais. Atributos para um objeto incluem parâmetros especificando o tipo de material do objeto, cor, grau de transparência, reflectividade da superfície, características de textura.
Uma organização conveniente para armazenar dados geométricos consiste em utilizar 3 listas: uma tabela de vértices, uma tabela de arestas, e uma tabela de polígonos. As coordenadas de cada vértice no objeto são armazenadas na tabela de vértices. A tabela de arestas contém ponteiros para a tabela de vértices de forma a identificar, para cada aresta, os vértices extremos. E a tabela de polígonos contém ponteiros para a tabela de arestas para identificar as arestas que definem a fronteira de cada polígono (face poligonal). A Figura 2 mostra a representação para 2 polígonos adjacentes na face de um objeto.
Poderíamos expandir a tabela de arestas para incluir ponteiros para a tabela de polígonos, de forma que arestas comuns entre os polígonos possam ser identificadas mais rapidamente (Figura 3). Esta informação é útil para procedimentos de rendering. Analogamente, a tabela de vértices poderia ser extendida para apontar para as arestas
tabelas de polígonos e de vértices para identificar os valores mínimo e máximo de x, y e z para cada polígono. Estas informações também são úteis para o rendering das superfícies e algoritmos de remoção de superfícies ocultas.
E1: V1,V2,S1
E2: V2,V3,S1
E3: V3,V1,S1,S2 E4: V3,V4,S2
E5: V4,V5,S2
E6: V5,V1,S2
Figura 3: Tabela de arestas extendida.
Como as tabelas de dados geométricos podem conter listagens extensas de vértices e arestas para objetos complexos, é importante que estes dados sejam checados para verificar sua consistência e completude. É muito possível a ocorrência de erros nos dados de entrada, principalmente se estes forem fornecidos de maneira interativa. Possíveis verificações são: se todos os vértices aparecem como pontos extremos de pelo menos duas arestas; que toda aresta pertence a pelo menos um polígono; que todo polígono é fechado; que cada polígono possua pelo menos uma aresta compartilhada; e que se a tabela de arestas contém ponteiros para polígonos, que cada aresta referenciada por um polígono tenha um ponteiro recíproco para o polígono.
Equações do Plano
Para produzir uma imagem de um objeto 3D, devemos processar os dados de entrada de várias maneiras. Os passos mais comuns incluem: transformar as descrições em coordenadas do mundo para coordenadas de visualização, e a seguir para coordenadas do dispositivo; identificar as superfícies visíveis; aplicar técnicas de rendering. Para alguns destes procedimentos, precisamos de informação sobre a orientação espacial de cada componente da superfície de um objeto. Esta informação é obtida a partir das coordenadas dos vértices e das equações dos planos que contém as faces poligonais.
A equação de um plano pode ser expressa na forma:
Ax + By + cz + D = 0
onde (x,y,z) é qualquer ponto no plano, e os coeficientes A, B, C, D são constantes que descrevem as propriedades espaciais do plano. Podemos obter os valores de A, B, C, D resolvendo um sistema de 3 equações do plano, usando as coordenadas de 3 vértices nãocolineares no plano (V1, V2, V3). Para isso, podemos escolher 3 vértices sucessivos do polígono, e resolver o seguinte sistema de equações:
(A/ D)xk +(B / D)yk + (C / D)zk =−1, k =1,2,3
Usando a regra de Cramer, que dá a solução do sistema na forma de determinantes, e expandindo os determinantes, podemos obter a solução
= y1(z2 − z3) + y2(z3 − z1) + y3(z1 − z2)
= z1(x2 − x3) + z2(x3 − x1) + z3(x1 − x2)
= x1(y2 − y3) + x2(y3 − y1) + x3(y1 − y2)
=−x1(y2z3 − y3z2) − x2(y3z1 − y1z3) − x3(y1z2 − y2z1)
 
Assim, a medida que os valores do vértices vão sendo fornecidos, os valores de A, B, C e D são calculados para cada polígono, e armazenados com os outros dados referentes aos polígonos.
A orientação de uma superfície plana no espaço pode ser determinada com o vetor normal ao plano, que tem componentes cartesianas (A,B,C) (os coeficientes da equação do plano). Como estamos usualmente tratando com superfície poligonais que definem a fronteira de um objeto, é necessário distinguir entre os dois lados (interior e exterior) da superfície. O lado do plano que "vê" o interior do objeto é considerado o lado de dentro, enquanto que o lado visível é o lado de fora. Se os vértices do polígono são especificados no sentido anti-horário quando observados por um observador "no lado de fora" do plano em um sistema de coordenadas da mão-direita, a direção da normal irá apontar "para fora" da superfície do objeto.
Para determinar as componentes do vetor normal para uma superfície definida pelo quadrilátero que define uma das 6 faces de um cubo, selecionamos 3 dos 4 vértices ao longo da fronteira do polígono. Os pontos são selecionados no sentido anti-horário quando observados do lado de fora do cubo. As coordenadas destes vértices podem ser usadas para obter os coeficientes do plano, A = 1, B = 0, C = 0, D = -1. Ou seja, o vetor normal a este plano está na direção do eixo x positivo.
Alternativamente, os componentes do vetor normal também podem ser obtidos calculando o produto vetorial de 2 vetores. Novamente, selecionamos 3 vértices V1, V2 e V3, no sentido anti-horário quando a superfície é observada do lado de fora em um sistema de coordenadas cartesianas da mão direita. Formando 2 vetores, V1V2 e V1 V3, o vetor normal é dado por:
N = (V2 −V1) ×(V3 −V1)
Esta expressão gera os valores para A, B e C. O valor de D pode ser obtido substituindo estes valores e as coordenadas de um dos vértices do polígono na equação do plano, e resolvendo para D. A equação do plano também pode ser expressa na forma vetorial usando a normal N e a posição P de qualquer ponto no plano, como:
N• P =−D
As equações do plano também são usadas para identificar a posição de pontos no espaço em relação as superfícies planas da fronteira de um objeto. Para qualquer ponto (x,y,z) que não está no plano com parâmetros A, B, C, D, temos que
Ax + By + cz + D ≠ 0
Podemos também verificar se um ponto está dentro ou fora do plano que define a superfície do objeto:
Se Ax + By +Cz + D < 0,o ponto está dentro
Se Ax + By +Cz + D > 0,o ponto está fora
Este teste é válido em um sistema de coordenadas da mão direita, desde que os parâmetros do plano, A, B, C, D tenham sido calculados usando vértices selecionados no sentido antihorário quando a superfície é observada de fora.
Malhas Poligonais
 
Quando objetos precisam ser decompostos em superfícies poligonais, em geral é conveniente ter uma função que permita a definição de uma malha poligonal, como malhas de triângulos ou de quadriláteros. Quando polígonos são especificados com mais de 3 vértices, pode ocorrer dos vértices não estarem em um mesmo plano. Isto pode ser devido a erros de aproximação numérica, ou erros na seleção das coordenadas dos vértices. Uma maneira de lidar com o problema; e subdividir os polígonos em triângulos (triangulação). Outra abordagem é aproximar os parâmetros A, B, C.
Sistemas gráficos tipicamente modelam objetos como malhas poligonais, e definem uma base de dados geométricos e de atributos para facilitar o processamento das faces poligonais. Renderizadores de polígonos implementados em hardware são incorporados a estes sistemas, o que lhes garante capacidade de mostrar milhares ou mais (até alguns milhões) de polígonos tonalizados por segundo (em geral triângulos), incluindo a aplicação de textura e efeitos especiais de iluminação.
Modelos de Tonalização
 
O rendering da cena pode ser feito aplicando-se a equação de iluminação acima a cada ponto (pixel) da superfície de cada objeto que compõem a cena. Na verdade, isso é feito a cada ponto que aparece de fato na imagem da cena a ser gerada, ou a cada ponto visível. Isso implica em que o processo deve ser precedido de algum procedimento para determinar os pontos não visíveis, um seja, um procedimento de remoção de superfícies ocultas. No caso de uma cena modelada por conjuntos de polígonos, o algoritmo scanline para preenchimento de polígonos pode ser aplicado, e o modelo de iluminação é usado para calcular a intensidade (cor) a ser associada a cada pixel. Observe que esse processo de rendering é baseado em modelo local de iluminação - ou seja, fora a luz ambiente, modelada como uma constante no modelo, apenas os raios de luz que incidem diretamente sobre cada ponto da superfície são considerados no cálculo da cor. A interação dos raios refletidos ou transmitidos com os demais objetos da cena é ignorada. O ray-tracing, por outro lado, considera estas interações, e por isso diz-se que é baseado em um modelo global de iluminação.
As técnicas de tonalização (shading) utilizam algum modelo de iluminação, por exemplo, o que foi visto acima, para determinar as cores associadas aos pixels de cada polígono que compõe uma cena. As técnicas mais comumente utilizadas são a Tonalização Constante, ou Flat Shading, a Tonalização por Gouraud, ou Gouraud Shading, e a Tonalização por Phong, ou Phong Shading.
Na tonalização constante, são considerados apenas os termos da iluminação ambiente e da reflexão difusa, com uma única fonte de luz posicionada no infinito e na direção de visão do observador, de modo a evitar o surgimento de sombras. O processo é um dos mais simples e mais eficientes, porém, não considera o fato de que, em geral, a representação poliedral de um modelo representa uma aproximação linear por partes do modelo real. Ele assume que a representação poligonal é o modelo real em estudo. Desse modo, cada polígono representa uma parte do modelo onde o vetor normal é constante, e, portanto a intensidade de luz calculada usando a equação local de iluminação também é constante no polígono. Daí o termo Flat Shading, devido à aparência facetada da imagem resultante.
As técnicas desenvolvidas por Gouraud e Phong permitem a obtenção de uma aparência mais suave, sendo, portanto mais utilizadas em superfícies que representam uma aproximação linear da superfície realmente desejada. Ambas consideram as componentes de iluminação ambiente, difusa e especular. A técnica de Gouraud consiste em aplicar o modelo de iluminação para calcular as intensidades nos vértices do polígono, e interpolar os valores obtidos para obter a iluminação ao longo de cada aresta e nos pontos interiores. A técnica de Phong calcula as normais nos vértices, e interpola as normais para calcular o modelo de iluminação em cada pixel do polígono. Ela apresenta os melhores resultados para superfícies especulares, mas também é a de custo computacional mais alto.
 
Fontes de Luz
 
A definição das fontes de luz é essencial para o rendering: sem elas, qualquer imagem da cena ficaria toda preta! É a interação entre a luz emitida pelas fontes e os objetos que compõem a cena que define o que vemos da cena. Uma fonte de luz pode ser considerada simplesmente como mais um objeto na especificação da cena, sendo que se distingue pelo fato de emitir luz diretamente. Na especificação de fontes de luz deve-se definir as seguintes grandezas:
• Geometria - formato físico da fonte;
• Intensidade - função que associa a cada ponto do espaço a intensidade luminosa da fonte de luz nesse ponto;
• Distribuição espectral - contribuição da fonte em cada comprimento de onda (cor) do espectro visível.
• Quanto ao aspecto geométrico pode-se classificar as fontes de luz em 3 tipos:
• Fontes direcionais - a fonte de luz é considerada no infinito, e pode ser determinada por um vetor unitário que define a sua direção. Em geral são utilizadas para aproximar fontes de luz pontuais a uma distância infinita, como por exemplo, o sol.
• Fontes pontuais - são definidas por um vetor posição (x,y,z) no espaço de cena, e um vetor unitário que define a sua direção. Esta tem dimensões desprezíveis se comparadas à dimensão dos objetos da cena.
• Fontes de área - possuem uma superfície não pontual emissiva, e um sistema de coordenadas locais associado que é utilizado para especificar a sua posição no espaço e a direção de iluminação.
Uma fonte pontual, é uma simplificação da luz incandescente onde usamos normalmente em casa. O posicionamento no infinito é interessante porque implica que todos os raios de luz que atingem a cena são paralelos entre si - o que não é o caso se a fonte for pontual e local à cena. Normalmente, assume-se que a intensidade da luz emitida por esta fonte permanece constante a medida em que percorre o espaço, ou então que decresce segundo um fator de atenuação linear com a distância percorrida. Isso não corresponde ao modelo real do processo físico, que afirma que a luz é atenuada segundo um fator inversamente proporcional ao quadrado da distância percorrida.
 
 
== {{Ver também}} ==