Since there's no accepted answer I add some info, I wanted just to add things not already said by Sean in his answer.
TexelFetch treats the texture as a Image, so you can access exactly the content of pixels. You usually do that when you need exactly that content, which is in few but usefull occasions:
- Certain post processing filters (Guassian blur exploits texture sample interpolation and so it cannot use TexelFetch)
- When vertices needs to read data from textures and that is a operation dependent on 2 coordinates
Tex2D treat the texture as a texture. You don't want the exact content of a pixel, but you want the most realistic result. A standard texture read is a very complex operation and it involves reading interpolated data from one or more mipmap levels and then it interpolates again. All those expensive operations are to avoid visual artifacts.
GL_NEAREST will not work the same because on farest polygons you are reading data in the smaller mipmap level, wich is not the same exact data you would read from a texel fetch.
There is one case where Tex2D (almost) work the same of TexelFetch:
- filter is GL_NEAREST
- you are using a incomplete mipmap pyramid with 1 level
- your UVs are not normalized vertex components (but you have to normalize them in the shader)