एंटी ट्रेसिंग को रे ट्रेसिंग में कैसे लागू किया जाता है?


13

ऑनलाइन कुछ लेखों को पढ़ने के बाद, मैं विश्वास के साथ कह सकता हूं कि मैं इस बात पर अड़ी हूं कि रे ट्रेसिंग का उपयोग करते समय एंटी-अलियासिंग कैसे काम करता है

मैं समझता हूं कि एक एकल पिक्सेल / रे को 1 के बजाय 4 उप-पिक्सेल और 4 किरणों में विभाजित किया गया है

क्या कोई यह बता सकता है कि यह कैसे किया जाता है (अधिमानतः कोड के साथ)?


2
मैं तो बस आप "supersampling" को देखने के सुझाव दे सकते हैं en.wikipedia.org/wiki/Supersampling और शायद यह भी en.wikipedia.org/wiki/Distributed_ray_tracing ?
साइमन एफ

2
मैं PBRT pbrt.org/chapters/pbrt_chapter7.pdf के इस अध्याय को पढ़ने और इस पत्र को पढ़ने की सलाह भी दे सकता हूँ lgdv.cs.fau.de/get/785 (जो कि pbrt में लागू एक से भिन्न तकनीक की व्याख्या करता है)।
टॉम वैन बसेल

1
foreach pixel : p{acc = 0; foreach subsample : s { acc+=sample_scene(s);} store(p, acc);}
शाफ़्ट

जवाबों:


12

मुझे लगता है कि यह कहना सुरक्षित है कि रीएट्रैक्शन में एए करने के दो अलग-अलग तरीके हैं:

1: यदि आपकी अंतिम छवि और गहराई वाली छवि है, तो लगभग सभी मौजूदा तकनीकों को लागू करना संभव है जो कि खेल (एफएक्सएए, आदि) में उपयोग किए जाते हैं। वे सीधे अंतिम छवि पर काम करते हैं और किरण से संबंधित नहीं हैं

2: दूसरी विधि प्रत्येक पिक्सेल के लिए कई किरणों को ध्यान में रखना है और फिर परिणाम का औसत है। एक बहुत ही सरल संस्करण के लिए इसे इस तरह से सोचें:

  • आप पहले 1024x1024 आकार की एक छवि प्रदान करते हैं, प्रत्येक पिक्सेल के लिए एक किरण (उदाहरण के लिए)
  • रेंडर करने के बाद, आप छवि को 512x512 पर स्केल करते हैं (प्रत्येक 4 पिक्सेल को एक में औसतन) और आप देख सकते हैं कि किनारे चिकनी हैं। इस तरह आपने 512x512 आकार की अंतिम छवि में प्रत्येक पिक्सेल के लिए 4 किरणों का प्रभावी रूप से उपयोग किया है।

इस पद्धति पर अन्य विविधताएँ हैं। उदाहरण के लिए आप पिक्सेल के लिए नमूनों की संख्या को अनुकूलित कर सकते हैं जो कि ज्यामिति के किनारे पर हैं, जिसका अर्थ है कि कुछ पिक्सेल के लिए आपके पास केवल 4 नमूने होंगे, और अन्य 16 के लिए।

ऊपर टिप्पणी में लिंक की जाँच करें।


इसलिए मूल रूप से मैं एक छवि को एक बड़े आकार के लिए प्रस्तुत करता हूं और जब एक छवि को सहेजता हूं, तो इसे कम आकार में बदल देता हूं? यह काफी सरल लगता है :)! क्या यह सुपर सैंपलिंग विधि है?
अर्जन सिंह

2
@ अर्जन सिंह हाँ यह en.wikipedia.org/wiki/Supersampling है , लेकिन यह उन सभी में सबसे धीमा है, रीट्रैस्टिंग आपको आसानी से अनुकूली
सुपरसामंपलिंग

14

रक्सवन पूरी तरह से सही है कि "पारंपरिक" एंटी अलियासिंग तकनीक रीक्रिएटिंग में काम करेगी, जिसमें एंटीएलियासिंग करने के लिए गहराई जैसी जानकारी का उपयोग करना शामिल है। तुम भी उदाहरण के लिए किरण अनुरेखण में अस्थायी विरोधी अलियासिंग कर सकते हैं।

जूलियन ने रक्सवन की दूसरी वस्तु पर विस्तार किया, जो सुपर सैंपलिंग का विवरण था, और दिखाया कि आप वास्तव में ऐसा कैसे करेंगे, यह भी उल्लेख करते हुए कि आप पिक्सेल के भीतर नमूनों के स्थान को यादृच्छिक कर सकते हैं, लेकिन फिर आप सिग्नल प्रोसेसिंग देश में प्रवेश कर रहे हैं जो बहुत कुछ है गहरा, और यह निश्चित रूप से है!

NN

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

N

