¿Toon / cel sombreado con ancho de línea variable?


15

Veo algunos enfoques generales para sombrear cel:

  1. Duplicación y ampliación del modelo con normales invertidos (no es una opción para mí)
  2. Filtro Sobel / sombreador de fragmentos se acerca a la detección de bordes
  3. El búfer de plantilla se acerca a la detección de bordes
  4. Enfoques de sombreado de geometría (o vértice) que calculan las normales de la cara y el borde

¿Estoy en lo cierto al suponer que el enfoque centrado en la geometría brinda la mayor cantidad de control sobre la iluminación y el grosor de la línea, por ejemplo? para un terreno donde podría ver la línea de silueta de una colina fusionándose gradualmente en una llanura?

¿Qué sucede si no necesito iluminación de píxeles en las superficies de mi terreno? (Y probablemente no lo haga, ya que planeo usar iluminación / sombreado basado en vértices o texturas basadas en celdas). Entonces, ¿sería mejor seguir con el enfoque de tipo geometría, o optar por un enfoque de espacio / fragmento de pantalla en su lugar? para mantener las cosas más simples? Si es así, ¿cómo obtendría el "entintado" de las colinas dentro de la silueta de la malla, en lugar de solo el contorno de toda la malla (sin detalles de "tinta" dentro de ese contorno? (También conocido como contornos sugestivos , pliegues ).

Por último, ¿es posible emular de manera económica el enfoque de las normales volteadas, utilizando un sombreador de geometría? Mi preocupación con esto es que ciertamente podría duplicar cada vértice y escalarlos en consecuencia, pero ¿cómo abordaría voltear las normales y una coloración distinta en el sombreador de fragmentos?

Lo que quiero: grosor de línea variable con líneas intrusivas dentro de la silueta ...

ingrese la descripción de la imagen aquí

Lo que no quiero ...

ingrese la descripción de la imagen aquí


EDITAR: La investigación adicional ha revelado lo siguiente ...

Dado que tengo un conteo de vértices masivo en el terreno, incluso teniendo en cuenta la LoD basada en la distancia, ni las normales volteadas ni un enfoque basado en sombreador de geometría (incluso con el sacrificio de frustum) serían una opción sensata debido a la gran complejidad computacional involucrada en la duplicación y escala de todo vértices cargados.

Teniendo en cuenta que no necesito iluminación por píxel en forma de sombreado de tono sólido en las superficies del terreno, también es menos prudente considerar cualquier enfoque basado en la normalidad de la cara, de lo contrario, es un requisito para la iluminación correcta de la superficie, ya que estos son naturalmente bastante caros de calcular. Sin embargo, es cierto que dan el mejor grado de control; por ejemplo, la capacidad de sombrear bordes usando trazos "artísticos": hermoso, pero de nuevo, no es realmente viable para un entorno de juego masivamente complejo.

Los amortiguadores de plantilla son algo que preferiría evitar, ya que preferiría hacer todo el trabajo en sombreadores. (El ejemplo anterior con el contorno rojo se realizó con un búfer de plantilla - vieja escuela).

Esto deja enfoques de espacio de imagen de sombreador de fragmentos. La complejidad computacional se reduce a la cantidad de fragmentos en lugar de la cantidad de vértices (en mi caso, esto es 10-100x menos operaciones de las que tendría que hacer en el sombreador de geometría). Esto requiere más de un paso de renderizado para generar un búfer g (que consiste en un búfer normal y, opcionalmente, también un búfer de profundidad) al que podemos aplicar filtros de discontinuidad (por ejemplo, operador Sobel). La discontinuidad de profundidad es lo que permite contornos y arrugas sugerentes. Mi única objeción con este enfoque es la incapacidad de proporcionar un control más fino sobre los anchos de los bordes entintados, aunque con el algoritmo correcto en el sombreador de fragmentos, estoy seguro de que esto sería posible.

Entonces, la pregunta ahora se vuelve más específica: ¿cómo exactamente conseguiría obtener anchos de borde variables, particularmente en la silueta exterior, en un sombreador de fragmentos?


El grosor de línea variable es una característica del enfoque geométrico. No puedo conseguirlo de otra manera eficientemente. Como quiere eso, no veo los sombreadores de píxeles como el "método más eficiente": número de píxeles a buscar = (grosor_línea * 2 + 1) ^ 2 - 1. Eso básicamente significa que su sombreador posterior al proceso será mucho (estimación aproximada: 10x) más lento si máx. el ancho de línea es igual a 2. Simplemente suelte el prejuicio y pruebe el enfoque del sombreador de geometría.
serpiente5

@ snake5 ¿Estás sugiriendo honestamente que corro a través de 150 millones de vértices por actualización de render (unos 25 millones con selección de vistas), en el GS? Realmente no estoy comprando eso, pero gracias por el aporte. Refiérase a lo que dije anteriormente sobre los conteos de vértices y la complejidad. Incluso con su figura de 10x, el sombreador de fragmentos al menos dibujaría uniforme, y probablemente lo haría mucho mejor.
Ingeniero

25 millones de vértices (lecturas / escrituras lineales) frente a 23 millones de muestras de textura (lecturas de memoria bastante mal almacenadas en caché + descompresión de datos de destino de renderizado) @ 1280x720. Limitar / reducir el conteo de vértices es mucho más fácil, por cierto. Especialmente en estos días, cuando los monitores grandes (1920x1080 +) y las configuraciones multimonitor se están volviendo muy populares.
serpiente5

¿Qué pasa con el uso del mismo algoritmo que el que genera los contornos rojos y luego las líneas de adelgazamiento / crecimiento en función de su profundidad?
Ali1S232

@Gajoo, como decía en la pregunta, no se trata solo de la silueta. Tenga en cuenta las líneas intrusivas detrás del hombro de la niña en la primera imagen. Esos son una función del enfoque de las normales invertidas y actúan como contornos / pliegues sugestivos. Necesito lo mismo
Ingeniero

Respuestas:


4

Decidí optar por un enfoque de sombreador de fragmentos mediante el filtrado de discontinuidad del búfer de profundidad. Las razones para esto son:

  1. El conteo mundial de vértices es muy, muy alto debido a las inmensas distancias de visión, incluso con malla LoD;
  2. Estoy realizando una serie de otras operaciones de sombreado de fragmentos, como el desenfoque DoF que puede beneficiarse de las mismas estructuras (muestreo / filtrado de caja o gaussiano) en la misma pasada.

Después de probarlo, diría que en futuros proyectos optaría por un enfoque basado en la geometría, por razones de complejidad. La razón es que (como otros sugirieron en los comentarios), los enfoques de sombreado de fragmentos para la detección de bordes pueden ser computacionalmente intensos, particularmente con implementaciones de DoF donde el círculo de radio de confusión, y por lo tanto el número de muestras por fragmento, puede ser bastante alto. Afortunadamente, esto no es una preocupación para los sombreadores de contorno.


Creo que ir con la discontinuidad de las normales le daría mejores resultados en caso de que tenga normales planas. Puede variar el ancho de la línea tomando muestras más separadas.
Grieverheart

@Grieverheart Esta es la respuesta aceptada, porque el método que estoy usando funciona bien. Gracias.
Ingeniero

0

En realidad, existe una solución general muy fácil si puede usar un efecto secundario. Lo mejor es que no importa qué tan alto sea tu conteo de polietileno. Renderice un mapa de Profundidad como escala de grises, luego cree un punto en el color de línea que desee, cuando el contraste entre dos píxeles adyacentes sea mayor que un valor umbral. Puede agrandar el punto de acuerdo con el contraste o el nivel de luz de la imagen que ha renderizado.

Inventé el algoritmo toonShader en 2000/2001, incluso antes que el francés, que creó esta solución. La mía se basó en la geometría real de los materiales. Básicamente, existen dos formas de hacerlo: 1. Mire las normales, si las normales dos planos conectados a una línea están orientados hacia la cámara y hacia la cámara, renderice esa línea, luego puede usar la profundidad, la iluminación, etc. como señales para las profundidades de línea. 2. Mire la geometría renderizada (por lo tanto, después de la transformación de perspectiva) Tome cada línea recta, si los vértices de los planos de conexión están en el mismo lado de esta línea plana, renderiza la línea. Luego puede hacer lo mismo para el grosor de línea como en método 1. 3. Podrías hacer combinaciones de estas tres técnicas, pero mencioné la primera, porque indicaste una gran cantidad de polivinilos.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.