बनावट mipmaps के साथ असंतुलन समन्वय समन्वय बनाता है


9

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

बदसूरत सीम http://cdn.imghack.se/images/6bbe0ad0173cac003cd5dddc94bd43c7.png

इसलिए मैंने बनावट ग्रैड का उपयोग करके ग्रेडिएंट्स को मैन्युअल रूप से ओवरराइड करने की कोशिश की:

//fragVert is the original vertex from the vertex shader
vec2 ll = vec2((atan(fragVert.y, fragVert.x) / 3.1415926 + 1.0) * 0.5, (asin(fragVert.z) / 3.1415926 + 0.5));
vec2 ll2 = ll;
if (ll.x < 0.01 || ll.x > 0.99)
    ll2.x = .5;
vec4 surfaceColor = textureGrad(material.tex, ll, dFdx(ll2), dFdy(ll2));

अब मुझे एक के बदले दो सीम मिल रहे हैं। मैं उनसे पीछा कैसे छुड़ाऊं? और ऊपर का कोड 2 सीम क्यों उत्पन्न करता है?

2 ईगल http://cdn.imghack.se/images/44a38ef13cc2cdd801967c9223fdd2d3.png

आप दो छवियों से नहीं बता सकते हैं, लेकिन 2 सीम मूल सीम के दोनों ओर हैं।


2
क्या आपका क्षेत्र एक जाल है, या आप इस क्षेत्र को विश्लेषणात्मक रूप से छायादार या इस तरह से बदल रहे हैं? यदि यह एक जाली है, तो लोग आमतौर पर सीम के साथ कोने को दोहराते हुए इसे हल करते हैं ताकि एक तरफ के हिस्से में u = 0 हो और दूसरी तरफ u = 1. हो
नाथन रीड

जैसे कि आपका कोड दो सीम क्यों बनाता है, मुझे उम्मीद है कि यह दो असंतोष पैदा कर रहा है - एक जहां यू 0.01 से 0.5 तक कूदता है, और एक यू जहां 0.99 से 0.5 तक कूदता है। यह उसी तरह की समस्या है जब यू 0 से 1 तक कूदता है - एक कूद के रूप में नहीं, लेकिन अभी भी एक बड़ा कूद।
नाथन रीड

मेरे पास गोले के लिए एक जाली है। यह एक डिकाहेड्रोन है, इसलिए सीम तक सीम नहीं है। दो सीमों के बारे में मजेदार बात यह है कि मूल सीम चला गया है। इसके अलावा, मुझे वही 2 सीम मिलते हैं, भले ही मैं इसे .01 या .99 पर क्लैंप करता हूं।
ओमिकुन

क्या आप दो सीटों वाले मामले का स्क्रीनशॉट पोस्ट कर सकते हैं? और, आप UVs कैसे उत्पन्न कर रहे हैं (क्या आप अपने कोड का प्रासंगिक हिस्सा पोस्ट कर सकते हैं)? मुझे लगता है कि आप उन्हें shader में प्रक्रियात्मक रूप से उत्पन्न कर रहे हैं, न केवल उन्हें कोने से प्रक्षेपित कर रहे हैं, अन्यथा आपका dodecahedron जाल बिल्कुल भी काम नहीं करेगा।
नाथन रीड

मैंने 2 सीमों की एक तस्वीर के साथ सवाल को अपडेट किया, वे मूल सीम के दोनों ओर हैं, लेकिन मूल सीम नहीं है। मुझे लगता है कि यूवी को कोने से प्रक्षेपित किया गया है, निश्चित नहीं है। कोड अब प्रश्न में है।
ओमिकुन

जवाबों:


4

आपके द्वारा पोस्ट किए गए shader कोड के आधार पर, आप UVs को कोने से प्रक्षेपित नहीं कर रहे हैं - बल्कि ऐसा प्रतीत होता है कि आप 3D स्थिति ( fragVert) में इंटरपोल कर रहे हैं , फिर गोलाकार निर्देशांक में परिवर्तित करके UVs की गणना कर रहे हैं ।

