2012-09-25 15 views
8

मैं अभी भी एक छवि प्रसंस्करण प्रोजेक्ट पर काम कर रहा हूं जो एचएलएसएल शेडर्स का उपयोग फ़ोटोशॉप-एस्क्यू फ़िल्टर को ड्रॉप छाया, बेवल आदि जैसे जोड़ने के लिए करता है। अब मैं एचएलएसएल में बाहरी चमक प्रभाव को लागू करने के लिए एक दृष्टिकोण की तलाश कर रहा हूं।एचएलएसएल शेडर के रूप में बाहरी चमक

मैं वर्तमान में निम्नलिखित विचार के साथ प्रयोग कर रहा हूँ:

1) वर्तमान बनावट चमक (पैरामीटर बनाने के लिए स्केल: glowSize, जो

2) धुंधला क्षैतिज

रूपरेखा का आकार) सेट

3) धुंधला खड़ी, कलंक रंग चमक और चमक प्रदान करने के लिए शीर्ष

पर मूल बनावट जोड़ने मैं निम्नलिखित बहु पास HLSL शेडर उपयोग कर रहा हूँ के परिवर्तन का रंग:

जब एक अंडाकार की तरह साधारण आकार का उपयोग करते
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; 
} 

इस कोड के परिणाम ठीक लग रहा है, लेकिन जब पाठ पर शेडर लागू करने के काम नहीं करता:

Output of the above shader

यह स्पष्ट है कि वहाँ के साथ एक समस्या यह है कि है स्केलिंग। मेरे पास कोई रूपरेखा नहीं है कि मूल बनावट को रूपरेखा के रूप में उपयोग करने के लिए कैसे स्केल करें। क्या यह भी संभव है? एचएलएसएल में बाहरी चमक या रूपरेखा फ़िल्टर को कार्यान्वित करने के लिए कोई अन्य विचार?

अग्रिम धन्यवाद।

उत्तर

10

आपकी स्केलिंग रणनीति इस स्थिति में लागू नहीं की जा सकती है। स्केलिंग चरण को फेंक दें, केवल धुंधले चरणों और रचनात्मक चरण का उपयोग करें। यह काम करेगा।

मुझे आपको दिखाएं कि ब्लर शेडर कैसे चमक प्रभाव बनाता है।

ए: एक मूल छवि है।

Original Image

बी: छवि का रंग बदलना, और कलंक शेडर लागू होते हैं।

Blurred Image

सी: मूल छवि के साथ धुंधला छवि को संयुक्त करें।

Result Image

आप, एक चमक आकार को नियंत्रित स्केलिंग के बजाय उस के लिए कलंक कदम की एक गिरी आकार का उपयोग करें, चाहते हैं। मैंने छवियों को नीचे बनाने के लिए गाऊशियन ब्लर्स का इस्तेमाल किया।

  • कर्नेल आकार 5

Gaussian Size 5

  • कर्नेल आकार 10

Gaussian Size 10

  • कर्नेल आकार 15

enter image description here

+0

कैसे एक तरह एक कलंक शेडर मैं ऊपर पोस्ट किया है फ़ोटोशॉप चमक सम्मिश्रण विकल्प के समान परिणाम देने कर सकते हैं? – barnacleboy

+0

मेरा कोड पहले से ही ऐसा करता है, लेकिन मैं स्केलिंग के बिना चमक आकार सेट करने का कोई तरीका नहीं समझ सकता। जो चमक मैं अपने शेडर से प्राप्त कर रहा हूं वह ठीक है, लेकिन यह स्केलिंग के बिना नहीं बढ़ सकता है ... – barnacleboy

+0

देर से उत्तर के लिए खेद है। आपने नहीं देखा है कि आपने अपना जवाब अपडेट कर लिया है। – barnacleboy

संबंधित मुद्दे