Como o texelFetch e a textura do OpenGL diferem?

18

Entendo as principais diferenças entre texelFetche texture, mas tenho algumas perguntas sobre os detalhes:

  • Será que texelFetchenvolvem uma penalidade de desempenho? Como não usar um cache ou algo assim?
  • São texelFetche textureintercambiáveis quando se usa GL_NEAREST?
Martin Perry
fonte
11
Você pode escrever um caso de teste e ver ...
ThorinII 28/11
11
Você esqueceu de marcar uma resposta como aceita ou ainda é uma questão em aberto?
Anko

Respostas:

23

texelFetché bem diferente de texture.

textureé sua função usual de acesso à textura que lida com as [0,1]coordenadas de filtragem e textura normalizada ( ). texelFetchacessa diretamente um texel na textura (sem filtragem) usando coordenadas não normalizadas (por exemplo, (64,64)no texel ish médio em uma textura de 128x128 vs (.5,.5)em coordenadas normalizadas).

Sean Middleditch
fonte
4
+1 Gostaria de acrescentar que o texelFetch se destina ao acesso a dados quando a textura não se destina particularmente a ser exibida como imagem, mas a outros tipos de dados, ao contrário da textura que acessa os texels quando eles devem ser usados ​​como imagens, É por isso que ele usa filtragem etc. -
concept3d
Existe alguma diferença no desempenho?
Lenar Hoyt
11
@mcb: talvez, mas eu não esperaria que fosse muito grande, e provavelmente variará muito por fornecedor de hardware. O desempenho é a métrica absolutamente errada a ser usada ao decidir qual dessas funções chamar: use a correta para sua situação (você precisa da filtragem do hardware e, portanto, deve usá texture-lo ou precisa do hardware para não fazer a filtragem e, portanto, deve usar texelFetch)
23815 Sean Sean-Middleditch
3
@SeanMiddleditch Como o desempenho é a métrica errada neste caso? Se texelFetchfor mais rápido e a filtragem de vizinho mais próximo for suficiente, você não poderá alterar o contexto para NN por qualquer motivo, seria razoável preferir isso texture.
Lenar Hoyt
@ MCB: texelFetche texturetrabalhar de forma diferente de maneiras fundamentais. Veja também as entradas: coordenadas de textura versus coordenadas normalizadas. Eles servem a propósitos diferentes. Um não é apenas uma otimização do outro.
Sean Middleditch
6

Como não há resposta aceita, adiciono algumas informações, queria apenas adicionar coisas que ainda não foram ditas por Sean em sua resposta.

O TexelFetch trata a textura como uma Imagem, para que você possa acessar exatamente o conteúdo de pixels. Você costuma fazer isso quando precisa exatamente desse conteúdo, em poucas ocasiões, porém úteis:

  • Certos filtros de pós-processamento (o desfoque guassiano explora a interpolação de amostras de textura e, portanto, não pode usar o TexelFetch)
  • Quando os vértices precisam ler dados das texturas e essa é uma operação dependente de 2 coordenadas

O Tex2D trata a textura como uma textura. Você não deseja o conteúdo exato de um pixel, mas deseja o resultado mais realista. Uma leitura de textura padrão é uma operação muito complexa e envolve a leitura de dados interpolados de um ou mais níveis de mipmap e, em seguida, interpola novamente. Todas essas operações caras são para evitar artefatos visuais.

GL_NEAREST não funcionará da mesma maneira, porque nos polígonos mais distantes você está lendo dados no nível mipmap menor, que não são os mesmos dados exatos que você leria de uma busca texel.

Há um caso em que o Tex2D (quase) funciona da mesma forma que o TexelFetch:

  1. o filtro é GL_NEAREST
  2. você está usando uma pirâmide mipmap incompleta com 1 nível
  3. seus UVs não são componentes de vértices normalizados (mas você precisa normalizá-los no shader)
Desenvolvedor de jogos
fonte