जब कोई वस्तु किसी सतह के पास होती है तो मैं एक शेडर कैसे लिखता हूं?


15

में इस Overwatch गेमप्ले वीडियो , चरित्र की ढाल क्षेत्रों है कि अन्य वस्तुओं 'ज्यामिति के पास हैं में सफेद रोशनी।

रेइनहार्ट की ढाल कुछ स्तर की ज्यामिति को काटती है

फर्श, दीवारों और स्तंभ के पास नीले रंग की ढाल पर सफेद किनारों पर ध्यान दें।

मेरा मानना ​​है कि ढाल का अपना एक मॉडल होता है और प्रभाव एक शेडर के साथ होता है, लेकिन मैं यह जानने की कोशिश कर रहा हूं कि "प्रोग्रामिंग" की अवधारणा का अनुवाद कैसे किया जाए।


2
यदि आप एकता का उपयोग कर रहे हैं, तो यह चर्चा रुचि की हो सकती है । "चौराहे पर प्रकाश डाला" स्लाइड 26 को शुरू करने पर अनुभाग की जांच करें
DMGregory

तो इसका उत्तर पहले से ही नीचे दिया जा चुका है, लेकिन यहां एक वीडियो अब यह समझा रहा है: youtube.com/watch?v=C6lGEgcHbWc
कोबाल्ट 20

जवाबों:


28

एक सामान्य रूपरेखा:

  1. ढाल के बिना अपने दृश्य का एक गहरा नक्शा बनाएं । आप इसे प्रभावी रूप से मुफ्त में प्राप्त कर सकते हैं, क्योंकि पारदर्शी वस्तुओं को अक्सर बाद में पास में प्रदान किया जाता है। अन्यथा, आप एक गहराई shader के साथ RTT पर दृश्य sans ढाल प्रदान करके गहराई का नक्शा बना सकते हैं ।

  2. अपने दृश्य को सामान्य रूप से रेंडर करें, अपने शील्ड शेडर को गहराई से नक्शा पास करें।

  3. छाया में, ढाल के टुकड़े की गहराई से दृश्य की गहराई में अंतर की गणना करें, और उस अंतर का उपयोग करके टुकड़े के रंग को संशोधित करें।

डेमो

मैंने इसका एक सरल वेबजीएल डेमो लिखा।

डेमो का स्क्रीनशॉट

पंक्ति दर पंक्ति

आइए विस्तार से टुकड़े टुकड़े करने वाले कोड पर जाएं:

float solidsDepth = texture2D(depthMap, gl_FragCoord.xy / dims).r;

हर टुकड़े पर गहराई के नक्शे का नमूना लें। याद रखें कि स्क्रीन स्पेस [0, चौड़ाई / ऊंचाई] से अपने टुकड़े को सामान्यीकृत [0.0, 1.0] निर्देशांक में बदलने के लिए अपने व्यूपोर्ट आयामों द्वारा विभाजित करें। इस बिंदु पर, यदि आप टुकड़े के रंग को सैंपल डेप्थ मैप पिक्सेल में सेट करते हैं, तो यह इस तरह दिखेगा:

गहराई के नक्शे का स्क्रीनशॉट

गहराई का नक्शा ग्रेस्केल है, इसलिए आप किसी भी चैनल से मूल्य प्राप्त कर सकते हैं (मैंने rयहां इस्तेमाल किया )।

float solidsDiff = 1.0 - smoothstep(
    zNear,
    zFar,
    gl_FragCoord.z / gl_FragCoord.w
  ) - solidsDepth;

फिर आप उस गहराई के नमूने का उपयोग करके दृश्य की गहराई और ढाल के टुकड़े की गहराई के बीच अंतर का पता लगा सकते हैं। अपनी गहराई को सामान्य करना भी याद रखें, इसे [zNear, zFar] (अपने कैमरे के निकट और दूर के विमानों) से [0.0, 1.0] तक ले जाना। smoothstepयह अच्छी तरह से करता है। इस 1.0 -तरह के मान को solidsDiffउल्टा करना है जो कि 1.0 है जब अंतर अधिकतम (zFar - zNear) और 0.0 न्यूनतम (0.0) है।

ध्यान दें कि मैंने मान लिया है solidsDepthकि पहले से ही गहराई वाले शेड में सामान्यीकृत किया गया था जो गहराई का नक्शा बनाता था।

float alpha = 0.3 + max(0.0, 1.0 - log(100.0 * (solidsDiff - 0.005) + 1.0));

फिर आप गहराई के अंतर के आधार पर अपने ढाल के अल्फा चैनल को संशोधित कर सकते हैं। यहाँ हम एक न्यूनतम अल्फा पर शुरू करते हैं 0.3, फिर एक अच्छी तेज वृद्धि बनाते हैं0.0 अंतर के रूप में अल्फ़ा में करते हैं।

- 0.005ऑफसेट सिर्फ एक सफेद मार्जिन "चौराहे" मोटा बनाने के लिए कहते हैं। इसे संशोधित करने का प्रयास करें!

gl_FragColor = vec4(vec3(1.0), alpha);

और अंत में, उस अल्फा को अपने खंड रंग पर लागू करें।


