Estoy tratando de crear un efecto brillante para mi sombreador en tiempo real, pero no sé cómo.
Aquí hay un ejemplo y otro ejemplo .
¿Qué técnica puedo usar para implementar esto?
Estoy tratando de crear un efecto brillante para mi sombreador en tiempo real, pero no sé cómo.
Aquí hay un ejemplo y otro ejemplo .
¿Qué técnica puedo usar para implementar esto?
Respuestas:
Bueno, cuando se nos pide que diseñemos cualquier sombreador, debemos comenzar dividiendo las cosas en problemas más pequeños. Y al igual que tenga en cuenta que el efecto brillante en realidad no hace que el sombreador se vea bien, pero la iluminación general y el efecto, usar solo uno de ellos no se verá tan bien.
En primer lugar, establezcamos lo que no es directamente parte del sombreador:
En segundo lugar, separemos el sombreador real en efectos separados:
Tenga en cuenta que tales telas tienen infinitas normales, pero la técnica descrita aquí se aproxima a la normal más significativa
Con el fin de aproximar el más significativo normal, una forma de hacerlo, es el uso de coordenadas de textura y tangentes calcular de la malla, y en lugar de calcular N .L usted calcula 1- (NT).
Explicación completa aquí . Y probablemente necesite implementar eso en fragment shader en lugar de la técnica de vértice de la que hablan. También pueden aplicarse otros modelos anisotrópicos.
Ahora para el efecto brillante:
Esto se puede hacer en el espacio mundial / espacio de textura local, o en el espacio de la pantalla como un pase separado.
El algoritmo que puedo pensar, utiliza la técnica de procesamiento de imágenes (suponiendo que la malla tenga coordenadas de textura).
Tenga en cuenta que la imagen de arriba es solo un ejemplo del filtro máximo, y aplicarlo sobre el ruido dará algo similar a un campo de estrellas.
Ejemplo de filtro gausiano aplicado al ruido máximo (ed).
Tenga en cuenta que esta técnica puede necesitar una optimización significativa para un sombreador en tiempo real.
Hay un interesante artículo sobre AMD: cómo obtener procedimientos .
Parece que los destellos son más difíciles de lo que creo.
Solución decente: use la posición 3D para indexar la función de ruido 3D, agregue el vector de vista, use la función frac para aleatorizar aún más las cosas.
Sparkle:
float specBase = saturate(dot(reflect(-normalize(viewVec), normal),
lightDir));
// Perturb a grid pattern with some noise and with the view-vector
// to let the glittering change with view.
float3 fp = frac(0.7 * pos + 9 * Noise3D( pos * 0.04).r + 0.1 * viewVec);
fp *= (1 - fp);
float glitter = saturate(1 - 7 * (fp.x + fp.y + fp.z));
float sparkle = glitter * pow(specBase, 1.5);