जब आप सिर्फ "नियमित" यादृच्छिक संख्याओं का उपयोग करते हैं, जैसे कि आप रैंड () या std :: वर्दी_int_distribution से प्राप्त करेंगे, जिसे "सफेद शोर" कहा जाता है क्योंकि इसमें सभी आवृत्तियां शामिल हैं, जैसे कि सफेद प्रकाश अन्य सभी रंगों (आवृत्तियों) से कैसे बनता है ) प्रकाश का।

पिक्सेल के भीतर नमूनों को यादृच्छिक बनाने के लिए सफेद शोर का उपयोग करने से यह समस्या होती है कि कभी-कभी आपके नमूने एक साथ टकराएंगे। उदाहरण के लिए, यदि आप किसी पिक्सेल में 100 नमूने लेते हैं, लेकिन वे सभी पिक्सेल के ऊपरी बाएँ कोने में होते हैं, तो आपको पिक्सेल के अन्य भागों के बारे में कोई जानकारी नहीं मिलने वाली है, इसलिए आपका अंतिम परिणाम पिक्सेल रंग है क्या रंग होना चाहिए के बारे में जानकारी याद आ जाएगी।

एक बेहतर तरीका यह है कि नीले शोर नामक किसी चीज़ का उपयोग किया जाए जिसमें केवल उच्च आवृत्ति घटक होते हैं (जैसे कि नीली रोशनी उच्च आवृत्ति प्रकाश कैसे होती है)।

नीले शोर का लाभ यह है कि आप पिक्सेल पर कवरेज प्राप्त करते हैं, जैसे कि आप एक समान नमूना ग्रिड के साथ प्राप्त करते हैं, लेकिन, आपको अभी भी कुछ यादृच्छिकता मिलती है, जो शोर में बदल जाती है और आपको एक बेहतर दिखने वाली छवि प्रदान करती है।

दुर्भाग्य से, नीला शोर गणना करने के लिए बहुत महंगा हो सकता है, और सबसे अच्छे तरीके सभी को पेटेंट होने लगते हैं (क्या बिल्ली?), लेकिन ऐसा करने का एक तरीका, पिक्सर द्वारा आविष्कार किया गया (और पेटेंट भी मुझे लगता है लेकिन 100% यकीन नहीं है) नमूना बिंदुओं का समरूप ग्रिड बनाना है, फिर प्रत्येक नमूना बिंदु को बेतरतीब ढंग से ऑफ़सेट करें - जैसे नमूना या ग्रिड की चौड़ाई और ऊँचाई के आधे से कम या शून्य के बीच एक यादृच्छिक राशि। इस तरह आप बहुत सस्ते के लिए एक प्रकार का नीला शोर नमूना प्राप्त करते हैं।

ध्यान दें कि यह स्तरीकृत नमूनाकरण का एक रूप है, और पॉइसन डिस्क नमूनाकरण भी उसी का एक रूप है, जो नीले शोर उत्पन्न करने का एक तरीका भी है: https://www.jasondavies.com/poisson-disc/

यदि आप गहरी जाने में रुचि रखते हैं, तो आप शायद इस प्रश्न और उत्तर की जाँच भी करना चाहेंगे!

एक पिक्सेल के भीतर कई यादृच्छिक नमूनों का उपयोग करके एंटी अलियासिंग के लिए मौलिक तर्क क्या है?

अंत में, यह सामान मोंटे कार्लो पथ अनुरेखण के दायरे में भटकना शुरू कर रहा है जो फोटोरिअलिस्टिक रीट्रैस्टिंग करने के लिए सामान्य तरीका है। यदि आप इसके बारे में अधिक जानने में रुचि रखते हैं, तो इसे पढ़ें!

http://blog.demofox.org/2016/09/21/path-tracing-getting-started-with-diffuse-and-emissive/


जैसे ही मैंने आपका नाम देखा, मुझे पता था कि आप नीले शोर पर कुछ शामिल करेंगे :)
हबल

चूंकि यह फिर से सक्रिय हो गया है: यह समझाने के लिए कि यह मामला क्यों है - नीली शोर नमूना पैटर्न कम आवृत्तियों में केंद्रित अधिकांश ऊर्जा के साथ कार्यों को एकीकृत करने पर उत्कृष्टता प्राप्त करते हैं। तो एक नीले शोर पैटर्न का उपयोग करके आप प्रभावी रूप से मान लेते हैं कि आपका सिग्नल कम आवृत्तियों पर ज्यादातर चिकनी / हावी है। उच्च आवृत्ति संकेतों के लिए, यह वास्तव में उल्टा हो सकता है। सौभाग्य से, प्राकृतिक चित्रों की ऊर्जा कम आवृत्तियों में केंद्रित होती है। अधिक जानकारी के लिए देखें: sampling.mpi-inf.mpg.de/2019-singh-fourier.html
lightxbulb

