Minha pergunta é específica em relação ao Metal, pois não sei se a resposta mudaria para outra API.
O que acredito entender até agora é o seguinte:
Uma textura de mapa mip pré-computou "níveis de detalhe", onde níveis mais baixos de detalhes são criados diminuindo a amostragem da textura original de alguma maneira significativa.
Os níveis do Mipmap são referidos no nível descendente de detalhes, em que level
0
é a textura original e os níveis mais altos são duas reduções.A maioria das GPUs implementa filtragem trilinear, que seleciona dois níveis de mipmap vizinhos para cada amostra, amostras de cada nível usando filtragem bilinear e, em seguida, combina linearmente essas amostras.
O que não entendo direito é como esses níveis de mipmap são selecionados. Na documentação da biblioteca padrão do Metal, vejo que amostras podem ser coletadas, com ou sem a especificação de uma instância de um lod_options
tipo. Eu diria que esse argumento altera a maneira como os níveis do mipmap são selecionados e, aparentemente, existem três tipos de lod_options
texturas 2D:
bias(float value)
level(float lod)
gradient2d(float2 dPdx, float2 dPdy)
Infelizmente, a documentação não se preocupa em explicar o que essas opções fazem. Posso supor que isso bias()
incline algum nível de detalhe escolhido automaticamente, mas o que significa esse viés value
? Em que escala ele opera? Da mesma forma, como é a lod
de level()
traduzido em níveis mipmap discretos? E, operando sob a suposição de que gradient2d()
usa o gradiente da coordenada da textura, como ele usa esse gradiente para selecionar o nível do mipmap?
Mais importante, se eu omitir o lod_options
, como os níveis do mipmap são selecionados? Isso difere dependendo do tipo de função que está sendo executada?
E, se a operação padrão da função especificada no-lod-options sample()
for fazer algo como gradient2D()
(pelo menos em um shader de fragmento), utiliza derivadas simples do espaço da tela ou trabalha diretamente com rasterizador e coordenadas de textura interpoladas calcular um gradiente preciso?
E, finalmente, qual é a consistência desse comportamento de dispositivo para dispositivo? Um artigo antigo (antigo como o DirectX 9) que li referia-se à seleção complexa de mipmap específica de dispositivo, mas não sei se a seleção de mipmap é melhor definida em arquiteturas mais recentes.