2012-01-09 11 views
6

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

संपादित करें 1 शुरू होता है

मूल पोस्ट के व्यवहार केवल Windows XP और Windows 7 पर लागू होता है, फायरफॉक्स और क्रोम ब्राउज़र। उबंटू पर, ऐसा कोई विकृति नहीं है, लेकिन कैमरे को घूर्णन करते समय बनावट "हिलाएं" बनाते हैं। जब रोटेशन रुक जाता है, तो हिलना बंद हो जाता है, लेकिन बनावट पूरी तरह से सही स्थिति में नहीं हो सकती है।

संपादित करें 1 समाप्त होता है

संपादित 3 शुरू होता है

कार्यक्रम 4 विभिन्न कंप्यूटरों पर परीक्षण किया गया है, और के रूप में उनमें से किसी पर इरादा काम नहीं किया।

संपादित 3 समाप्त होता है

मैं WebGL में एक बड़ी वॉक्सेल जो मैं टाइलों बनावट प्रत्येक टाइल शीर्ष अंतरिक्ष में 1 की ओर लंबाई के साथ कवर करने के लिए चाहते हैं। इस परीक्षण परिदृश्य में कैमरा नकारात्मक जेड दिशा को इंगित कर रहा है और वोक्सेल के किनारे एक्स-वाई, एक्स-जेड, वाई-जेड विमानों में हैं।

छोटे voxels (यानी कम दोहराना) काफी अच्छी तरह से काम करते हैं, लेकिन लगभग 2000 x और y प्रति फेस दोहराता है (यानी वोक्सेल आकार 2000 * 2000 * 2000) बनावट वास्तव में बदसूरत लगती है। जब कैमरे को लंबवत रूप से चेहरे पर इंगित किया जाता है तो बनावट दोहराए जाने वाले आकार/मात्रा के बावजूद सही दिखती है, लेकिन कुछ डिग्री के किसी भी घूर्णन के ऊपर वर्णित आकार के voxels के लिए एक दृश्य समस्या का कारण बनता है। वोक्सेल आकार में वृद्धि विरूपण बढ़ जाती है। उलटा भी सच है: छोटे voxels के साथ बनावट कैमरा रोटेशन के बावजूद सही दिखते हैं। ऐसा लगता है कि आकार के लिए कोई कठोर सीमा मूल्य नहीं है, लेकिन प्रभाव लगभग शून्य से धीरे-धीरे बढ़ने लगता है जब वोक्सल लगभग 2000 प्रति पक्ष से आकार में बढ़ जाता है।

विज़ुअलाइज़ेशन के लिए http://imgur.com/a/spQIv देखें। पहली छवि यह है कि यह कैसा दिखना चाहिए, लेकिन जब कैमरा घुमाया जाता है, तो दूसरी छवि में रेखाएं विकृत हो जाती हैं। वोक्सेल आकार को बढ़ाकर और कैमरे को घूर्णन करके प्रभाव खराब हो जाता है। http://imgur.com/a/wRndy में दो गंभीर छवियां हैं जिनमें अधिक गंभीर प्रभाव है।

बनावट (एक एक्स प्रति बनावट) मूल रूप से 512 * 512 पीएक्स हैं। स्क्रीनशॉट किसी भी तरह से स्केल नहीं किया गया है।

मेरा पहला अनुमान नाव अशुद्धियों था, लेकिन उस के बाद से वस्तु 1000

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

तीसरी संभावना मैं सोच सकता हूं कि यह असंभव है और बनावट को कई बार दोहराना नहीं चाहिए। हालांकि, यह काफी संभावना आईएमओ लगता है। मेरा अनुमान (और आशा) यह है कि कुछ तरह की प्राथमिक समस्या है।

इस तरह की चीज़ का कारण बनने या आम तौर पर इस कारण के बारे में कोई सुझाव अच्छी तरह से सराहना की जाती है, क्योंकि मुझे लगता है कि इस समस्या के स्रोत को कम करने की कोशिश करने में मुझे बहुत मुश्किल समय लगता है।

