Implementación de calcomanías

11

Tuve problemas para encontrar información sobre las calcomanías, por lo que tal vez esta pregunta ayude a otros. La implementación es para un renderizador hacia adelante.

¿Alguien podría confirmar si obtuve la implementación correcta de la calcomanía?

  • Define un cubo de cualquier dimensión que definirá el volumen de proyección en el espacio común. Verifica la intersección del triángulo con el cubo definido para recibir triángulos a los que afectará la proyección.
  • Recorta estos triángulos y guárdelos.
  • Luego usa trucos de matriz para calcular las coordenadas UV para los triángulos guardados que harán referencia a la textura que está proyectando.
  • Para hacer esto, toma los vectores que representan la altura, el ancho y la profundidad del cubo en el espacio común, de modo que la esquina inferior izquierda es el origen.
  • Pones eso en una matriz como los vectores unitarios i, j, k, configuras la traducción para el cubo, luego inviertes esta matriz.
  • Multiplica los vértices de los triángulos guardados por esta matriz, de esa manera obtienes sus coordenadas dentro de un cubo de tamaño 0 a 1 que utilizas como coordenadas UV.
  • De esta manera, tiene los triángulos originales sobre los que está proyectando y tiene coordenadas UV para ellos (las coordenadas UV hacen referencia a la textura que está proyectando).
  • Luego, vuelve a colocar los triángulos guardados en la escena y sobrescriben el área de proyección con la imagen proyectada.

Ahora las preguntas para las que no pude encontrar respuestas. ¿Es correcto el último punto? Nunca he hecho el recorte de software, pero parece bastante propenso a errores, debido a la precisión limitada, que se producirán algunas luchas z por la textura proyectada. ¿También es correcta la forma de obtener coordenadas UV?

dreta
fuente
Aquí hay un enlace con enlaces: gamedev.stackexchange.com/questions/24653/…
Luis Estrada

Respuestas:

5

Mira este articulo:

http://blog.wolfire.com/2009/06/how-to-project-decals/

Parece que está usando exactamente el mismo enfoque que estás usando. No habla de peleas z, pero definitivamente podría convertirse en un problema a grandes distancias.

Mi sugerencia sería deshabilitar las calcomanías después de una cierta distancia si la lucha z se vuelve muy visible.

caballero666
fuente
He visto este artículo varias veces, lo que pasa es que no habla en absoluto de lo que estoy preguntando, como mencionaste, la lucha z no es realmente un problema de distancia, es solo que tú Estoy tratando de renderizar justo encima de la geometría existente y debido a la precisión limitada, ¿puedes / no puedes estar seguro de que estará encima o exactamente en el mismo lugar
Dreta
1
Al dibujar calcomanías, siempre puede establecer la función de comparación del búfer de profundidad en menor o igual que menor que para que las calcomanías siempre se dibujen justo encima de la superficie que están afectando.
jmegaffin
1

Lo que hice para resolver la lucha Z fue aumentar el valor Z del vértice en una pequeña cantidad, en mi sombreador de calcomanías, después de que esté en las coordenadas de la pantalla.

OK ..... uso calcomanías de malla ajustadas. Creo una malla nxn con Y sentado en el terreno. Yo uso el código para encontrar la Y en la malla del polígono del terreno. Después de todos los transfroms, estoy dibujando sobre la parte superior de la geometría existente en las coordenadas de la pantalla. El búfer de profundidad está en las coordenadas de la pantalla, por lo que al mover la Z de los polígonos de calcomanías un poco hacia la pantalla, se detiene la lucha Z. Al hacer esto, reduje a la mitad la cantidad de polígonos que forman mis mallas de calcomanías ajustadas. Este es el viejo código 120

 vec4 v = gl_ModelViewProjectionMatrix * gl_Vertex;
 v.z -= .03;
 gl_Position = v;

Espero que esto lo explique mejor ... (según lo solicitado)

Todo el marco de alambre.

Terreno de alambre solamente.

Mike O
fuente
1
Esta respuesta parece particularmente corta e inespecífica. ¿Podrías aclarar tu respuesta?
Gnemlock
1
No es difícil de entender. Muevo el vértice un poco en la dirección Z en el espacio de la pantalla. Debido a que en OpenGL siempre estás buscando una Z positiva en el espacio de la pantalla, mover la Z negativa una pequeña cantidad arregla la lucha Z. Sin embargo, hay un problema con esto. Al alejarse, la z puede mover la calcomanía mucho más de lo necesario. Una solución es escalar la cantidad de desplazamiento por el ojo a la distancia del vértice.
Mike O