2014-04-25 10 views
6

मेरे पास एक प्रोजेक्ट है जो मैं सिमुलेशन से फिल्में बना रहा हूं। सिमुलेशन किसी अन्य प्रोग्राम से पारित किया जाता है जो प्रक्षेपण मैट्रिक्स को परिभाषित करता है।कैमरे से दूर गहराई बफर सटीक बढ़ाना

मुद्दा मैं में चल रहा हूँ कि अन्य कार्यक्रम 'झूठे' ओर्थोग्रफिक दृश्य का एक प्रकार है, क्या मैं यह मतलब है कि इसके प्रक्षेपण मैट्रिक्स इस प्रकार है है है:

PerspectiveMatrix = glm::perspective(3.5, 1, 1.0f, 50.0f); 

और यह का उपयोग करता है lookAt समारोह:

ViewMatrix = glm::lookAt(
    (2000,-3000,2000), // eye 
    (0,0,0), // center 
    (0,0,1)//up 
); 

तो क्या मैं 'झूठे' ओर्थोग्रफिक दृश्य मतलब है कि "दृश्य लाइनों" (एक की कमी के लिए है कि वे कैमरा तैनात है बहुत दूर दूर (और छोटे कोण दृश्य ज़ूम करने के लिए) है बेहतर शब्द) वास्तविक ऑर्थोग्राफिक प्रक्षेपण की तरह लगभग समानांतर हैं।

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

    Screenshot

तो मेरे सवाल है किस तरह से मैं क्रम में मेरी गहराई परीक्षण बदल सकते हैं हो सकता है की ओर बफर पूर्वाग्रह दूर विमान? या उनके जैसे की कुछ और। मैंने पासप्लेन को आगे बढ़ने की कोशिश की है, जिसके पास स्क्रीन ज़ूम आउट करने का नतीजा है, इसलिए मैं परिप्रेक्ष्य में एक संकुचित कोण के साथ क्षतिपूर्ति करता हूं। लेकिन यह पर्याप्त समय करने से समस्या खराब हो जाती है, ज़ेड लड़ना नहीं है लेकिन यह सही गहराई पर चीजें नहीं खींचता है। गोलाकार सब कुछ के ऊपर खत्म होता है।

मैं Outerra पर कुछ जानकारी भी मिली: http://outerra.blogspot.com/2012/11/maximizing-depth-buffer-range-and.html वे गहराई बफर को पलटने के लिए कुछ विचार किया था लेकिन यह एनवीडिया विशिष्ट था और मैं दोनों अति और Nvidia

+0

कैमरे को करीब क्यों नहीं ले जाएं और वास्तविक ऑर्थोग्राफिक प्रक्षेपण का उपयोग क्यों न करें? – Wyzard

+0

यह निश्चित रूप से गहराई का मुद्दा होगा, समस्या यह है कि मेरे कार्यक्रम को 'पैरेंट' कार्यक्रम के समान दिखने की ज़रूरत है। वे दोनों एक ही छवियों को दिखा रहे हैं, लेकिन मेरा दृश्य एवीआई बनाम सिर्फ दृश्य का पूर्वावलोकन कर रहा है।अनिवार्य रूप से उपयोगकर्ता यह सुनिश्चित करने के लिए स्क्रीन का पूर्वावलोकन करता है कि उन्हें सही परिणाम मिल गया है और फिर वे मेरे प्रोग्राम को फिल्म – user3565590

+0

में बनाने के लिए कहते हैं। एक तरीका यह है कि आप जिस बनावट को बड़े पैमाने पर चित्रित कर रहे हैं उसे बनाना। जितना बड़ा होगा, उतना ही सटीक आपका परिणाम होगा, लेकिन यह – Caesar

उत्तर

2

दोनों लघुगणक गहराई और उलट गहराई के साथ संगत होना करने की जरूरत है उस blog post में वर्णित मानचित्रण आपके लिए काम करेगा।

रिवर्स फ्लोटिंग पॉइंट बेहतर है, और यह आमतौर पर डायरेक्टएक्स में काम करता है। ओपनजीएल में यह आपको डिज़ाइन दोष के कारण कोई अतिरिक्त सटीकता नहीं लाएगा, जब तक कि ड्राइवर NV_depth_buffer_float एक्सटेंशन का खुलासा न करे, जिसके माध्यम से आप प्रभावी रूप से पूर्वाग्रह को बंद कर सकते हैं जो इसे सामान्य रूप से अनुपयोगी बनाता है।

एएमडी अपने 13.12 उत्प्रेरक ड्राइवरों के बाद उस एक्सटेंशन का समर्थन करता है, इसलिए तकनीक सभी 5000+ श्रृंखला एएमडी जीपीयू (पुरानी श्रृंखला ड्राइवरों द्वारा समर्थित नहीं है) पर प्रयोग योग्य है।

2

उपरोक्त में से किसी भी से सरल: कैमरे से अपने जेनियर को आगे बढ़ाएं। ऐसा लगता है कि यह glm :: परिप्रेक्ष्य() का तीसरा पैरामीटर है, जो आपके उदाहरण में 1.0 पर सेट है। इसे अपने दृश्य के अग्रभूमि में सामानों को दूर करने से पहले जितना बड़ा हो सके उतना सेट करें, और आपकी जेड-बफर सटीक समस्याएं शायद दूर हो जाएंगी।

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

संबंधित मुद्दे