Buenas gente.
@Zeta V @Mulzani @David Ricardo espero no llegar tarde a la conversación que habéis tenido
. Con respecto a Sampler Feedback y Partially Resident Texture y toda la discusión al respecto me gustaría añadir un par de cosillas. Lo primero es que esto es un proceso incremental cuyos pasos se basan en los anteriores y se van añadiendo de manera iterativa nuevas funcionalidades que mejoran lo que hay (no solo tiene que ser en rendimiento sino en facilidad de uso).
Voy a intentar explicar varias cosas y luego que cada uno saque las conclusiones que quiera xD. Como mucha gente sabe las texturas pueden tener mips es decir, "copias" de la imagen original pero a la mitad de resolución. Por ejemplo una textura de 1024x1024, puede estar formada por esa imagen mas otra de 512x512, otra de 256x256...y así hasta quedarte sin resolución xD. Esto se hace así pq dependiendo de la relación entre distancia, pixeles que ocupa la textura en pantalla y orientación (anisotropía), es preferible usar un mips u otro, o mezclaros para obtener el mejor resultado (filtros bilineal, trilineal, anisotrópico). Esto es lo que se llama mipmapping. Una particularidad es que cuando cargas en memoria todos los mips de una textura estos tienen que estar linealmente contiguos en memoria, esto es importante pq PRT viene a poner patas arriba esto.
Por otro lado y sin profundizar demasiado, cuando en un shader quieres aplicar una textura 2D a un "pixel", invocas una función indicando sobre que textura quieres hacer la lectura y las coordenadas (u,v) a las que quieres acceder (es decir el "punto" dentro de la textura que quieres obtener). El hardware, en este caso las unidades de textura, hacen un complejo y largo proceso por el cual, teniendo en cuenta estos valores y otros muchos más que no vienen al caso, te dan lo que necesitas, el color final por el que has preguntado.
Puesto que la memoria es un bien muy escaso alguien pensó, si tengo un objeto muy lejano que no usa los mips de más calidad, podría cargar en memoria solo los mips necesarios e ir cargando el resto a medida que me voy acercando. Basándose en esto otro alguien pensó, y si en vez de cargar el mips entero solo cargo un trozo, lo que realmente necesite, puedo aumentar la granularidad, usando menos memoria aún. Aparte esto me da la libertad de poder usar texturas gigantes (el hardware impone un limite en el tamaño) de forma que mis artistas se sientan más cómodos, y puedan dar lo mejor de sí preocupándose solo de pintar y no lidiar con splatting, capas, limitaciones... Se inventa el Megatexture. Para ello se virtualizan las texturas, es decir, voy a tener una textura gigante en la memoria de la GPU donde voy a ir metiendo/copiando trocitos de los mips/texturas que vaya necesitando al vuelo. Esto necesita una indirección, un paso intermedio que me traduzca las coordenadas (u,v) "virtuales" en físicas. Aparte hay problemas a la hora de lidiar con los filtros de texturas y con la compresión de texturas. Todo esto ocurre pq no se tenía el apoyo del hardwre, se hacia por software.
AMD, Nvidia, Intel...que no son tontos y que escuchan a los desarrolladores dijeron, coño pues esto es interesante, voy a facilitarles la vida. Voy a implementar en hardware todo lo q están haciendo en software. Es decir voy a virtualizar las texturas en hardware, de forma que voy a permitir partir una textura y sus mips en trozos de 64 KB que es tamaño de página de mi sistema, los cuales no tienen pq estar cargados todos memoria al mismo tiempo y tampoco deben estar contiguos. Además les voy a dar herramientas para que cuando intenten leer uno de estos trozos pero no esté en memoria, sepan que hay un fallo. Así podrán cargar ese trozo y usarlo después y mientras pueden usar el mips mas penco que tengas en memoria para texturizar y que no se vea un trozo de color negro. Por eso algunas veces se ve zonas borrosas que se van cargando al vuelo pq no da tiempo a tenerlos cargados en memoria (hola SSD
). Además voy a permitirles usar filtros (bilineal, trilineal, anisotrópico) y texturas comprimidas. Esto son las texturas parcialmente residentes o PRT.
Pero tal y como lo desarrollaron, hay situaciones en las que por el tipo de filtro usado (sobre todo anisotrópico) es más complicado determinar que mips has usado para obtener el color en la lectura de la textura y por tanto qué deberías cargar. Para facilitar esta tarea Nvidia (aunq no se si Intel sacó algo antes...) saca una cosita interesante que posteriormente abrazaría AMD y que acabaría siendo el sampler feedback. Cuando haces una lectura a una textura parcialmente residente, el hardware te devuelve no solo el color o si ese trozo está en memoria o no, sino que te da información acerca de qué páginas ha usado para hacer dicha lectura. Facilita la vida al programador dándole más información.
Resumiendo después de este tochazo inútil:
- Con PRT puedes leer trozos de textura de cada mip?. Si.
- Puedes hacer streamming de esos trozos con PRT y usar solo lo que necesites?. Si.
- Que añade Sampler Feedback?. Se le da más información al programador para que sepa mas concretamente que trozos se han usado para obtener un color al leer una textura.
- Por eso a veces se le llamada PRT+, pq es PRT pero añade alguna cosita más. Microsoft ha añadido en Xbox Series un filtrado especial para mezclar páginas y que todo quede más nitido y chachi piruli.
- PS5 lo tiene?. No lo se, pero me extrañaría que no lo tuviera puesto que no es un cambio exagerado.
Un saludo.