एक सामान्य रूपरेखा:
ढाल के बिना अपने दृश्य का एक गहरा नक्शा बनाएं । आप इसे प्रभावी रूप से मुफ्त में प्राप्त कर सकते हैं, क्योंकि पारदर्शी वस्तुओं को अक्सर बाद में पास में प्रदान किया जाता है। अन्यथा, आप एक गहराई shader के साथ RTT पर दृश्य sans ढाल प्रदान करके गहराई का नक्शा बना सकते हैं ।
अपने दृश्य को सामान्य रूप से रेंडर करें, अपने शील्ड शेडर को गहराई से नक्शा पास करें।
छाया में, ढाल के टुकड़े की गहराई से दृश्य की गहराई में अंतर की गणना करें, और उस अंतर का उपयोग करके टुकड़े के रंग को संशोधित करें।
डेमो
मैंने इसका एक सरल वेबजीएल डेमो लिखा।
पंक्ति दर पंक्ति
आइए विस्तार से टुकड़े टुकड़े करने वाले कोड पर जाएं:
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);
और अंत में, उस अल्फा को अपने खंड रंग पर लागू करें।
संवर्द्धन
आप एक घुमावदार ढाल बना सकते हैं, "एनर्जी शील्ड" लुक (डेमो) के लिए प्लाज्मा जोड़ सकते हैं या बस (डेमो) दिखाने वाले चौराहों के साथ प्रभावों का पता लगा सकते हैं ।
आकाश आपका ग्राफिक्स कार्ड सीमा है!