2012-09-25 23 views
8

Todavía estoy trabajando en un proyecto de procesamiento de imágenes que utiliza sombreadores HLSL para agregar filtros de Photoshop como sombra paralela, bisel, etc. Ahora estoy buscando un enfoque para implementar un efecto de resplandor externo en HLSL.Resplandor exterior como sombreador HLSL

Actualmente estoy experimentando con la siguiente idea:

1) Escala la textura actual para crear el resplandor (parámetro: glowSize, que establece el tamaño del contorno)

2) la falta de definición horizontal

3) la falta de definición vertical, cambio de color de desenfoque a brillar de color y añadir textura original encima

estoy usando el siguiente shader HLSL pase múltiples para la prestación del resplandor:

float4 PS_Scale(VS_OUTPUT IN) : COLOR0 
{ 
    float2 tex = IN.texture0; 
    float2 scaleCenter = float2(0.5f, 0.5f); 
    float2 scaleTex = (tex - scaleCenter) * glowSize + scaleCenter; 
    return tex2D(foreground, scaleTex); 
} 

float4 PS_GlowH(VS_OUTPUT IN) : COLOR0 
{ 
    float2 Tex = IN.texture0; 

    float4 sum = float4(0.0, 0.0, 0.0, 0.0); 
    sum += tex2D(secondForeground, float2(Tex.x - 4.0*blur, Tex.y))*0.05; 
    sum += tex2D(secondForeground, float2(Tex.x - 3.0*blur, Tex.y))*0.09; 
    sum += tex2D(secondForeground, float2(Tex.x - 2.0*blur, Tex.y))*0.12; 
    sum += tex2D(secondForeground, float2(Tex.x - blur, Tex.y))*0.15; 
    sum += tex2D(secondForeground, float2(Tex.x, Tex.y))*0.16; 
    sum += tex2D(secondForeground, float2(Tex.x + blur, Tex.y))*0.15; 
    sum += tex2D(secondForeground, float2(Tex.x + 2.0*blur, Tex.y))*0.12; 
    sum += tex2D(secondForeground, float2(Tex.x + 3.0*blur, Tex.y))*0.09; 
    sum += tex2D(secondForeground, float2(Tex.x + 4.0*blur, Tex.y))*0.05; 

    return sum; 
} 

float4 PS_GlowV(VS_OUTPUT IN) : COLOR0 
{ 
    float2 Tex = IN.texture0; 

    float4 sum = float4(0.0, 0.0, 0.0, 0.0); 
    sum += tex2D(secondForeground, float2(Tex.x, Tex.y - 4.0*blur))*0.05; 
    sum += tex2D(secondForeground, float2(Tex.x, Tex.y - 3.0*blur))*0.09; 
    sum += tex2D(secondForeground, float2(Tex.x, Tex.y - 2.0*blur))*0.12; 
    sum += tex2D(secondForeground, float2(Tex.x, Tex.y - blur))*0.15; 
    sum += tex2D(secondForeground, float2(Tex.x, Tex.y))*0.16; 
    sum += tex2D(secondForeground, float2(Tex.x, Tex.y + blur))*0.15; 
    sum += tex2D(secondForeground, float2(Tex.x, Tex.y + 2.0*blur))*0.12; 
    sum += tex2D(secondForeground, float2(Tex.x, Tex.y + 3.0*blur))*0.09; 
    sum += tex2D(secondForeground, float2(Tex.x, Tex.y + 4.0*blur))*0.05; 

    float4 result = sum * opacity; 
    result.rgb = float3(glowColor.r, glowColor.g, glowColor.b)/255.0f; 

    float4 src = tex2D(foreground, IN.texture0.xy); 
    return result * (1-src.a) + src; 
} 

El resultado de este código se ve bien cuando se utiliza formas simples como una elipse, pero no funciona cuando se aplica el sombreado en el texto:

Output of the above shader

Es obvio que hay un problema con el escalada. No tengo ni idea de cómo escalar la textura original para utilizarla como contorno. ¿Es eso posible? ¿Alguna otra idea de cómo implementar un brillo exterior o un filtro de contorno en HLSL?

Gracias de antemano.

Respuesta

10

Su estrategia de escala no se puede aplicar en esta situación. Deseche el paso de escalado, use solo pasos de desenfoque y el paso de composición. Funcionará.

Déjame mostrarte cómo el difuminado sombreado crea un efecto de brillo.

A: hay una imagen original.

Original Image

B: Cambiar el color de la imagen, y aplicar el sombreado de desenfoque.

Blurred Image

C: Combinar la imagen borrosa con la imagen original.

Result Image

Si desea controlar un tamaño de brillo, utilizar un tamaño de grano de los pasos de desenfoque para que, en lugar de la escala. Usé desenfoques gaussianos para crear imágenes a continuación.

  • Kernel Tamaño 5

Gaussian Size 5

  • Kernel Tamaño 10

Gaussian Size 10

  • Kernel Tamaño 15

enter image description here

+0

¿Cómo puede un shader de desenfoque como el que yo he publicado anteriormente ofrecer resultados similares a la opción de brillo de mezcla de Photoshop? – barnacleboy

+0

Mi código ya lo hace, pero no puedo encontrar una manera de establecer el tamaño de brillo sin la escala. El resplandor que obtengo de mi sombreador está bien, pero no puede crecer sin la escala ... – barnacleboy

+0

Perdón por la respuesta tardía. No he visto que hayas actualizado tu respuesta. – barnacleboy