संवर्द्धन

आप एक घुमावदार ढाल बना सकते हैं, "एनर्जी शील्ड" लुक (डेमो) के लिए प्लाज्मा जोड़ सकते हैं या बस (डेमो) दिखाने वाले चौराहों के साथ प्रभावों का पता लगा सकते हैं

आकाश आपका ग्राफिक्स कार्ड सीमा है!


ओह। मेरे। खुशखबरी। भयानक ट्यूटोरियल के लिए Ty।
ब्लू बग

5

यह सिर्फ गहराई के नक्शे का उपयोग कर रहा है। यह दुनिया को फिर से ढाल देता है और ढाल को प्रदान किए गए z मान और पिक्सेल को अधिक सफ़ेद करने के लिए गहराई बफर z मान के बीच अंतर करता है।


3

मुझे नहीं पता कि कौन सा इंजन, यदि कोई है, तो आप उपयोग कर रहे हैं। या आप किस भाषा के साथ काम कर रहे हैं। फिर भी, आप जो कुछ भी ऑनलाइन पा सकते हैं, उसमें से अधिकांश को एक पर्यावरण से दूसरे में पोर्ट करना मुश्किल नहीं है, जिसे आप ढूंढ रहे हैं।

और निश्चित रूप से सामग्री ऑनलाइन है जो आपकी मदद कर सकती है। एकता से संबंधित इस चर्चा को देखें: http://www.superspacetrooper.com/2012/06/tutorial-force-field-weapon-impact-energy-dispersion/ और यह प्रश्न UE4- संबंधित: https: //answers.unrealengine। com / प्रश्न / 74,858 / डायनामिक-forcefield-shader.html । एक पूर्ण शेडर उदाहरण के लिए, Reddit में एक हालिया बहस से उस ढाल प्रभाव को लागू करते हुए, आप देख सकते हैं: https://www.reddit.com/r/Unity3D/comments/3edi0n/does_any_one_kn_kn_how_to_make_this_shield_effect/ और एक ट्यूटोरियल के लिए जो नहीं है ठीक उसी तरह से, लेकिन यह पर्याप्त रुचि से संबंधित है: http://www.nightbox-studios.com/2015/09/05/assets-shield-effect-scripts-for-texture3d-perlin-noise-shader/

इसके अलावा, यहां पहले से ही इस साइट में किए गए 3 संबंधित प्रश्नों के लिंक दिए गए हैं, जो उन अवधारणाओं को समझने में काफी मदद करते हैं जो आप प्राप्त करना चाहते हैं:

स्पेसशिप शील्ड फ्लेयर

खेल में एक स्टारवार ऊर्जा ढाल को कैसे लागू किया जाए

एक आदिम क्षेत्र की समस्या के साथ XNA ढाल प्रभाव

अंत में, उनके संबंधित वर्चुअल स्टोर में एकता और अवास्तविक इंजन दोनों में ढाल के कुछ अच्छे कार्यान्वयन हैं, यदि आप उन इंजनों में से किसी का उपयोग कर रहे हैं। वे आम तौर पर बेशक संपत्ति का भुगतान किया जाता है, लेकिन खरीदने के बाद लगभग हमेशा खुला स्रोत होते हैं - और अक्सर सस्ते होते हैं। यहां तक ​​कि अगर आप इन इंजनों का उपयोग करने के लिए नहीं होते हैं, तो उन परिसंपत्तियों को खेलने और सीखने में मदद मिल सकती है।

आशा करता हूँ की ये काम करेगा।


यद्यपि वे लिंक सहायक हैं, यह उत्तर मूल रूप से केवल लिंक हैं और वास्तव में सीधे प्रश्न को संबोधित नहीं करते हैं। लिंक की प्रासंगिक सामग्री को वास्तविक विवरण में निकालना बेहतर होगा।
एको

हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन उत्तर के आवश्यक हिस्सों को यहां शामिल करना और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक-केवल उत्तर अमान्य हो सकते हैं यदि लिंक किए गए पृष्ठ बदल जाते हैं। - समीक्षा से
Vaillancourt

@ एंको श्योर, माय बैड। मैं आमतौर पर एक स्पष्टीकरण और लिंक का एक संग्रह शामिल करता हूं, लेकिन इस बार जब आप सही हैं, तो वास्तविक स्पष्टीकरण गायब था। मैं शायद उत्तर को हटा दूंगा, फिर।
MAnd

@AlexandreVaillancourt मुझे ओपी को मूल स्रोत पर पुनर्निर्देशित करने के बजाय किसी अन्य लिंक से कॉपी-पेस्ट का विचार पसंद नहीं है। फिर, मुझे जो सबसे अच्छा लगता है वह यह है कि प्रश्न के लिए टिप्पणियों में लिंक दें। इस तरह की समस्या तब होती है जब आप बहुत सारी सामग्री जानते हैं जो मदद की हो सकती है लेकिन यह टिप्पणियों के लिए बहुत बड़ी है। लेकिन फिर भी, चूंकि एक अच्छा स्पष्टीकरण उत्तर यहां पहले से ही पोस्ट किया गया था, इसलिए मैं इसे मिटा दूंगा
दूंगा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.