Como no hay una respuesta aceptada, agrego información, solo quería agregar cosas que Sean no dijo en su respuesta.
TexelFetch trata la textura como una imagen, para que pueda acceder exactamente al contenido de píxeles. Usualmente haces eso cuando necesitas exactamente ese contenido, lo cual es en pocas pero útiles ocasiones:
- Ciertos filtros de postprocesamiento (el desenfoque guassiano explota la interpolación de muestras de textura y, por lo tanto, no puede usar TexelFetch)
- Cuando los vértices necesitan leer datos de texturas y esa es una operación que depende de 2 coordenadas
Tex2D trata la textura como una textura. No desea el contenido exacto de un píxel, pero desea el resultado más realista. Una lectura de textura estándar es una operación muy compleja e implica la lectura de datos interpolados de uno o más niveles de mipmap y luego se interpola nuevamente. Todas esas operaciones costosas son para evitar artefactos visuales.
GL_NEAREST no funcionará igual porque en los polígonos más alejados está leyendo datos en el nivel de mapa MIP más pequeño, que no son los mismos datos exactos que leería de una búsqueda de texel.
Hay un caso en el que Tex2D (casi) funciona igual que TexelFetch:
- filtro es GL_NEAREST
- estás usando una pirámide mipmap incompleta con 1 nivel
- sus UV no son componentes de vértices normalizados (pero debe normalizarlos en el sombreador)