AAA खेलों में सीमा से बाहर


21

कई सामान्य एएए शीर्षकों में (स्रोत इंजन गेम विशेष रूप से), जब खिलाड़ी किसी क्षेत्र में 'अन-कैटरेल्ड' के लिए पहुंचता है, जैसे कि सीमा से बाहर, या नक्शे के नीचे noclipping; स्क्रीन पर एक अजीब प्रभाव होता है (बफर फाड़?)।

यह खिड़कियों के निशान के समान होने के रूप में वर्णित किया जा सकता है कि विंडोज एक्सपी एक सिस्टम हैंग के साथ-साथ एक विंडो को घसीटा जा सकता है।

मैं केवल यह बता सकता हूं कि स्क्रीन को रीफ्रेश करते समय डेवलपर्स रंगीन बफर को साफ नहीं करते हैं?

क्या वो सही है? यदि हां, तो क्यों?


8
BTW, इसे अक्सर "हॉल ऑफ मिरर्स" प्रभाव या एचओएम कहा जाता है।
नाथन रीड

जवाबों:


35

एक बार, रंग और गहराई बफ़र्स को साफ़ करने में वास्तव में समय लगा। एक स्पष्ट करने का मतलब है कि ग्राफिक्स कार्ड को फ्रेमबफ़र के प्रत्येक पिक्सेल को चलना होगा और इसके लिए एक मूल्य लिखना होगा।

इस वजह से, गेम डेवलपर्स ने पाया कि यह केवल यह मानने के लिए अधिक कुशल होगा कि हर पिक्सेल को फिर से प्रस्तुत किया जाएगा। उन्होंने ऐसा करने के लिए कई तकनीकों का विकास किया।

रंग बफर को अनदेखा करना सबसे आसान है। कम आसान गहराई बफर है, क्योंकि यह पुराने डेटा के साथ प्रदूषित होगा। इसलिए उन्होंने जो किया वह सरल था।

फ्रेम 0 पर, वे glDepthRange(0, 0.5) के (या डी 3 डी समतुल्य) के साथ प्रस्तुत करेंगे , और वे एक (या ) glDepthFuncका उपयोग करेंगे । इसका मतलब है कि अब तक की गहराई बफ़र में आपको सबसे दूर की गहराई का मान 0.5 है। तो फ्रेम 0 के अंत में गहराई बफर में सबसे बड़ा मूल्य 0.5 है (यह मानते हुए कि आपने प्रत्येक पिक्सेल को लिखा है)।GL_LESSGL_LEQUAL

फ्रेम 1 पर, वे गहराई रेंज को (1, 0.5) में बदल देंगे। ध्यान दें कि इस मामले में, निकट गहराई मूल्य दूर की गहराई से बड़ा है। लेकिन वे गहराई के फंक को भी GL_GREATER(या GL_GEQUAL) में बदल देंगे , जो गहराई परीक्षण के अर्थ को उलट देता है। क्योंकि गहराई बफ़र में सबसे बड़ा मान 0.5 है, आप जो कुछ भी लिखते हैं उसका मूल्य इस से बड़ा होगा। चूंकि गहराई परीक्षण को उलट दिया गया था, इसका प्रभावी रूप से मतलब है कि फ्रेम 0 पर जो कुछ भी लिखा गया था वह अब उस चीज़ से बहुत दूर है जो संभवतः फ्रेम 1 पर लिखा जा सकता है। फ्रेम 1 के अंत में, गहराई बफर में सबसे छोटा मान अब 0.5 है।

और फिर वे दोहराते हैं।

2003 के बाद से बने किसी भी हार्डवेयर पर, यह अब अनुकूलन नहीं है। वास्तव में, यह एक नकारात्मक अनुकूलन है । गहराई बफ़र को साफ़ करना वास्तव में हार्डवेयर को तेज़ बनाता है । सच में नहीं।

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

तो हर पहली बार पढ़ने / संशोधित / लिखना जो आप स्पष्ट रूप से लिखने के बाद प्रत्येक कैश लाइन पर करते हैं। यह मुफ़्त है

इसके अलावा, एक दांतेदार गहराई वाले बफ़र हार्डवेयर में हाइपर-ज़ेड / हियरार्कियल-ज़ेड / ज़ेड-कुलिंग ऑप्टिमाइज़ेशन के खिलाफ काम कर सकते हैं। हां, आपका दृश्य उन लोगों के खिलाफ काम करेगा जो अंततः आप विवरण जोड़ते हैं। लेकिन अगर आपकी गहराई बफर पिछले रेंडरिंग से दांतेदार है, भले ही उन पृष्ठभूमि की वस्तुएं पृष्ठभूमि में हों, यह जेड-कुलिंग तकनीकों की दक्षता को प्रभावित कर सकता है। और यह प्रदर्शन में मदद करने वाला नहीं है।

इसलिए आपको आधुनिक खेलों में इस गहराई से उलट तकनीक कभी नहीं करनी चाहिए ।

नोट: जरी टाइल-आधारित प्रतिपादन आर्किटेक्चर (जैसा कि अधिकांश मोबाइल प्लेटफार्मों में पाया जाता है) पर एक अच्छा बिंदु बनाता है। गहराई साफ न करने से वहां चीजें भी अप्रिय हो सकती हैं।


क्या आपका अंतिम विवरण गहराई बफर को वैकल्पिक रूप से कभी नहीं करना है या? बहुत बढ़िया जवाब।
deceleratedcaviar

1
@ डैनियल हां। मैंने अपनी पोस्ट स्पष्ट की।
निकोल बोलस

3
इसके अलावा बाइनिंग आर्किटेक्चर पर स्पष्ट (ज्यादातर ओपनजीएल ईएस चिप्स की तरह) स्किप करने से बड़े पैमाने पर प्रदर्शन हानि होती है, क्योंकि ग्राफिक्स चिप रंगीन बफर स्थिति पर धारणा नहीं बना सकता है।
जरी कोमप्पा

5

हां, आप सही हैं कि बैक बफर क्लियर नहीं किया जा रहा है।

ऐसा क्यों है (ज्यादातर) कि यह एक कस्टम shader का उपयोग करने के लिए तेज़ है जो प्रत्येक फ्रेम के विपरीत दिशाओं में गहराई मानों को ping-pongs करता है और इस तथ्य पर भरोसा करता है कि आपका गेम हमेशा स्क्रीन पर प्रत्येक पिक्सेल को प्रस्तुत करता है।

तो शून्य लागत के लिए आप प्रति फ्रेम एक बफर को बचाते हैं।


1
मुझे गहराई से पिंग-पोंगिंग के बारे में नहीं पता; प्रत्येक इंजन मैं गहराई से परिचित हूं / स्टेंसिल बफर प्रत्येक फ्रेम को साफ करता है। लेकिन उससे अलग, हां, अगर खेल सभी पिक्सल को रेंडर करता है (जैसा कि यह होना चाहिए), तो आपको रंग बफर को खाली करने की आवश्यकता नहीं है।
नाथन रीड

आप shader के लिए एक उदाहरण दे सकते हैं, अच्छा जवाब अन्यथा।
डेक्लेरेटेडकविअर

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