धातु में मिपमप स्तर की गणना कैसे की जाती है?


14

मेरा प्रश्न विशेष रूप से धातु के संबंध में है, क्योंकि मुझे नहीं पता कि क्या उत्तर किसी अन्य एपीआई के लिए बदल जाएगा।

मेरा मानना ​​है कि मैं अब तक यह समझता हूं:

  • एक mipmapped बनावट में "विस्तार का स्तर" होता है, जहां कुछ सार्थक तरीके से मूल बनावट को नीचे करके विस्तार के निम्न स्तर बनाए जाते हैं।

  • Mipmap स्तरों को विस्तार के अवरोही स्तर में संदर्भित किया जाता है, जहां स्तर 0मूल बनावट है, और उच्च-स्तर इसके पावर-ऑफ-टू हैं।

  • अधिकांश GPU ट्रिलिनियर फ़िल्टरिंग को लागू करते हैं, जो प्रत्येक नमूने के लिए दो पड़ोसी मिपमैप स्तर चुनता है, प्रत्येक स्तर से नमूने बिलिनियर फ़िल्टरिंग का उपयोग करता है, और फिर उन नमूनों को रैखिक रूप से मिश्रित करता है।

मुझे यह समझ में नहीं आता है कि इन माइपमैप स्तरों का चयन कैसे किया जाता है। में प्रलेखन धातु मानक पुस्तकालय के लिए, मुझे लगता है कि नमूने के साथ या एक का एक उदाहरण निर्दिष्ट किए बिना, लिया जा सकता है देखने के lod_optionsप्रकार। मुझे लगता है कि इस तर्क में बदलाव होता है कि कैसे मीमैप के स्तर का चयन किया जाता है, और स्पष्ट रूप से lod_options2 डी बनावट के लिए तीन प्रकार हैं:

  • bias(float value)
  • level(float lod)
  • gradient2d(float2 dPdx, float2 dPdy)

दुर्भाग्य से, दस्तावेज़ीकरण यह समझाने में परेशान नहीं करता है कि इनमें से कोई भी विकल्प क्या है। मैं अनुमान लगा सकता हूं कि bias()कुछ स्वचालित रूप से विवरण के स्तर को पूर्वाग्रह करता है, लेकिन फिर पूर्वाग्रह का क्या valueमतलब है? यह किस पैमाने पर काम करता है? इसी तरह, कैसे है lodकी level()असतत मिपमैप स्तरों में अनुवाद किया? और, इस धारणा के तहत काम कर रहा है किgradient2d() बनावट के ढाल का उपयोग करता है समन्वय, यह कैसे ढाल का उपयोग करता है mipmap स्तर का चयन करने के लिए?

इससे भी महत्वपूर्ण बात, अगर मैं इसे छोड़ देता हूं lod_options मीमैप लेवल को कैसे चुना जाता है? क्या यह कार्य निष्पादित होने के प्रकार के आधार पर भिन्न होता है?

और, यदि sample()फ़ंक्शन का डिफ़ॉल्ट नो-लॉज-विकल्प-निर्दिष्ट ऑपरेशन कुछ ऐसा करने के लिए हैgradient2D() (कम से कम एक टुकड़ा shader में), क्या यह साधारण स्क्रीन-स्पेस डेरिवेटिव का उपयोग करता है, या क्या यह सीधे rasterizer और प्रक्षेपित बनावट निर्देशांक के साथ काम करता है एक सटीक ढाल की गणना करने के लिए?

और अंत में, डिवाइस से डिवाइस तक इस व्यवहार में से कितना सुसंगत है? एक पुराना लेख (DirectX 9 के रूप में पुराना) मैंने जटिल उपकरण-विशिष्ट mipmap चयन को संदर्भित पढ़ा, लेकिन मुझे नहीं पता कि mipmap चयन नए आर्किटेक्चर पर बेहतर परिभाषित है या नहीं।

जवाबों:


17

एमआईपी चयन आज डिवाइसों में बहुत अच्छी तरह से मानकीकृत है - अनिसोट्रोपिक फ़िल्टरिंग के कुछ किटी-ग्रिट्टी विवरणों के अपवाद के साथ, जो अभी भी व्यक्तिगत GPU निर्माताओं को परिभाषित करने के लिए है (और इसके सटीक विवरण आमतौर पर सार्वजनिक रूप से प्रलेखित नहीं हैं)।