7

मान लेते हैं कि एक बहुत ही विशिष्ट रेयटरिंग मुख्य लूप है:

struct Ray
{
    vec3 origin;
    vec3 direction;
};

RGBColor* image = CreateImageBuffer(width, height);

for (int j=0; j < height; ++i)
{
    for (int i=0; i < width; ++i)
    {
        float x = 2.0 * (float)i / (float)max(width, height) - 1.0;
        float y = 2.0 * (float)j / (float)max(width, height) - 1.0;

        vec3 dir = normalize(vec3(x, y, -tanHalfFov));
        Ray r = { cameraPosition, dir };

        image[width * j + i] = ComputeColor(r);
    }
}

4 नमूने SSAA करने के लिए इसका एक संभावित संशोधन होगा:

float jitterMatrix[4 * 2] = {
    -1.0/4.0,  3.0/4.0,
     3.0/4.0,  1.0/3.0,
    -3.0/4.0, -1.0/4.0,
     1.0/4.0, -3.0/4.0,
};

for (int j=0; j < height; ++i)
{
    for (int i=0; i < width; ++i)
    {
        // Init the pixel to 100% black (no light).
        image[width * j + i] = RGBColor(0.0);

        // Accumulate light for N samples.
        for (int sample = 0; sample < 4; ++sample)
        {
            float x = 2.0 * (i + jitterMatrix[2*sample]) / (float)max(width, height) - 1.0;
            float y = 2.0 * (i + jitterMatrix[2*sample+1]) / (float)max(width, height) - 1.0;

            vec3 dir = normalize(vec3(x, y, -tanHalfFov) + jitter);
            Ray r = { cameraPosition, dir };

            image[width * j + i] += ComputeColor(r);
        }

        // Get the average.
        image[width * j + i] /= 4.0;
    }
}

एक और संभावना है कि एक यादृच्छिक घबराना (इसके बजाय मैट्रिक्स आधारित एक ऊपर) करना है, लेकिन आप जल्द ही सिग्नल प्रोसेसिंग के दायरे में प्रवेश करते हैं और एक अच्छा शोर फ़ंक्शन चुनने के तरीके को जानने के लिए बहुत अधिक रीडिंग लेते हैं।

हालांकि यह विचार समान है: पिक्सेल को एक छोटे वर्ग क्षेत्र का प्रतिनिधित्व करने पर विचार करें, और केवल एक किरण की शूटिंग के बजाय जो पिक्सेल के केंद्र से होकर गुजरती है, पूरे पिक्सेल क्षेत्र को कवर करने वाली कई किरणों को शूट करें। किरण वितरण जितना अधिक सघन होता है, उतना ही बेहतर संकेत मिलता है।

पुनश्च: मैंने मक्खी पर ऊपर कोड लिखा है, इसलिए मुझे इसमें कुछ त्रुटियां होने की उम्मीद है। यह केवल मूल विचार दिखाने के लिए है।


बहुत बढ़िया जवाब! @Raxvan की विधि के विपरीत इस पद्धति का उपयोग करने के क्या लाभ होंगे? क्या मुझे बड़े आकार में रेंडर करके और फिर छोटे आकार में डाउन करने के समान परिणाम प्राप्त होंगे?
अर्जन सिंह

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

2
घबराने के विषय पर, यह काफी जटिल विषय है। यहाँ कुछ साल पहले के ग्राफिक्स
pixar.com/library/MultiJitteredSampling/paper.pdf

उपरोक्त कोड नमूना 4 नमूना MSAA का उपयोग करता है, अगर मैं 8x MSAA करना चाहता था, तो मैट्रिक्स कैसा दिखेगा? ऊपर दिखाए गए घबराना मैट्रिक्स में मुझे क्या बदलना होगा?
अर्जन सिंह 15

1
@SimonF इसे इंगित करने के लिए धन्यवाद। फिक्स्ड।
जुलिएन गुर्टॉल्ट

1

बस ऊपर दिए गए उत्तरों को जोड़ना है:

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

अडाप्टिव सुपरसम्पलिंग: आप शुरू में प्रति पिक्सेल किरणों की एक निश्चित संख्या में आग लगाते हैं। हालांकि, अगर एक स्थानीय पड़ोस में किरणें काफी भिन्न परिणाम लौटाती हैं, तो आप परिणामों को बेहतर बनाने के लिए स्थानीय रूप से नमूना दर (2x कह सकते हैं) बढ़ा सकते हैं । आप इस प्रक्रिया को दोहराने का विकल्प चुन सकते हैं। यह सही नहीं है क्योंकि ऑब्जेक्ट अभी भी 'नमूनों के बीच गिर सकते हैं', लेकिन यह संभवतः उच्च दर पर समान रूप से नमूने लेने से सस्ता है।

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

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