मैं एक चमक प्रभाव कैसे बना सकता हूं?


9

मैं अपने realtime shader के लिए एक शानदार प्रभाव बनाने की कोशिश कर रहा हूँ, लेकिन मुझे नहीं पता कि कैसे।

यहाँ एक उदाहरण है , और दूसरा उदाहरण

यहाँ छवि विवरण दर्ज करें

इसे लागू करने के लिए मैं किस तकनीक का उपयोग कर सकता हूं?


इसे खिलने के समान एक पोस्ट-प्रोसेस प्रभाव के माध्यम से प्राप्त किया जा सकता है, लेकिन डाउन-सैंपल चरण में एक पैटर्न (एक स्टार बनावट) लागू करना। यह सब सिर्फ अटकलें कठिन हैं।
अकलतरा

1
एक सामान्य और स्पेक्युलर मैप नहीं होगा जो आपको बनावट के माध्यम से ऐसा करने देगा?
JohnB

मैंने सामान्य नक्शे का उपयोग करके कुछ परीक्षण किए। लेकिन कठिन बात यह है कि उन्हें देखने के उन्मुखीकरण और प्रकाश अभिविन्यास के अनुसार चमकदार बनाना है।
माट

जवाबों:


10

ठीक है, जब किसी भी shader को डिजाइन करने के लिए कहा जाता है, तो हमें छोटी समस्याओं के लिए चीजों को तोड़कर शुरू करना चाहिए। और जैसा कि ध्यान दें कि चमक प्रभाव वास्तव में शेडर को अच्छा नहीं बनाता है, लेकिन समग्र प्रकाश और प्रभाव, उनमें से केवल एक का उपयोग करना उतना अच्छा नहीं लगेगा।

सबसे पहले हमें यह बताएं कि क्या सीधे तौर पर शेडर का हिस्सा नहीं है:

  1. शेडिंग शेडर का हिस्सा नहीं है, और यह अलग-अलग शेडिंग पास के माध्यम से किया जाता है।
  2. मुझे लगता है कि परिवेशीय रोड़ा है (विशेषकर यह कि प्रश्न में दिखाई गई यह छवि विशेष रूप से वास्तविक समय रेंडरर का उपयोग नहीं कर रही है लेकिन यह एक धारणा है)।

दूसरे, आइए वास्तविक छाया को अलग-अलग प्रभावों में तोड़ें:

  1. प्रकाश की तरह एक अनिसोट्रोपिक है, यह छायाकार के समग्र रूप के लिए बहुत ही महत्वपूर्ण है। इसके पीछे कारण यह है कि वास्तविक सामग्री में कपड़े होते हैं, ये चमकदार कपड़े प्रकाश प्रतिबिंब को दिशात्मक पूर्वाग्रह बनाते हैं, जिससे उस निश्चित दिशा में परावर्तित प्रकाश की सबसे अधिक मात्रा होती है।

यहाँ छवि विवरण दर्ज करें

यहाँ छवि विवरण दर्ज करें ध्यान दें कि ऐसे कपड़ों में असीम रूप से कई मानदंड होते हैं, लेकिन यहां वर्णित तकनीक सबसे महत्वपूर्ण सामान्य अनुमान लगाती है

सबसे महत्वपूर्ण सामान्य अनुमान लगाने के लिए, एक तरीका है, बनावट निर्देशांक का उपयोग करना और मेष की स्पर्शरेखा की गणना करना, और इसके बजाय एन की गणना करना । एल आप 1- (एनटी) की गणना करते हैं।

पूर्ण विवरण यहाँ । और आपको शायद इसे लागू करने की क्रिया तकनीक के बजाय टुकड़े टुकड़े में लागू करने की आवश्यकता है। अन्य अनिसोट्रोपिक मॉडल भी लागू कर सकते हैं।

अब शानदार प्रभाव के लिए:

यह विश्व अंतरिक्ष / स्थानीय बनावट स्थान, या स्क्रीन अंतरिक्ष में एक अलग पास के रूप में किया जा सकता है।

एल्गोरिथ्म मैं सोच सकता हूं, छवि प्रसंस्करण तकनीक का उपयोग करता है (यह मानते हुए कि जाल में बनावट के तार हैं)।

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

यहाँ छवि विवरण दर्ज करें

ध्यान दें उपरोक्त छवि अधिकतम फ़िल्टर का एक उदाहरण है, और इसे शोर पर लगाने से sth एक स्टार फ़ील्ड के समान होगा।

  • एक बार जब आप यह कर लेते हैं, तो आकार की तरह स्टार प्राप्त करने के लिए शोर पर कुछ विचलन के साथ एक गाऊसी फ़िल्टर लागू करें।

यहाँ छवि विवरण दर्ज करें

गॉसियन फ़िल्टर का उदाहरण अधिकतम (एड) शोर पर लागू होता है।

  • अंतिम चरण इसे मूल जाल बनावट और प्रकाश के साथ जोड़ना है। यह मूल मेष बनावट / रंग के साथ एक (|) या आईएनजी बाइनरी ऑपरेशन का उपयोग करके सबसे अच्छा किया जाता है, यह केवल शोर से सफेद ले जाएगा और किसी भी काले पिक्सेल को हटा देगा। प्रकाश के संबंध में (और संभवतः अन्य स्पेक्युलर मैप्स) सबसे अच्छी बात यह है कि आप इसे जोड़ सकते हैं या इसे अपने पहले संयुक्त पिक्सल के साथ मॉड्यूलेट कर सकते हैं। बेहतर चमक के लिए आपको एक चमक के बाद के प्रसंस्करण प्रभाव की भी आवश्यकता हो सकती है।

ध्यान दें, इस तकनीक को एक वास्तविक समय shader के लिए महत्वपूर्ण अनुकूलन की आवश्यकता हो सकती है।


3

एक दिलचस्प लेख एएमडी है - प्रक्रियात्मक हो रही है

ऐसा लगता है कि स्पार्कल्स मेरे विचार से कठिन हैं।
डिसेंट सॉल्यूशन: 3D शोर फ़ंक्शन को इंडेक्स करने के लिए 3D पोज़िशन का उपयोग करें, व्यू वेक्टर जोड़ें, चीज़ों को और बेतरतीब करने के लिए फ़्रेक फ़ंक्शन का उपयोग करें।

Sparkle:
float specBase = saturate(dot(reflect(-normalize(viewVec), normal),
lightDir));
// Perturb a grid pattern with some noise and with the view-vector
// to let the glittering change with view.
float3 fp = frac(0.7 * pos + 9 * Noise3D( pos * 0.04).r + 0.1 * viewVec);
fp *= (1 - fp);
float glitter = saturate(1 - 7 * (fp.x + fp.y + fp.z));
float sparkle = glitter * pow(specBase, 1.5);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.