¿Cómo puedo crear un efecto de brillo?


9

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 .

ingrese la descripción de la imagen aquí

¿Qué técnica puedo usar para implementar esto?


Se podría lograr a través de un efecto posterior al proceso, similar a la floración, pero aplicando un patrón (una textura de estrella) a la fase de muestra descendente. Todo esto es solo especulación dura.
akaltar

1
¿Un mapa normal y especular no le permitiría hacer esto a través de una textura?
JohnB

Hice alguna prueba usando el mapa normal. Pero lo difícil es hacer que brillen de acuerdo con la orientación de la vista y la orientación de la luz.
MaT

Respuestas:


10

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:

  1. El sombreado no es parte del sombreador, y se realiza a través de un pase de sombreado separado.
  2. yo asumo que hay oclusión ambiental (especialmente que esta imagen se muestra en la cuestión es particularmente no usar render en tiempo real, sino que es una suposición).

En segundo lugar, separemos el sombreador real en efectos separados:

  1. Hay una iluminación anisotrópica, que es muy orientada al aspecto general del sombreador. La razón detrás de esto es que el material real contiene telas, estas telas brillantes hacen que la reflexión de la luz tenga un sesgo direccional, lo que hace que la mayor cantidad de luz reflejada en esa determinada dirección.

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí 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).

  • Genere un ruido 2D de alta frecuencia en la superficie de la malla utilizando sus coordenadas de textura, el ruido perlin parece un buen candidato.
  • Aplique un filtro máximo usando kernel 3x3 en el ruido. Esto generará un efecto similar a la imagen a continuación, y el filtro máximo se describe aquí .

ingrese la descripción de la imagen aquí

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.

  • Una vez que haya hecho esto, aplique un filtro gaussiano con cierta desviación del ruido para obtener una forma de estrella.

ingrese la descripción de la imagen aquí

Ejemplo de filtro gausiano aplicado al ruido máximo (ed).

  • El paso final es combinar esto con una textura de malla original y luz. Esto se hace mejor usando una operación binaria (|) o-ing con la textura / color de malla original, esto tomará solo el blanco del ruido y eliminará los píxeles negros. Con respecto a la luz (y posiblemente a otros mapas especulares), lo mejor que puede hacer es agregarla o modularla con sus píxeles combinados previamente. También es posible que necesite un efecto de procesamiento posterior de brillo para un mejor brillo.

Tenga en cuenta que esta técnica puede necesitar una optimización significativa para un sombreador en tiempo real.


3

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);
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.