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:
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.
¿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
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
Perdón por la respuesta tardía. No he visto que hayas actualizado tu respuesta. – barnacleboy