Sto ancora lavorando a un progetto di elaborazione delle immagini che utilizza gli shader HLSL per aggiungere filtri di Photoshop come drop shadow, smussatura e così via. Ora sto cercando un approccio per implementare un effetto bagliore esterno in HLSL.Outer Glow come shader HLSL
Attualmente sto sperimentando con la seguente idea:
1) Scala la texture corrente per creare il bagliore (parametro: glowSize, che imposta la dimensione del contorno)
2) sfocatura orizzontale
3) sfocatura verticale, cambiamento di colore di sfocatura a brillare il colore e aggiungere texture originale sulla parte superiore
sto utilizzando il seguente Shader Multi passaggio HLSL per il rendering il bagliore:
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;
}
Il risultato di questo codice sembra OK quando si utilizza forme semplici come un'ellisse, ma non funziona quando si applica lo shader del testo:
E 'ovvio che ci sia un problema con il scaling. Non ho idea di come ridimensionare la texture originale per usarla come contorno. È possibile? Altre idee su come implementare un filtro bagliore o contorno esterno in HLSL?
Grazie in anticipo.
Come può uno shader sfocatura simile a quella che ho postato sopra fornire risultati simili a l'opzione bagliore fusione di Photoshop? – barnacleboy
Il mio codice lo fa già, ma non riesco a trovare un modo per impostare la dimensione dell'illuminazione senza il ridimensionamento. Il bagliore che ottengo dal mio shader è ok, ma non può crescere senza il ridimensionamento ... – barnacleboy
Ci scusiamo per la risposta tardiva. Non ho visto che hai aggiornato la tua risposta. – barnacleboy