Cómo pintar sobre modelos 3d

Sep 17 2020

He buscado este tema durante mucho tiempo y básicamente no he encontrado información al respecto.

Si tenemos un modelo 3d con diseño uv. ¿Cuál es la técnica básica para pintar en 3D sobre dicho modelo con pincel? Un trazo de pincel consiste en la imagen / datos de píxeles del pincel dispuestos en sucesión. Entonces, ¿proyectamos cada imagen de pincel individual en la superficie del objeto? (Aunque en realidad para hacer esto estaríamos proyectando el objeto en el espacio de la imagen). He logrado proyectar texturas en objetos antes. Y proyectar cada imagen de pincel individual definitivamente parece factible, pero no estoy seguro de si es práctico desde el punto de vista del rendimiento y si existen mejores técnicas.

Respuestas

1 wychmaster Sep 18 2020 at 15:18

No puedo ofrecerle un enfoque "mejor" aquí, pero creo que el enfoque

proyectar cada imagen de pincel individual en la superficie del objeto

no es realmente un problema de rendimiento si lo implementa con la GPU. Especialmente en un entorno de editor, donde no ocurre mucho en comparación con un juego de computadora. Básicamente, todo lo que quieres hacer es renderizar una sola imagen por fotograma en un conjunto limitado de texturas. Puedo darle un borrador de cómo abordaría el tema si necesitara esta función. Sin embargo, dado que aún no lo he implementado, puede haber algunas complicaciones y problemas en los que no había pensado, así que avíseme en los comentarios si algo no funciona como se esperaba.

  1. Encuentra las superficies afectadas

    • Utilice las esquinas de la textura de su pincel y genere un frustum de proyección de pincel reducido
    • Verifique todos los objetos y encuentre las superficies más cercanas -> Si ya usa algún tipo de selección para su escena, reutilice la lista de objetos ya eliminados, ya que el pincel solo puede "ver" lo que ve la cámara
    • Identificar las subsuperficies / triángulos afectados por el cepillo
  2. Reúna todas las texturas afectadas. Debes saber, para cada superficie afectada, qué textura posee. De manera óptima, todo su objeto tiene una sola textura UV.

  3. Crea un programa de sombreado para renderizar tu textura.

    • tenga cuidado, el sombreador de vértices tiene que calcular las coordenadas UV normalizadas y pasarlas por la tubería como la posición del vértice, ya que son la posición en su textura. Verifique qué información adicional necesita para transmitir la tubería.
    • En el sombreador de fragmentos, sobrescriba cada píxel que está debajo del pincel. Es posible que deba usar la combinación aquí para pinceles no rectangulares.
    • La posición del cepillo es un poco complicada. Lo necesita en el espacio UV de texturas en el sombreador de fragmentos y no estoy seguro de si puede calcularlo en el sombreador de vértices. Por lo tanto, es posible que deba hacer eso en el sombreador de fragmentos o, alternativamente, en un sombreador de geometría. El problema que veo es que el ángulo en el que la proyección del pincel golpea la superficie no se puede calcular en el sombreador de vértices y es necesario determinar el área cubierta. El sombreador de geometría tiene suficiente información para calcular el ángulo y el área cubierta. En el sombreador de fragmentos, tampoco puede calcular el ángulo, pero allí simplemente puede verificar si está ubicado en el frustum de proyección del pincel y dónde se encuentra.
  4. Ahora simplemente renderice a sus texturas.

    • Une la textura de tu pincel
    • Para cada textura afectada
      • Enlazar la textura como destino de renderizado
      • Renderice todos los objetos afectados y deje que la GPU determine qué píxeles deben sobrescribirse.
  5. (Opcional) Si desea guardar sus modificaciones, debe volver a leer las texturas de la GPU y guardarlas.

Dado que el trabajo principal lo realiza la GPU, debería ser bastante rápido. Sin embargo, puedo ver algunos problemas con el enfoque descrito cuando el pincel golpea varios objetos / texturas que se superponen parcialmente. Clasificar qué píxel del pincel afecta qué textura / objeto puede ensuciarse. Puede haber algunos trucos de búfer de plantilla / profundidad que se pueden aplicar, pero creo que este es un tema para otra pregunta.

1 Thomas Sep 18 2020 at 15:13

Siempre que no se utilice dos veces ningún píxel en la textura, puede representar la geometría y mostrar las coordenadas uv (coordenadas de la textura). Por lo general, son una combinación de rojo y verde (2d). Cuando use un pincel, solo necesita leer las coordenadas uv que ha golpeado y colorear la textura en la posición (uv) en el color deseado.

Sugerencia: pinte sobre una segunda textura, para no destruir el color de la textura original.

Inconvenientes: A veces, la resolución de la textura de diferentes triángulos dentro de una geometría varía. Entonces, en algunas caras se verá bien, y en otras se pixelará.

Como se dijo antes, si la malla (geometría) usa la misma parte de una textura dos veces (dos caras apuntando a las mismas coordenadas de textura), y dibuja en una de ellas, la otra también se pintará.

the1bird Sep 17 2020 at 07:19

Podrías hacerlo de diferentes formas.

Pero la forma más lógica para mí es que hay puntos muestreados a lo largo de la ruta, luego se usan splines / curvas benzier para suavizarla (se pueden interpolar puntos adicionales), luego se proyecta y se guarda en la textura. Por tanto, no es necesario muestrear "todos" los puntos.