2012-09-25 8 views
8

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:

Output of the above shader

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ę.

Odpowiedz

10

Twoja strategia skalowania nie może być zastosowana w tej sytuacji. Odrzuć krok skalowania, użyj tylko kroków do rozmycia i kroku komponowania. To będzie działać.

Pozwól mi pokazać, w jaki sposób moduł cieniujący wywołuje efekt poświaty.

A: Istnieje oryginalny obraz.

Original Image

B: Zmiana koloru obrazu i zastosować shader rozmazaniu.

Blurred Image

C: Połączyć zamazany obraz z oryginalnego obrazu.

Result Image

Jeśli chcesz kontrolować wielkość blask, użyj rozmiaru jądra kroków rozmycia na tym, że zamiast skalowania. Użyłem rozmycia gaussowskie do tworzenia poniższych obrazów.

  • jądra Rozmiar 5

Gaussian Size 5

  • jądra Powierzchnia 10

Gaussian Size 10

  • jądra Rozmiar 15

enter image description here

+0

Jak można shader rozmycie jak jeden ja pisał powyżej dostarczają podobnych wyników do opcji blask mieszania programu Photoshop? – barnacleboy

+0

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

+0

Przepraszamy za spóźnioną odpowiedź. Nie widziałem, że zaktualizowałeś swoją odpowiedź. – barnacleboy

Powiązane problemy