Veo algunos enfoques generales para sombrear cel:
- Duplicación y ampliación del modelo con normales invertidos (no es una opción para mí)
- Filtro Sobel / sombreador de fragmentos se acerca a la detección de bordes
- El búfer de plantilla se acerca a la detección de bordes
- 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 ...
Lo que no quiero ...
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?