¿En qué se diferencian texelFetch y la textura de OpenGL?

18

Entiendo las principales diferencias entre texelFetchy texture, pero tengo algunas preguntas sobre los detalles:

  • ¿ texelFetchImplica una penalización de rendimiento? ¿Como no usar un caché o algo así?
  • ¿Son texelFetche textureintercambiables cuando se usan GL_NEAREST?
Martin Perry
fuente
1
Podrías escribir un caso de prueba y ver ...
ThorinII
1
¿Se olvidó de marcar una respuesta como aceptada o sigue siendo un problema abierto?
Anko

Respuestas:

23

texelFetches muy diferente de texture.

texturees su función habitual de acceso a la textura que maneja el filtrado y las [0,1]coordenadas de textura normalizadas ( ). texelFetchaccede directamente a un texel en la textura (sin filtrado) usando coordenadas no normalizadas (p. ej., (64,64)en el texel del medio-ish en una textura de 128x128 vs (.5,.5)en coordenadas normalizadas).

Sean Middleditch
fuente
44
+1 Me gustaría agregar que texelFetch está destinado al acceso a datos cuando la textura no está destinada a mostrarse como una imagen, sino a otro tipo de datos, a diferencia de la textura que accede a los texels cuando están destinados a ser utilizados como imágenes, es por eso que utiliza el filtrado, etc. -
concept3D
¿Hay alguna diferencia en el rendimiento?
Lenar Hoyt
1
@mcb: tal vez, pero no esperaría que fuera muy grande, y probablemente variará mucho según el proveedor de hardware. El rendimiento es la métrica absolutamente incorrecta que se debe usar al decidir cuál de estas funciones invocar: use la que sea correcta para su situación (necesita el filtrado del hardware y, por lo tanto, debe usarlo textureo necesita que el hardware no lo haga y, por lo tanto, debe usar texelFetch)
Sean Middleditch
3
@SeanMiddleditch ¿Cómo es el rendimiento la métrica incorrecta en este caso? Si texelFetches más rápido y el filtrado del vecino más cercano es suficiente, no puede cambiar el contexto a filtrado NN por cualquier razón, sería razonable preferirlo texture.
Lenar Hoyt
@mcb: texelFetchy texturefunciona de manera diferente en formas fundamentales. Vea también las entradas: coordenadas de textura vs coordenadas normalizadas. Sirven para diferentes propósitos. El uno no es solo una optimización del otro.
Sean Middleditch
6

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:

  1. filtro es GL_NEAREST
  2. estás usando una pirámide mipmap incompleta con 1 nivel
  3. sus UV no son componentes de vértices normalizados (pero debe normalizarlos en el sombreador)
Desarrollador de juegos
fuente