मैं उपयोग कर रहा हूँ:

gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); 
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_NEAREST); 
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); 
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT); 
gl.generateMipmap(gl.TEXTURE_2D); 

और शेडर में:

#ifdef GL_ES 
precision highp float; 
#endif 

मैं भी कुछ बहुत ही प्राथमिक गणनाएं निष्पादित: 32-बिट अधिकतम significand तैरता के लिए चारों ओर 8.4 मिलियन है। वोक्सेल साइड लम्बाई 2000 के लिए (जो मैंने देखा वह प्रभाव वह स्तर था जहां प्रभाव दिखाई दे रहा था), कोई भी समन्वय में फ्लोट राउंडिंग त्रुटि के लगभग 0.00025 की अपेक्षा कर सकता है। मानते हैं कि प्रत्येक दोहराने में स्क्रीन में लगभग 100 पिक्सल लगते हैं, त्रुटि 1 पिक्सेल से काफी कम होनी चाहिए, जो मामला नहीं है। जब तक मेरी गणना उपरोक्त गलत तरीके से नहीं की जाती, तब तक मैं नामांकित करता हूं कि Float32 को दोष नहीं देना है और यह कारण कहीं और होना चाहिए।

लाइन बनावट केवल समस्या को देखने के लिए उपयोग की जाती है। समस्या अन्य (अधिक प्राकृतिक) प्रकार के बनावट के साथ भी बनी रहती है।

संपादित 2 शुरू होता है

को सक्षम या अक्षम करने एंटीलायज़िंग़ नहीं दिखाई फर्क नहीं पड़ता

संपादित 2 समाप्त होता है

+0

क्या आपने इसे विभिन्न कंप्यूटर/ब्राउज़रों पर आजमाया है? या "webgl.prefer-native-gl" सेटिंग? –

+0

उत्कृष्ट बिंदु, मैं लगभग ऐसा करने के लिए भूल गया। मैंने Win XP पर नवीनतम फ़ायरफ़ॉक्स और क्रोम, और क्रोम पर उबंटू दोनों पर इसका परीक्षण किया है। विंडोज़ पर व्यवहार ब्राउज़र के बावजूद लगभग समान है। उबंटू पर कैमरे घूर्णन करते समय बनावट हिलाती है, लेकिन विकृत नहीं होती है। मैं इस अद्यतन के साथ सवाल संपादित कर दूंगा। मैंने आपके द्वारा उल्लिखित सेटिंग की कोशिश नहीं की है, लेकिन जब मैं Win XP कंप्यूटर पर जाता हूं तो इसे बाद में करूँगा। – Asta

+0

