Blender – Cache de Textura Cycles

  • Autor do post:
  • Categoria do post:Blender

 

No Blender 5.2 LTS, o render de cenas com muitas texturas de imagem se tornará muito mais eficiente em termos de memória. O novo cache de texturas Cycles carrega somente os tiles e resoluções necessárias.


 

Como Usar

Habilite Desempenho > Cache de Texturas e Auto Gerar nas propriedades de Renderização.

Para cada imagem, um arquivo tx correspondente será gerado na pasta blender_tx/ ao lado do arquivo da imagem. Este arquivo tx é otimizado para carregar somente os tiles e resoluções necessárias para o render.

O sistema foi desenvolvido para ser fácil de usar por usuários individuais. Os arquivos tx são automaticamente regenerados com alterações, e espaços de cor e filtros são baseados no uso de texturas de imagem nos nós de shader.

Para farms de render e pipelines de produção, há controle adicional.


 

Desempenho

Economia de memória e desempenho dependem bastante da cena. Especialmente de quanto da memória de texturas de imagem foi utilizada em comparação com a geometria.

Os números a seguir vêm de cenas de benchmark que usam muitas texturas de imagem.


 

Gerando Arquivos Tx

O painel de Cache de Texturas possui um botão para gerar manualmente os arquivos tx. A localização padrão pode ser alterada nas preferências, seja por um caminho relativo ao arquivo da imagem ou um caminho absoluto.

Arquivos tx padrão, gerados por outros motores de renderização e pelo maketx do OpenImageIO, também são reconhecidos, porém podem ser menos eficientes para carregar.

Para gerar arquivos tx nativos do Cycles via linha de comando, use os seguintes comandos:

# Gerar arquivos tx para todas as imagens de um arquivo blend.
blender scene.blend --command maketx

# Gerar arquivo tx para uma imagem específica.
blender --command maketx imagem.png --colorspace sRGB

 

Janela de visualização

No painel Simplificar, a opção Limite de Textura foi substituída por uma porcentagem de Resolução de Textura. Essa é uma configuração única que funciona tanto com quanto sem o cache de textura.

Isso é particularmente útil para a renderização de cenas complexas na viewport. Texturas com resolução de, por exemplo, 50% ou 25% reduzem os tempos de carregamento e podem ajudar a garantir que as texturas caibam totalmente na memória para renderização interativa.

As imagens não utilizadas são apagadas periodicamente, após a conclusão da renderização na viewport e quando o Blender está ocioso.


 

Detalhes Técnicos

GPU

Precisávamos de um design que funcionasse tanto na CPU quanto em todos os backends de GPU, que possuem capacidades e APIs variadas.

Nos sistemas tradicionais de cache de textura baseados em CPU, os threads mantêm cooperativamente um cache de blocos menos recentemente usados, com um limite de memória. Cada thread normalmente realiza uma espera bloqueante quando um bloco está ausente e bloqueia um bloco enquanto o utiliza para evitar que ele seja removido.

O mesmo mecanismo não é prático em GPUs, especialmente considerando as diferentes arquiteturas de GPU e capacidades de hardware. Milhares de threads são executadas simultaneamente, e as GPUs geralmente não têm acesso direto ao disco durante a execução de um kernel.

O mecanismo que escolhemos foi acumular as falhas de cache de textura de todas as threads, carregar em lote os blocos ausentes e, em seguida, reiniciar os kernels. Isso é um tanto semelhante aos sistemas usados ​​em jogos, porém a diferença é que precisamos de resultados precisos e não podemos usar uma resolução inferior como substituta até que a textura real seja carregada.

Para isso, o agendamento do kernel foi alterado para que os kernels possam ser reexecutados sem efeitos colaterais. O Cycles usa o rastreamento de trajetória por frente de onda com potencialmente milhões de trajetórias em andamento, o que ajuda a ocultar a latência do carregamento de blocos.

Mapa de Tiles

Os blocos de imagem são compactados em texturas à medida que são carregados, com um mapeamento de textura virtual de cada bloco de imagem para um deslocamento na textura que armazena os pixels.

Os blocos possuem 2 pixels de espaçamento, adaptados ao modo de repetição. Com isso, podemos aproveitar a filtragem por hardware nas GPUs e fazer com que as buscas de textura sejam lidas de apenas um único bloco, tanto na CPU quanto na GPU.


 

Diferenciais de Raios (Ray Differentials)

 

Foram adicionadas diferenciais de raio ao sistema de sombreamento SVM nativo, pois são necessárias para encontrar o nível de mipmap apropriado. A implementação é baseada em números duais para diferenciação automática. A linguagem Open Shading Language (OSL) oferece suporte a eles, porém, essa funcionalidade está disponível apenas para CPU e OptiX.

Para reflexões indiretas, os diferenciais de raio são ampliados, pois menos detalhes são necessários. Isso ajuda a reduzir o uso de memória cache de textura em cerca de 30% em diversas cenas.

 

Remoção do Cache

Sistemas de cache de texturas baseados em CPU geralmente possuem um orçamento fixo de memória para o cache, que pode ser ajustado para equilibrar desempenho e uso de memória. Para renderizações em GPU, o controle granular é mais difícil, pois milhares de threads e milhões de caminhos estão em execução simultaneamente. Enquanto o cache de CPU mantém um orçamento apertado, na prática o desempenho cai bastante se o conjunto de trabalho não couber na memória.

Ao invés disso, a estratégia de remoção do cache é confiar na renderização em tiles já existente. O Cycles usa tiles grandes de 2048 pixels por padrão, que economizam memória de passagem de render ao escrever em disco. Agora, esse controle também ajuda a reduzir o uso de memória do cache de texturas.

O sistema funciona eliminando imagens não utilizadas que não foram usadas pelos dois últimos tiles de renderização. O primeiro tile carrega imagens, o segundo carrega mais imagens, e antes do terceiro(tile seguinte), as imagens não usadas são eliminadas. A maioria das texturas para rebatimentos indiretos permanece na memória, pois é compartilhada entre os tiles de renderização.

Para renders grandes em 4K, 8K ou 16K, onde o processamento em tiles entra em ação, observamos que o uso da memória do cache de texturas permanece aproximadamente constante, independentemente da resolução de renderização. Em sistemas com memória limitada, um tamanho de tile menor, como 1024 ou 512 pixels, ajuda a reduzir ainda mais a memória, embora possa diminuir um pouco o desempenho.

Aprenda mais sobre Blender: https://www.render.com.br/cursos/blender

 

Artigo escrito por: Brecht Van Lommel

Compartilhe e curta!