जब से आपने अनुभव मांगे हैं, यहाँ मेरे हैं।
उन दिनों में जब मैं PS2 गेम की प्रोग्रामिंग कर रहा था, "लेयर्ड अल्फा क्वाड्स" दृष्टिकोण एक ऐसा तरीका था जिसे हम अक्सर कोहरे को लागू करते थे। कभी-कभी ग्राउंड कोहरे के रूप में, लेकिन पूर्ण स्क्रीन कोहरे के रूप में अधिक सामान्यतः। और यह दोनों ही मामलों में ठीक काम किया। तो हाँ, यह पूर्व-टुकड़े-छायादार दिनों में व्यवहार्य था।
अच्छी तरह की। जैसा कि आपने नोट किया है, समस्या यह थी कि यदि आप स्क्रीनशॉट में देखा गया स्मूथ फॉग चाहते हैं, तो आपको अल्फा क्वाड्स की नहीं बल्कि बेतुकी संख्या चाहिए।
PS2 पर, हम आमतौर पर तीन और पांच परतों के बीच कहीं बर्दाश्त कर सकते थे। जो निश्चित रूप से आपके सामने तैरती कोहरे की "दीवारों" की तरह दिखती थी। इससे अधिक और भरण दर ने हमारे फ्रेम दर को मारना शुरू कर दिया।
आम तौर पर, इन क्वाड्स को कैमरे के सामने निश्चित दूरी पर खींचा जाता है, इसलिए आपको कभी भी ऐसी स्थिति नहीं मिली जिसका आप उल्लेख करते हैं, "उनमें से एक" के माध्यम से चलना। दूसरी ओर, उन निश्चित दूरी का उपयोग करके, दुनिया में बाकी सब कुछ करता हैजैसे ही खिलाड़ी घूमता है, उन विमानों से गुजरता है, जो कि एक बहुत स्पष्ट चित्रमय गड़बड़ है। लगभग सभी ने इसे वापस किया, लेकिन अब यह स्वीकार्य नहीं होगा (जब तक कि आप इसे शैलीगत कारणों से नहीं कर रहे हैं)। (अपवाद: कुछ लोगों ने पीएस 2 के वर्टेक्स शेडर के बराबर के हिस्से के रूप में कोहरे के मूल्यों की गणना की। यह काम किया और बहुत तेज़ था, लेकिन आपके मॉडल को अत्यधिक तनावग्रस्त होने की आवश्यकता थी। आपके पास लंबी दीवारें नहीं हो सकती हैं, उदाहरण के लिए, क्योंकि कोहरा केवल था। दीवार के कोनों पर गणना की जा रही है, और फिर दीवार के पूरे चेहरे पर चारों ओर smeared किया जा रहा है। दीवार पूरी तरह से धूमिल दिखाई दी अगर आप इसके मध्य के ठीक बगल में खड़े थे, उदाहरण के लिए, क्योंकि यह केवल कोहरे के स्तर का परीक्षण कर रहा था अंतिम बिंदु)
ध्यान दें कि यदि आप दुनिया में कोहरे की स्थिति को सांख्यिकीय रूप से रखते हैं (जैसा कि आप एक संभावना के रूप में उल्लेख करते हैं), तो आप बेहद सहज कोहरे की उपस्थिति प्राप्त करने में सक्षम नहीं होंगे, जैसा कि आपके द्वारा प्रदान की गई छवि में - बीच में ओवरलैप होंगे दर्शक के अभिविन्यास के आधार पर आसन्न क्वाड्स। वे ओवरलैप्स धारियों या ट्रेपेज़ोइड्स के रूप में दिखाई दे सकते हैं (यदि क्वाड्स अनटेक्स्टर्ड हैं) या क्लंप्स के रूप में (यदि वे टेक्सचर्ड हैं)।
लेकिन मान लेते हैं कि हम इस ग्राउंड फॉग को करने के लिए चौड़े, स्क्रीन-फेसिंग क्वैड्स का उपयोग कर रहे हैं और कुछ गणना करते हैं कि कैसे इस विधि का उपयोग करके फ़्लैट ग्राउंड पर सीधे फ़ॉगिंग का उपयोग किया जा सकता है, जिसमें कैमरा सीधा आगे दिखता है - यही हमारी आदर्श स्थिति है । मान लें कि एचडी रिज़ॉल्यूशन: 1920x1080, जो हमारे क्षितिज को स्कैनलाइन 540 पर रखता है। आइए यह भी मान लें कि हमारे पास क्षितिज के लिए सभी तरह की दृश्यता है (यानी, यह मानते हुए कि आपके पास क्षितिज तक पहुँचने से पहले पूर्ण अस्पष्टता नहीं है)। एक कोहरे की शुरुआत के साथ और प्रत्येक स्कैनलाइन पर एक रुकने के क्रम में (चिकनी कोहरे को पाने के लिए), हमें (540 * 2 ==) 1080 कोहरे की जरूरत है। इन 1080 कोहरे में से प्रत्येक स्क्रीन के पूरे क्षैतिज विस्तार को कवर करेगा,
चलो कम अनुमान लगाते हैं, और कहते हैं कि औसतन, एक कोहरे का विमान लगभग 300 पंक्तियों की पिक्सेल को कवर करेगा। निकटतम वाले कम कवर करेंगे, सबसे पीछे वाले कवर कम होंगे, बीच की पंक्तियां बहुत अधिक कवर होंगी।
उस अनुमान के साथ, हमें औसत कोहरे वाले क्वाड द्वारा (1920x300 ==) 576,000 पिक्सेल छुआ जा रहा है। कुल मिलाकर, यह (576,000 * 1080 ==) 622,080,000 पिक्सल कुल "पारदर्शी कोहरे के माध्यम से पारभासी ज्यामिति के बहुत सारे प्रभाव" के माध्यम से छुआ जा रहा है। और यह संख्या उच्च रिज़ॉल्यूशन पर चलने वाले लोगों के लिए बढ़ जाएगी। और क्या अधिक है, हम z- बफर के खिलाफ एक ही संख्या में परीक्षण प्राप्त करते हैं, और लगभग इतने ही पिक्सेल मिश्रण संचालन करते हैं, क्योंकि ये सभी पारदर्शी परतें एक-दूसरे पर बार-बार खींच रही हैं। यह बहुत सारे पिक्सेल है।
और यह सबसे अच्छा मामला है - यदि उपयोगकर्ता नीचे देखता है या क्राउच करता है तो आपको फॉग क्वाड की अधिक स्क्रीन कवरेज मिलेगी।
ध्यान दें कि जब से हम 1080 क्वैड को ओवरलैप कर रहे हैं, हम संभवतः प्रत्येक पर सेट के बारे में (1.0 / 1080 ~ =) 0.0009 का एक अल्फा मान चाहते हैं, ताकि यदि आप सभी 1080 क्वैड के माध्यम से देखें तो हमारा कोहरा पूरी तरह से पहुंच जाए। (हम इससे भी ऊपर जा सकते हैं, लेकिन यह मान है कि हम रेंज को जितना संभव हो उतना फैलाना चाहते हैं)। ध्यान दें कि इस मान को 32-बिट रंग मान के अल्फा घटक (256 * 0.0009 ~ = 0.237) के रूप में दर्शाया नहीं जा सकता है और इसलिए यदि आप कोशिश करते हैं तो इसे 0 से नीचे कर दिया जाएगा। आपको OpenGL को 0.0009 मान प्रदान करने की आवश्यकता होगी, क्योंकि यह सभी के लिए एक अस्थायी बिंदु मान है। (यह भी ध्यान दें कि आप वास्तव में प्रत्येक पर यह समान मूल्य निर्धारित नहीं करना चाहते हैं - जबकि हमने परिभाषित किया था कि हम शुरू करने के लिए एक क्वाड शुरू करना चाहते थे और क्षितिज के नीचे प्रत्येक स्कैनलाइन पर समाप्त करने के लिए हमें चिकनी कोहरे देना चाहते थे,)
यह भी ध्यान दें कि कोहरे के मिश्रण इस दृष्टिकोण का उपयोग करते हुए काफी सही ढंग से काम नहीं करेंगे, क्योंकि वे एक आधुनिक शेडर के साथ - "बेस ऑब्जेक्ट रंग और इस प्रतिशत का उपयोग करते हुए कोहरे के रंग के बीच मिश्रण" की एक गणना प्राप्त करने के बजाय, आपको 1080 मिलेंगे "कोहरे के प्रतिशत से अब तक के रंग और कोहरे के रंग के बीच मिश्रण" की गणना। जिसका अर्थ है कि कोहरे एक लघुगणक गिरावट के बाद वस्तुओं को प्रभावित करने जा रहा है। (अर्थात, 20 कोहरे वाले कोड़ों से प्रभावित एक वस्तु दो बार से भी कम दिखाई देगी क्योंकि 10 कोहरे क्वाड्स से प्रभावित होता है, क्योंकि पहले कोहरे के छालों का असर ऑपरेशन में अधिक होता है)।
जो सभी को कहना है: कृपया केवल एक टुकड़ा shader का उपयोग करें।
सच में नहीं। यह सरल और सस्ता है और तेजी से लागू करने और त्रुटि-कम करने के लिए तेज और आपको वास्तव में अपना गेम बनाने के लिए वापस मिलता है और हर संभव तरीके से बेहतर है। हम पूरी तरह से इसे पीएस 2 युग में वापस कर देते थे यदि यह समय पर भी संभव होता।