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?
fuente
Respuestas:
Decidí optar por un enfoque de sombreador de fragmentos mediante el filtrado de discontinuidad del búfer de profundidad. Las razones para esto son:
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.
fuente
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.
fuente