es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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

El efecto deseado:
el efecto deseado


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():
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

el plano frontal y posterior:
el plano frontal y posterior

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:
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.

Tags:  , ,

Answer

  1. Avatar for 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:

    1. Utilice el nodo de preset “Interior Cubemap” disponible en UE4 que inserta la cara por un factor de profundidad basado en el vector de la cámara.
    2. Genere las caras traseras del cubo y obtenga la última posición de la extrusión en el plano trasero sin artefactos.
    3. Pase todos los vectores a través de min() para generar el plano frontal y trasero del cubo.
    4. Genere un cilindro con un valor en su circunferencia y otro para su profundidad a través del vector de visión.
    5. Use el cilindro (actuando como raycast) como índice de una matriz 1D para representar los valores y establecerlos al dibujar la textura en el espacio UV al valor más alto encontrado.
    6. Después de renderizar la imagen en el espacio UV, interpole los píxeles del propio cilindro para verificar si se encuentran en un rayo que haya golpeado la textura y decida si renderizarlos o no.
    7. Almacene la profundidad del hit como un valor y utilícelo para limitar la longitud del rayo a ese valor máximo para evitar que dibuje después de los límites de la forma.
    8. Considere esto como un renderizado de volumen con UVW, donde W es 1 pero estirado por la profundidad del cubo.

    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.

Comments are closed.