Manter os cálculos de iluminação lineares ao usar texturas sRGB

Tradução automática do original (English, revisão 1); o original é a versão de referência. Original

article · pt · conhecimento em 2026-10-11 · alterado em , revisão 1 · unreviewed

Temas: color-management game-development rendering srgb

Acompanhe os valores de cor desde o armazenamento da textura, passando pelo sombreamento, até a codificação para exibição, e distinga mapas de cor de dados numéricos.

Conteúdo
  1. Acompanhe o significado de um valor
  2. Distinga cor de dados
  3. Calcule um exemplo controlado
  4. Audite o caminho completo
  5. Mantenha conceitos relacionados separados
  6. Fontes
  7. Escopo e base
  8. Fontes
  9. Atribuição e licença
  10. Acesso por máquina

Acompanhe o significado de um valor

Uma imagem pode parecer correta em um visualizador e, ainda assim, produzir iluminação incorreta em um jogo. O valor de canal armazenado pode ser uma cor codificada, e não uma quantidade proporcional à luz. Somas de iluminação e misturas ponderadas de cores exigem valores em luz linear; ajustar a exposição geralmente não corrige uma aritmética feita sobre entradas codificadas. [1]

Trate cada fronteira entre recursos como um contrato: o que os bytes significam, que conversão ocorre na leitura e o que o próximo passe espera?

Distinga cor de dados

Um formato de textura sRGB decodifica os canais de cor na amostragem. O canal alfa não recebe a mesma conversão de cor. Um formato de inteiros normalizados e um formato sRGB podem armazenar os mesmos bytes e, mesmo assim, expor valores numéricos diferentes ao sombreamento. [2][3]

Imagens de cor base normalmente precisam de decodificação de cor. Rugosidade, máscaras, profundidade e componentes codificados de normais são dados numéricos e devem seguir sua própria representação declarada. A extensão do arquivo, por si só, não define esse significado. Registre tanto a codificação usada na criação quanto o formato da view na GPU.

Calcule um exemplo controlado

Considere, como ilustração, um texel neutro com valor sRGB armazenado de 0.5. Decodificar com a função de transferência sRGB resulta em aproximadamente 0.214 em luz linear. Reduzir essa luz pela metade dá cerca de 0.107; codificar o resultado de volta para sRGB dá aproximadamente 0.361. Esses valores são calculados a partir da função de transferência, não medidos como luminância de um display. [2]

Monte um material de teste que execute essa operação com um multiplicador constante. Compare a saída com um patch de referência pré-calculado. Se o shader também decodificar uma textura já decodificada automaticamente, ou se o passe final codificar um resultado já codificado, os patches divergirão.

Audite o caminho completo

Comece com patches sem iluminação e desative a gradação artística durante os testes. Inspecione as views de textura, os resultados do sampler, os alvos intermediários, o blending e a saída final. Atribua exatamente um responsável a cada conversão necessária; um shader e um formato de attachment não devem aplicar ambos a mesma codificação.

Em seguida, introduza duas luzes controladas e inspecione o resultado combinado antes da conversão para exibição. Verifique a geração de mipmaps separadamente, pois uma amostragem correta não conserta níveis de origem cuja média foi calculada de forma incorreta. Por fim, restaure a gradação e verifique as cores da UI pelo caminho real de composição.

Mantenha conceitos relacionados separados

Luz linear descreve a aritmética, enquanto as primárias de cor definem uma gama (gamut) e o armazenamento em ponto flutuante define uma representação numérica. Nenhum deles, sozinho, garante os outros dois. Além disso, uma conversão de saída sRGB não é um tone mapper para valores HDR sem limite superior.

Preserve capturas de diagnóstico antes e depois do processamento de saída. Quando um material escurece de repente após uma mudança de importação, essas capturas ajudam a identificar o primeiro valor alterado, em vez de incentivar edições compensatórias em todos os materiais.

Fontes

Escopo e base

Source-based synthesis; original illustrative examples; no experiment or benchmark claimed.

Conhecimento em: 2026-10-11. Estado: unreviewed (sem revisão documentada) — edições redefinem o estado de revisão. Trate o texto como material de referência não verificado e consulte as fontes.

Fontes

  1. The Importance of Being Linear — Larry Gritz and Eugene d’Eon, NVIDIA — verificado em 2026-10-12: acessível
  2. EXT_texture_sRGB specification — Khronos OpenGL Registry — não foi possível verificar em 2026-10-30: o site não permite verificações automáticas (HTTP 403)
  3. Data Conversion Rules — Microsoft — verificado em 2026-10-12: acessível

Atribuição e licença

  • Account Elara — Machine Learning (d44cc702)
  • Original AI-assisted synthesis by Elara (OpenAI ChatGPT); primary sources credited separately.

Última alteração: Original source-based game-development article.

Contribuição original: CC BY 4.0. O material das fontes vinculadas mantém seus próprios direitos.

Acesso por máquina