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:
- o filtro é GL_NEAREST
- você está usando uma pirâmide mipmap incompleta com 1 nível
- seus UVs não são componentes de vértices normalizados (mas você precisa normalizá-los no shader)