आपका विश्लेषण इस बात में सही है कि एक छोटी सी गड़बड़ी को तब चुना जाता है जब कोई गड़बड़ी हो, क्योंकि मिममैप चयन डेरिवेटिव पर आधारित होता है जो पड़ोसी पिक्सल में उपयोग किए जाने वाले यूवी से संख्यात्मक रूप से अनुमानित होते हैं। जब एक पिक्सेल में u = 0 होता है और दूसरे में u = 1 होता है, तो आपको एक बहुत बड़ा व्युत्पन्न मिलता है। आपके प्रयास में ठीक यही समस्या है कि बड़े व्युत्पन्न u = 0.01 और u = 0.99 के आसपास होते हैं, यही वजह है कि मूल सीम जहां था, उसके दोनों तरफ दो सीम दिखाई देते हैं।

समस्या को ठीक करने के लिए एक अपेक्षाकृत सरल तरीका यह तय करना होगा कि कौन सा एमआईपी स्तर का उपयोग करें और textureLodसीधे इसे नमूना करने के लिए कॉल करें । यदि ग्रह हमेशा कैमरे के काफी करीब होने वाला है, तो आप हार्ड लेवल को mip लेवल को 0 पर ले जा सकते हैं (या उस मामले के लिए, बस बनावट में एमआईपी के स्तर को शामिल न करें)। अन्यथा, यह कैमरे से बिंदु की दूरी के लॉग 2 पर आधारित हो सकता है, कुछ उपयुक्त कारकों द्वारा बढ़ाया जा सकता है। ध्यान दें कि यह अनीसोट्रोपिक फ़िल्टरिंग को प्रभावी रूप से अक्षम कर देगा।

एक अधिक "सही" दृष्टिकोण कुछ उच्च-गुणवत्ता वाले डेरिवेटिव की गणना करना होगा। इसके बजाय का उपयोग करने का dFdxऔर dFdyयूवी, जिसकी वजह से discontinuities है पर atan2, आप लागू हो सकते हैं dFdxऔर dFdyकरने के लिए fragVert(जो क्षेत्र के आसपास सभी तरह निरंतर हो जाएगा), तो कुछ पथरी (श्रृंखला नियम) का उपयोग यूवी डेरिवेटिव प्राप्त करने के लिए सूत्र खोजने के लिए स्थिति डेरिवेटिव से। यह अधिक जटिल और धीमा होगा, लेकिन इसका लाभ यह है कि एनिसोट्रोपिक फ़िल्टरिंग को काम करना चाहिए।

अंत में, चूंकि आप OpenGL के लिए नए हैं, तो मैं सिर्फ इस बात पर ध्यान दूंगा कि गोलाकार निर्देशांक से UV की गणना करते समय एक गोले को बनावट के लिए एक पूरी तरह से मान्य तरीका है, यह "सामान्य" तरीका नहीं है जो ज्यादातर लोग उठाते हैं। यह एक गोलाकार जाल का निर्माण करने के लिए अधिक सामान्य है जिसमें यूवी प्रति वर्टेक्स निर्दिष्ट किया गया है, और सिर्फ़ शीर्ष शेल्डर से पिक्सेल शेडर (प्रत्येक त्रिभुज में रैखिक रूप से प्रक्षेपित) से पारित किया गया है। सीम के साथ वर्टीकल को इस तरह रखा जाता है , जैसे कि प्रत्येक वर्टेक्स की दो प्रतियां होती हैं, बिल्कुल उसी स्थिति में, लेकिन आधा u = 0 के साथ एक तरफ त्रिकोण से जुड़ा होता है, और दूसरा आधा u = 1 के साथ जुड़ा होता है दूसरी तरफ त्रिकोण। यह किसी भी दृश्यमान सीम को समाप्त कर देता है और पिक्सेल शेडर में किसी भी चाल की आवश्यकता नहीं होती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.