Quase todos os games hoje em dia geram novos frames “do zero”, o que significa que não usam cálculos feitos antes desse frame (a menos que usem suavização temporal). Mas, na maioria dos games, assim como no mundo real, relativamente pouca coisa muda de frame para frame. Se você olhar para fora da janela, poderá ver árvores balançando ao vento, pedestres passando ou pássaros voando à distância. Mas a maior parte da cena é “estática” ou inalterada. A principal coisa que muda é o seu ponto de vista.
Agora, alguns objetos vão mudar a aparência à medida que você muda seu ponto de vista, especialmente aqueles que são lustrosos ou brilhantes. Mas a maioria dos objetos mudará muito pouco a aparência à medida que você move sua cabeça e, assim, é um desperdício de preciosos ciclos de placa de vídeo recalcular as mesmas cores exatas que compõem esses objetos em cada frame. Seria muito mais eficiente sombrear esses objetos a uma taxa mais baixa (digamos, a cada três frames, ou talvez até menos do que isso) e reutilizar as cores do objeto (ou “texels”, como elas são referidas) calculadas no passado. Essa noção de reutilização de trabalho se torna particularmente importante no Ray Tracing, e ainda mais no caso da iluminação global, que é um exemplo muito comum de computação de sombreamento lenta e muito cara.
Essa técnica é o que chamamos Sombreamento de Espaço de Textura, em que os cálculos não são executados frame a frame no espaço da tela (ou seja, do ponto de vista do gamer), mas sim calculados com uma taxa de sombreamento diferente no espaço de textura (essencialmente do ponto de vista do próprio objeto). Por que espaço de textura? Porque todos os objetos em games hoje em dia têm texturas e são independentes do ponto de vista do gamer, tornando-os uma escolha perfeita para armazenar cores de objetos sombreados e “transportá-las” de frame a frame.
Essa mesma técnica também pode ser efetivamente aplicada à VR: como nossos olhos estão bem próximos, a grande maioria dos objetos que você vê com um olho também é vista pelo outro olho. A principal diferença não é o sombreamento desses objetos (por exemplo, seu olho esquerdo vê o lápis em sua mesa como sendo o mesmo amarelo que o olho direito), mas sim a orientação deles. Dessa forma, com o Sombreamento de Espaço de Textura, você pode “pegar emprestado” os cálculos de sombreamento de um olho e usá-los com o outro olho, reduzindo a metade da sua carga de trabalho de sombreamento. E, se seu desempenho for limitado pelo sombreamento de pixels em seu game, o Sombreamento de Espaço de Textura teoricamente poderia dobrar suas taxas de frames.
Com sombreamento de espaço de textura, um engine de game não sombreará todos os pixels rasterizados imediatamente. Em vez disso, ele primeiro identificará quais texels são referenciados pelos pixels que ele rasterizou. Esta operação é muito semelhante ao que a unidade de textura faz quando encontra texels necessários para uma dada operação de texturização. Esse conjunto de texels é enfileirado para sombreamento, o que acontecerá mais tarde. Observe que, durante esse processo, o mesmo texel pode ser referenciado por vários pixels, mas para questões de eficiência, obviamente não queremos sombrear os texels de forma redundante. Assim, o engine do game terá que executar o que é referido como desduplicação de solicitações de sombra, isolando referências únicas de texel e garantindo que cada texel só seja sombreado uma vez.
Uma vez que o conjunto de referências únicas de texel é identificado, o game sombreia os texels, armazenando os resultados em texturas correspondentes para reutilização posterior. Isso é análogo ao sombreamento de pixels, exceto que o que está sendo sombreado não são pixels na tela, mas sim texels dentro de uma textura.
Por fim, os texels computados podem ser usados para calcular as cores dos pixels correspondentes – exatamente da mesma forma que as texturas estáticas são usadas hoje em dia. Essa etapa é extremamente barata, já que ela meramente executa uma única operação de texturização.
O processo de encontrar o conjunto de texels visíveis e isolar aqueles que são únicos é um processo computacionalmente caro e, por essa razão, os aplicativos não podiam arcar com o sombreamento de espaço de textura no passado. A arquitetura Turing resolve esse problema introduzindo aceleração de hardware para esta etapa fundamental: a unidade de textura de Turing agora é capaz de fornecer informações de endereço do texel diretamente ao sombreador, e novos intrínsecos paralelos de dados tornam a etapa de desduplicação do processo muito eficiente.
Embora o sombreamento de espaço de textura possa parecer algo muito direto e lógico a ser feito, existem algumas “armadilhas” que impediram que a técnica se tornasse dominante.
Em primeiro lugar, os games modernos reutilizam muitos objetos, inclusive suas texturas. Se você vir uma floresta dentro de um game, é altamente improvável que cada folha tenha sua própria textura. Muito provavelmente, as folhas são todas tiradas de um pequeno conjunto de modelos de folhas e texturas. Esses objetos não funcionarão com Sombreamento de Espaço de Textura, já que todos os objetos visíveis devem ter suas próprias texturas – nenhum compartilhamento permitido! Imagine se você não reforçasse isso – que todas as folhas de uma árvore continuassem a compartilhar a mesma textura de folha – e então você usasse sua mão para colocar uma delas na sombra. Assim, todas as folhas da árvore também iriam para a sombra simultaneamente! Portanto, esta é a primeira coisa com a qual os desenvolvedores têm que lidar: garantir que cada objeto tenha sua própria textura, que pode ser sombreada independentemente de todos os outros objetos.
O sombreamento do espaço de textura exigirá, portanto, que repensemos bastante a forma como os engines de game são construídos, mas uma vez que isso é feito, as possibilidades são infinitas – uma porta é aberta para maneiras totalmente novas de renderização, aproveitando os benefícios do Ray Tracing e da rasterização para gerar imagens fotorrealistas em altas taxas de frames e sem comprometer nada. O suporte de hardware da arquitetura Turing para sombreamento de espaço de textura torna essas abordagens híbridas finalmente práticas.