Shader: extrusión de textura 2D.
El objetivo
Dada una textura 2D aplicada a un cubo, quiero renderizar una extrusión en su profundidad sin hacer ninguna operación iterativa, por lo que el paralaje clásico no es viable para hacer esto.
Ahora consideraré una sola cara, la generación de los lados puede esperar
Recopilando constantes:
En UE4 encontré un nodo de ajuste de “Cubemap Interior” que, a través del vector de la cámara, inserta la cara por un factor de profundidad:
1/vectorTangenteEspacioDeVectoresDeCámara * (-1,1,1) * (u, v, profundidad)
pasando todos los vectores a través de min():
esto me permite generar una representación precisa de las caras traseras del cubo y obtener la última posición de la extrusión en el plano posterior sin artefactos
También podría generar a través del vector de vista un cilindro con un valor en su circunferencia y otro para su profundidad, de esta manera podría tener una representación numérica de la intersección con los planos.
maqueta del cilindro en perspectiva:
Buscando una solución
Solo pude reunir algunas ideas sobre cómo resolver este problema, algunas de las cuales romperían un pipeline de renderizado clásico.
La forma más lógica que podría imaginar sería usar como índice de un arreglo unidimensional los valores representados del cilindro (que funcionaría como un raycast) y establecerlos al dibujar la textura en el espacio UV al valor más alto encontrado.
En otras palabras, al renderizar la imagen en el espacio UV, el valor se escribe en la matriz al índice del rayo en el mismo píxel.
Después, al interpolar los píxeles del propio cilindro, sabría si se encuentran en un rayo que ha golpeado la textura y decidir si renderizarlos o no.
También podría almacenar como valor la profundidad golpeada y usarla para limitar la longitud del rayo a ese valor máximo para no dejarlo dibujar después de los límites de la forma.
De todas maneras, esto no funcionaría en un pipeline normal.
Las otras soluciones que contemplé siempre entran en iteraciones y no son lo que estoy buscando.
Puede que esté equivocado y que esto sea imposible de resolver, solo estoy mirando la cantidad de constantes a las que tengo acceso y no puedo encontrar una solución viable, de hecho, conozco la posición de ambos planos, su representación y no puedo interpretar los píxeles entre ellos porque necesitaría información de profundidad que no puedo interpolar sin iteraciones.
Otra forma de ver este problema sería pensar en esto como una renderización de volumen con un UVW donde W es 1 pero estirado por la profundidad del cubo.
Espero obtener algunas ideas útiles, estoy aprendiendo mucho sobre shaders a través de este ejercicio.
davy.ai
Solución para renderizar extrusiones en profundidad sin operaciones iterativas
Como especialista en TI especializado en shader, renderizado, volúmenes, he estado considerando el problema de renderizar una extrusión en una textura 2D aplicada a la profundidad de un cubo sin usar ninguna operación iterativa mientras que la paralaje tampoco es factible.
Después de analizar diferentes ideas y soluciones, parece haber una forma de lograr la tarea utilizando la siguiente técnica:
Si bien esta solución puede no ser adecuada para una canalización de renderizado estándar, puede ayudar a renderizar extrusiones en profundidad sin operaciones iterativas.