En quoi le texelFetch et la texture d'OpenGL diffèrent-ils?

18

Je comprends les principales différences entre texelFetchet texture, mais j'ai quelques questions sur les détails:

  • Cela texelFetchimplique- t-il une pénalité de performance? Comme ne pas utiliser de cache ou autre?
  • Sont texelFetchet textureinterchangeables lors de l'utilisation GL_NEAREST?
Martin Perry
la source
1
Vous pourriez écrire un cas de test et voir ...
ThorinII
1
Avez-vous oublié de marquer une réponse comme acceptée, ou s'agit-il toujours d'un problème ouvert?
Anko

Réponses:

23

texelFetchest assez différent de texture.

textureest votre fonction d'accès aux textures habituelle qui gère le filtrage et [0,1]les coordonnées de texture normalisées ( ). texelFetchaccède directement à un texel dans la texture (pas de filtrage) en utilisant des coordonnées non normalisées (par exemple, (64,64)dans le texel moyen dans une texture 128x128 vs (.5,.5)en coordonnées normalisées).

Sean Middleditch
la source
4
+1 Je voudrais ajouter que texelFetch est destiné à l'accès aux données lorsque la texture n'est pas particulièrement destinée à être affichée sous forme d'image, mais à d'autres types de données, contrairement à la texture qui accède aux texels lorsqu'ils sont destinés à être utilisés comme images, c'est pourquoi il utilise le filtrage etc. -
concept3d
Y a-t-il une différence de performances?
Lenar Hoyt
1
@mcb: peut-être, mais je ne m'attendrais pas à ce qu'il soit très grand, et cela variera probablement beaucoup selon le fournisseur de matériel. La performance est la métrique absolument erronée à utiliser pour décider laquelle de ces fonctions invoquer: utilisez celle qui convient à votre situation (soit vous avez besoin du filtrage du matériel et texturevous devez donc l'utiliser, soit vous avez besoin du matériel pour ne pas filtrer et vous devez donc utiliser texelFetch).
Sean Middleditch
3
@SeanMiddleditch Comment les performances sont-elles la mauvaise mesure dans ce cas? Si texelFetchc'est plus rapide et que le filtrage du plus proche voisin suffit, vous ne pouvez pas changer le contexte en filtrage NN pour une raison quelconque, il serait raisonnable de le préférer texture.
Lenar Hoyt
@mcb: texelFetchet texturetravaillez différemment de manière fondamentale. Voir aussi les entrées: coordonnées de texture vs coordonnées normalisées. Ils servent à des fins différentes. L'un n'est pas seulement une optimisation de l'autre.
Sean Middleditch
6

Puisqu'il n'y a pas de réponse acceptée, j'ajoute quelques informations, je voulais juste ajouter des choses qui n'ont pas déjà été dites par Sean dans sa réponse.

TexelFetch traite la texture comme une image, vous pouvez donc accéder exactement au contenu des pixels. Vous le faites généralement lorsque vous avez besoin exactement de ce contenu, ce qui est rare mais utile:

  • Certains filtres de post-traitement (le flou guassien exploite l'interpolation des échantillons de texture et ne peut donc pas utiliser TexelFetch)
  • Lorsque les sommets ont besoin de lire les données des textures et que c'est une opération qui dépend de 2 coordonnées

Tex2D traite la texture comme une texture. Vous ne voulez pas le contenu exact d'un pixel, mais vous voulez le résultat le plus réaliste. Une lecture de texture standard est une opération très complexe qui implique la lecture de données interpolées à partir d'un ou plusieurs niveaux de mipmap, puis elle interpole à nouveau. Toutes ces opérations coûteuses visent à éviter les artefacts visuels.

GL_NEAREST ne fonctionnera pas de la même manière car sur les polygones les plus éloignés, vous lisez des données dans le plus petit niveau de mipmap, ce qui n'est pas exactement les mêmes données que vous liriez à partir d'une extraction de texels.

Il y a un cas où Tex2D fonctionne (presque) de la même manière que TexelFetch:

  1. le filtre est GL_NEAREST
  2. vous utilisez une pyramide mipmap incomplète avec 1 niveau
  3. vos UV ne sont pas des composants de sommet normalisés (mais vous devez les normaliser dans le shader)
Développeur de jeu
la source