Nadal pracuję nad projektem przetwarzania obrazu, który korzysta z shaderów HLSL, aby dodać filtry typu Photoshop, takie jak cień, faza i inne. Teraz szukam podejścia do wdrożenia zewnętrznego efektu poświaty w HLSL.Blask zewnętrzny jako moduł cieniujący HLSL
Jestem obecnie eksperymentuje z następującym pomysł:
1) skala obecną strukturę aby utworzyć blask (parametr: glowSize, który określa wielkość zarys)
2) Blur poziomą
3) Blur pionowy, zmiana koloru rozmycia świecić kolor i dodać oryginalną fakturę na najwyższym
Używam następujący wielo wprost HLSL cieniującego do renderowania blask:
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;
}
Efektem tego kodu wygląda ok, gdy za pomocą prostych kształtów jak elipsy, ale nie działa przy stosowaniu shader na tekście:
To oczywiste, że nie ma problemu z skalowanie. Nie mam pojęcia, jak skalować oryginalną teksturę, aby użyć jej jako obrysu. Czy to w ogóle jest możliwe? Jakieś inne pomysły na implementację zewnętrznego filtra żarowego lub zarysowego w HLSL?
Z góry dziękuję.
Jak można shader rozmycie jak jeden ja pisał powyżej dostarczają podobnych wyników do opcji blask mieszania programu Photoshop? – barnacleboy
Mój kod już to robi, ale nie mogę znaleźć sposobu na ustawienie rozmiaru blasku bez skalowania. Blask, który dostaję od mojego shadera jest w porządku, ale nie może rosnąć bez skalowania ... – barnacleboy
Przepraszamy za spóźnioną odpowiedź. Nie widziałem, że zaktualizowałeś swoją odpowiedź. – barnacleboy