यह विकल्प सही साबित हुआ है कि पेज बिल्कुल काम नहीं कर रहा है :( – Asta

उत्तर

6

मुझे विश्वास है कि आप क्या देख रहे हैं वास्तव में precission की वजह से हो सकता है। आपने सही ढंग से गणना की है कि फ़्लोटिंग-पॉइंट निर्देशांक काफी पर्याप्त होना चाहिए, समस्या यह है कि हार्डवेयर बनावट को देखने के लिए फ़्लोट का उपयोग कर रहा है। बनावट इंटरपोलेटर इकाइयों में काफी कम परिशुद्धता होती है (यह नहीं पता कि आज कैसा है, लेकिन यह पुराने GeForce कार्ड पर 16 बिट्स के रूप में कम था)।

तो ... एक इंटरपोलेटर परिशुद्धता को कैसे पार कर सकता है? बड़े ज्यामिति पर बड़े बनावट निर्देशांक (कई दोहराव) का उपयोग करके, जो आप कर रहे हैं वही है। उपाय? छोटे बनावट निर्देशांक का उपयोग करने के लिए अपनी ज्यामिति को उप-विभाजित करें (आप पूर्णांक चरणों में बनावट निर्देशांक को स्थानांतरित कर सकते हैं ताकि वे 0 के करीब हों)।

यहां screenshot है, यह कितना चरम दिख सकता है (मैं अपने GeForce 260 पर त्रुटि को पुन: उत्पन्न करने में सक्षम नहीं था, लेकिन यह नीचे दिए गए चित्र में दिखाए गए अनुसार मेरे टेग्रा 2 टैबलेट पर स्पष्ट रूप से दिखाई देता है)।

+0

जितना अधिक मैं इसके बारे में सोचता हूं, उतना ही मुझे विश्वास है कि यह सही है। विशेष रूप से जब आप यह उल्लेख करना शुरू करते हैं कि आप अपनी कुछ ज्यामिति पर 50-100K दोहराना कर रहे हैं। यदि आपके बनावट 512x512 हैं, तो आपको प्रत्येक पिक्सेल को सटीक रूप से नमूना देने के लिए ~ 0.0019 की सटीकता की आवश्यकता है। यदि आपका कार्ड आपको 16 बिट तक मजबूर कर रहा है, तो 1024 से अधिक मान केवल 0.5 (!) की सटीकता उत्पन्न करेंगे, यहां तक ​​कि पूर्ण 32 बिट फ्लोट के साथ, सटीकता 0-1 रेंज के बाहर तेजी से घट जाती है। यह आपके द्वारा दिखाए गए तरीके से आसानी से आपके आउटपुट के साथ गड़बड़ कर सकता है। – Toji

+0

यह मेरे लिए भी बहुत ही व्यावहारिक स्पष्टीकरण लगता है। कृपया मुझे नोबनेस के लिए क्षमा करें, लेकिन "आपकी ज्यामिति को छोटे बनावट निर्देशांक का उपयोग करने के लिए उपनिवेश" क्या है? बड़े वोक्सेल को छोटे से विभाजित करें? इसके अलावा, बड़े या छोटे बनावट आकार का उपयोग करना होगा? – Asta

+0

मैं इसे लेता हूं आप त्रिकोण या quads का उपयोग कर voxels प्रतिपादन कर रहे हैं। समस्या यह है कि एक बार बनावट में अंतर दो अक्षरों के बीच समन्वय बहुत अधिक होता है, या किसी भी बनावट निर्देशांक का पूर्ण मूल्य बहुत अधिक होता है, सही मान किसी भी बनावट नमूना समारोह से पहले इसे खंडन शेडर तक नहीं बनाते हैं । तो विचार छोटे बहुभुजों का उपयोग करना है, इस तरह आप बनावट को कम करने के अंतर को कम कर सकते हैं। साथ ही, बशर्ते कि आप बनावट दोहरा रहे हों, आप पूर्ण मूल्यों को कम करने के लिए टेक्साकोर्ड को शून्य के करीब स्थानांतरित कर सकते हैं। –

2

मैं आईओएस के तहत इसी तरह की समस्या में भाग गया। बनावट 127 बार दोहराने के बाद, बुरी चीजें होने लगीं।

मैं कुछ पतित त्रिकोण के साथ GL_TRIANGLE_STRIP प्रयोग किया है:

समाधान है कि काम किया यह था। बनावट को वर्चस्व के साथ गठबंधन किया जाता है, इसलिए बनावट के किनारे पर एक अदृश्य (अपरिवर्तनीय) त्रिभुज होता है, जहां बनावट को "प्रदर्शित" किया जाता है क्योंकि मैंने मूल रूप से बनावट समन्वय सेट किया है। इस प्रकार अगला दृश्य त्रिकोण बनाम (0.0, 0.0) समन्वय से बनावट दिखाता है और यह (x, 127.0) समन्वय से अधिक कभी नहीं चला जाता है।

कुछ उदाहरण और चित्रों के साथ यह एक blog post समझाता है।

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