2012-09-25 20 views
8

HLSL gölgelendiricilerden, drop shadow, pivot vb. Gibi Photoshop filtreleri eklemek için kullanılan bir görüntü işleme projesi üzerinde çalışıyorum. Şimdi HLSL'de bir dış parıltı efekti uygulamak için bir yaklaşım arıyorum.Dış Glow HLSL shader olarak

1) parıltı (parametre oluşturmak için geçerli doku ölçeklendirme: anahat boyutunu)

2) Bulanıklık yatay

setleri glowSize, Şu anda aşağıdaki fikri ile deniyorum

3) bulanıklık dikey, renk, parlaklık ve ışıltı oluşturma için aşağıdaki çoklu geçiş HLSL shader kullanıyorum üst

orijinal doku eklemek için bulanıklık değişimi rengi:

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; 
} 

Bu kodun sonucu elips gibi basit şekiller kullanırken Tamam görünüyor, ama metin üzerinde gölgelendiriciyi uygularken çalışmaz:

Output of the above shader

Bu bir sorun ile orada aşikardır ölçekleme. Orijinal dokuyu anahat olarak kullanmak için nasıl ölçeklendirileceğine dair hiçbir fikrim yok. Bu mümkün mü? HLSL'de dış parıltı veya anahat filtresi nasıl uygulanacağı konusunda başka fikirler var mı?

Önceden teşekkür ederiz.

cevap

10

Ölçekleme stratejiniz bu durumda uygulanamaz. Ölçekleme adımını atın, yalnızca bulanıklaştırma adımlarını ve oluşturma adımını kullanın. Çalışacak.

Bulanıklık gölgelendiricisinin bir parlama efekti oluşturduğunu size göstereyim.

A: Orijinal bir resim var.

Original Image

B: görüntünün rengini değiştirin ve bulanıklık shader geçerlidir.

Blurred Image

C: Orijinal görüntü ile bulanık görüntüyü birleştirin.

Result Image

Eğer bir parıltı boyutunu kontrol yerine ölçekleme, bunun için bulanıklık adımların bir çekirdek boyutu kullanmak istiyorsanız. Aşağıdaki görüntüleri oluşturmak için gauss bulanıklıkları kullandım.

  • çekirdek boyutu 5

Gaussian Size 5

  • çekirdek boyutu 10

Gaussian Size 10

  • Çekirdek Boyut 15

enter image description here

+0

nasıl yukarıda gönderdiniz gibi bir bulanıklık gölgelendirici Photoshop Glow harmanlama seçeneğine benzer sonuçlar sağlayabilir? – barnacleboy

+0

Kodum zaten bunu yapıyor, ancak parlama boyutunu ölçeklendirme olmadan ayarlamak için bir yol bulamıyorum. Gölgemden aldığım parıltı tamam, ama ölçekleme olmadan büyüyemez ... – barnacleboy

+0

Geç cevap için özür dilerim. Cevabınızı güncellediğinizi görmediniz. – barnacleboy