O que é um OpenGL® Shadow?
Uma sombra da Open Graphics Library® (OpenGL®) é uma aproximação visual em uma cena tridimensional (3D) do OpenGL® de como uma sombra seria projetada na vida real sob condições de iluminação semelhantes. Sombras são um recurso visual complexo a ser implementado no OpenGL®, principalmente porque não há suporte inato para projetar sombras em uma cena. Em vez disso, existem várias técnicas que podem ser usadas para criar sombras a partir dos objetos e da geometria em uma cena usando várias ferramentas, como os vários buffers, shaders e, em alguns casos, extensões que dão acesso a recursos especiais em determinados gráficos cartões. Na maioria dos casos, a qualidade, precisão e velocidade da renderização de sombra OpenGL® estão diretamente relacionadas ao poder de processamento e à memória do hardware gráfico presente em um computador ou dispositivo. Alguns dos métodos mais populares de implementar uma sombra OpenGL® incluem volumes de sombra, mapeamento de sombra e rastreamento de raios.
Criar um aplicativo que tenha suporte a sombras OpenGL® requer conhecimento matemático e um profundo conhecimento de como o OpenGL® funciona. O OpenGL® é amplamente usado para criar cenas 3D dinâmicas e renderizadas em tempo real; portanto, os algoritmos usados para criar sombras devem não apenas ser otimizados quanto à velocidade, mas também devem ser cuidadosamente medidos quanto ao consumo de recursos e quaisquer interrupções que pode ser causado no pipeline gráfico usado para renderização. Por esses motivos, o método mais básico de criar uma sombra, chamado de traçado de raios, geralmente é impraticável para cenas em 3D completas, porque pode levar muito tempo.
O rastreamento de raios basicamente segue uma linha imaginária, ou raio, do plano ou posição de visualização da câmera através de uma cena até a superfície de um objeto e calcula a cor da superfície com base na posição de uma ou mais fontes de luz e outros fatores. Durante o processo de rasterização, em que a cena 3D é desenhada em uma superfície bidimensional (2D) para que possa ser exibida, o processo de rastreamento de raios deve ser executado em todos os pixels que estão sendo desenhados e, especialmente com texturas ou outras propriedades da superfície, pode ser necessário avaliar os mesmos pixels várias vezes. Isso significa que o traçado de raios em tempo real, embora renderize sombras com precisão, geralmente não é prático.
Outro método que pode ser usado para criar uma sombra do OpenGL® é conhecido como mapeamento de sombra. Este método usa o buffer de profundidade ou estêncil para renderizar uma cena a partir do ângulo da fonte de luz como uma série de distâncias da fonte de luz até as superfícies de diferentes objetos dentro da cena. A cena é renderizada uma segunda vez a partir do ângulo de visão correto, verificando se cada pixel cai dentro de uma certa distância dentro do buffer, indicando se o pixel está aceso ou sombreado. O uso do mapeamento de sombra pode consumir muita memória e, com cenas que têm mais de uma fonte de luz, pode envolver a criação de vários mapas de vários ângulos.
Os volumes de sombra são uma maneira de criar uma sombra do OpenGL® que é mais precisa do que alguns outros métodos, mas apresenta seus próprios problemas. Um volume de sombra é essencialmente uma parte invisível da geometria em uma cena que se expande da superfície iluminada de um objeto para longe da fonte de luz. Esse volume pode ser verificado em relação a outros objetos para ver se estão caindo na sombra da superfície da qual o volume se originou. Esse procedimento pode ser muito complexo e, por fim, criar artefatos visuais quando otimizado para velocidade.