एमआईपी चयन के बारे में विस्तार से पढ़ने के लिए एक अच्छी जगह ओपनग्ल स्पेक, सेक्शन 8.14, "टेक्सचर मिनिफिकेशन" है । मुझे लगता है कि यह धातु में उसी तरह काम करता है। (Apple कुछ बदल सकता था, यह देखते हुए कि वे हार्डवेयर और एपीआई दोनों बनाते हैं ... लेकिन मुझे संदेह है कि उनके पास है।) मैं इसे यहाँ संक्षेप में बताऊंगा।

डिफ़ॉल्ट एमआइपी चयन (किसी भी lod_optionsसंशोधक का उपयोग नहीं करना ) एमआईपी स्तरों को चुनने के लिए बनावट के स्क्रीन-स्पेस ग्रेडिएटर्स का उपयोग करता है। मूलतः, यह उन मीप स्तरों को चुनने की कोशिश करता है जो पिक्सल के लिए टेक्सल्स की 1: 1 मैपिंग के जितना करीब हो सके। उदाहरण के लिए, यदि ग्रेडिएंट्स की पिक्सेल प्रति 4 टेक्सल्स की लंबाई है, तो यह एमआईपी लेवल 2 (जो कि लेवल का साइज 1 / 4th है और इसलिए आपको पिक्सल के हिसाब से 1 एमपेड टेक्सल देता है) को चुनता है।

ट्रिलिनियर फ़िल्टरिंग के साथ, क्योंकि आप आमतौर पर एक सटीक जमीन पर नहीं आते हैं 1: 1 मैपिंग , यह दो निकटतम स्तरों को चुनता है और उनके बीच रैखिक रूप से प्रक्षेपित होता है, जिससे कि आप अपने कैमरे में वस्तुओं या वस्तुओं के रूप में एमआईपी स्तरों के बीच एक चिकनी संक्रमण कर सकें। चारों ओर।

λλλλ=2.8

यदि अनिसोट्रोपिक फ़िल्टरिंग चालू है, तो केवल दो ग्रेडिएंट के लंबे समय तक उपयोग करने के बजाय, आप ऐसो नमूनों की संख्या निर्धारित करने के लिए उनके अनुपात का उपयोग करते हैं। उदाहरण के लिए, यदि X ग्रेडिएंट Y ग्रेडिएंट की तुलना में 4 गुना अधिक लंबा है, तो आप 4 एआईएसओ नमूनों का उपयोग करेंगे, उनके पदों को एक्स ग्रेडिएंट के साथ स्थान दिया जाएगा। प्रत्येक का उपयोग कर एक ट्रिलिनियर नमूना होगाλ एक्स ग्रेडिएंट की लंबाई 1 (4 वें) के बराबर (यानी दो एमआईपी का स्तर कम है, क्योंकि लॉग2(1/4)=-2)।

अब, संशोधक विकल्पों के लिए:

  • bias पर लागू होता है λइसका उपयोग करने से पहले एमआईपी स्तरों का चयन करने के लिए। इसलिए, उदाहरण के लिए, +1 का एक पूर्वाग्रह यह सामान्य रूप से सामान्य से एक स्तर अधिक कूल्हों का उपयोग करके ट्रिलिनियर फ़िल्टरिंग करेगा। −1 का एक पूर्वाग्रह, मिक्स एक स्तर कम का उपयोग करेगा, और इसी तरह।
  • level पूरी तरह से स्वचालित गणना को ओवरराइड करता है λ स्क्रीन-स्पेस ग्रेडिएंट से, और आपको अपने स्वयं के मूल्य में डाल देता है λ(उर्फ lod) सीधे तौर पर।
  • gradient2dआप अपने स्वयं के ढाल वाले वैक्टर में डालते हैं, जो बनावट निर्देशांक के अंतर्निहित स्क्रीन-स्पेस ग्रेडिएंट के लिए विकल्प है। बाकी एमआईपी चयन और नमूना प्रक्रिया सामान्य के रूप में आगे बढ़ती है, लेकिन परिवर्तित ग्रेडिएंट के साथ। यह आपको अनिसोट्रोपिक फ़िल्टरिंग को अनुकूलित करने देता है।

टुकड़े टुकड़े के अलावा अन्य प्रकार के शेड्स में, "स्क्रीन-स्पेस ग्रेडिएंट्स" की कोई धारणा नहीं है, इसलिए बाद के दो ऑपरेशनों को आमतौर पर केवल अनुमति दी जाती है - कोई भी ऑपरेशन जो अंतर्निहित ग्रेडिएंट्स का उपयोग करने की कोशिश करता है, एक संकलन त्रुटि देगा। मैं सकारात्मक नहीं हूं कि मेटल कैसे करता है, लेकिन यही मैं अन्य एपीआई के साथ काम करने की अपेक्षा करता हूं।

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