অ্যান্টি আলিয়াজিং কীভাবে রে ট্র্যাকিংয়ে প্রয়োগ করা হয়?


13

অনলাইনে কয়েকটি নিবন্ধ পড়ার পরে আমি আত্মবিশ্বাসের সাথে বলতে পারি যে রে ট্র্যাকিং ব্যবহার করার সময় অ্যান্টি-অ্যালিজিং কীভাবে কাজ করে সে সম্পর্কে আমি নির্লিপ্ত

আমি কেবল বুঝতে পারি যে একটি সিঙ্গল পিক্সেল / রায় 1 এর চেয়ে 4 টি সাব-পিক্সেল এবং 4 টি রশ্মিতে বিভক্ত

কেউ কী দয়া করে ব্যাখ্যা করতে পারেন যে এটি কীভাবে হয় (পছন্দমত কোড সহ)?


2
আমি শুধু আপনাকে "supersampling" তাকান পরামর্শ দিতে পারেন en.wikipedia.org/wiki/Supersampling এবং সম্ভবত এছাড়াও en.wikipedia.org/wiki/Distributed_ray_tracing ?
সাইমন এফ

2
আমি পিবিআরটি pbrt.org/chapters/pbrt_chapter7.pdf এই অধ্যায়টি পড়ার এবং এই কাগজটি lgdv.cs.fau.de/get/785 পড়ার সুপারিশ করতে পারি (যা পিবিআরটি বাস্তবায়নের চেয়ে আলাদা কৌশল ব্যাখ্যা করে)।
টম ভ্যান বুসেল

1
foreach pixel : p{acc = 0; foreach subsample : s { acc+=sample_scene(s);} store(p, acc);}
ratchet freak

উত্তর:


12

আমি মনে করি এটি নিরাপদ বলে যে রাইট্রেসিংয়ে এএ করার দুটি ভিন্ন উপায় রয়েছে:

1: আপনার যদি চূড়ান্ত চিত্র এবং গভীরতার চিত্র থাকে তবে গেমগুলিতে ব্যবহৃত সমস্ত বিদ্যমান কৌশলগুলি প্রয়োগ করা সম্ভব (এফএক্সএএ, ইত্যাদি) যারা চূড়ান্ত চিত্রটিতে সরাসরি কাজ করে এবং রেয়েট্র্যাকিংয়ের সাথে সম্পর্কিত নয়

2: দ্বিতীয় পদ্ধতিটি হ'ল প্রতিটি পিক্সেলের জন্য একাধিক রশ্মিকে বিবেচনা করা এবং তারপরে ফলাফলটি গড় করা। খুব সাধারণ সংস্করণের জন্য এটিকে এভাবে ভাবুন:

  • আপনি প্রথমে 1024x1024 আকারের একটি চিত্র সরবরাহ করুন, প্রতিটি পিক্সেলের জন্য একটি করে রশ্মি (উদাহরণস্বরূপ)
  • রেন্ডারিংয়ের পরে, আপনি চিত্রটি 512x512 এ স্কেল করুন (প্রতিটি 4 পিক্সেল একের মধ্যে বিভক্ত হয়) এবং আপনি খেয়াল করতে পারেন যে প্রান্তগুলি মসৃণ। এইভাবে আপনি 512x512 আকারের চূড়ান্ত চিত্রটিতে প্রতিটি পিক্সেলের জন্য কার্যকরভাবে 4 টি রশ্মি ব্যবহার করেছেন।

এই পদ্ধতিতে অন্যান্য বিভিন্নতা রয়েছে। উদাহরণস্বরূপ আপনি জ্যামিতির প্রান্তে থাকা পিক্সেলগুলির জন্য নমুনার সংখ্যাটি খাপ খাইয়ে নিতে পারবেন অর্থাত্ কিছু পিক্সেলের জন্য আপনার কাছে কেবল 4 টি নমুনা থাকবে এবং অন্যদের 16 টি।

উপরের মন্তব্যে লিঙ্কগুলি চেক করুন।


সুতরাং মূলত আমি একটি চিত্রকে একটি বৃহত আকারে রেন্ডার করি এবং এটি কোনও চিত্রে সংরক্ষণ করার সময়, এটি কম আকারে ডাউনস্কেল করি? বেশ সহজ মনে হচ্ছে :)! এটি কি সুপার স্যাম্পলিং পদ্ধতি?
আরজান সিং

1
সিং @Arjan হ্যা, এটাই en.wikipedia.org/wiki/Supersampling , কিন্তু এই তাদের সমস্ত ধীরতম, raytracing আপনি সহজেই অভিযোজিত supersampling, যা অনেক বেশি ভালো সম্পাদন করতে পারবেন না সম্ভব হয়
Raxvan

14

রাকসওয়ান পুরোপুরি সঠিক যে "traditionalতিহ্যবাহী" অ্যান্টি অ্যালাইজিং কৌশলগুলি অ্যান্টিঅ্যালাইজিংয়ের গভীরতার মতো তথ্য ব্যবহার করে রাইট্রেসিংয়ে কাজ করবে। আপনি উদাহরণস্বরূপ রশ্মির ট্রেসিংতে টেম্পোরাল অ্যান্টি এলিয়াসিংও করতে পারেন।

জুলিয়ান রাক্সভানের দ্বিতীয় আইটেমের উপরে প্রসারিত হয়েছিল যা সুপার স্যাম্পলিংয়ের ব্যাখ্যা ছিল এবং আপনি কীভাবে বাস্তবে এটি করবেন তা দেখিয়েছিলেন, এবং উল্লেখ করেছেন যে আপনি পিক্সেলের মধ্যে নমুনাগুলির অবস্থানটি এলোমেলো করে দিতে পারেন তবে আপনি সংকেত প্রক্রিয়াকরণ দেশে প্রবেশ করছেন যা অনেক বেশি আরও গভীর, এবং এটি অবশ্যই!

NN

আপনি যদি এটি করেন তবে আপনি এখনও এলিয়াসিং পেতে পারেন। এটি না করা থেকে ভাল, কারণ আপনি আপনার নমুনা হার বাড়িয়ে চলেছেন, তাই উচ্চতর ফ্রিকোয়েন্সি ডেটা (ওরফে ছোট বিবরণ) পরিচালনা করতে সক্ষম হবেন তবে এটি এখনও অ্যালিজিংয়ের কারণ হতে পারে।

N

যখন আপনি কেবল "নিয়মিত" র্যান্ডম নম্বর ব্যবহার করেন যেমন আপনি র‌্যান্ড () বা স্ট্যান্ড :: ইউনিফর্ম_আইন_ডিজিবিউটেশন থেকে পেয়ে যান, তাকে "সাদা শব্দ" বলা হয় কারণ এতে সমস্ত ফ্রিকোয়েন্সি থাকে যেমন সাদা লাইট অন্য সমস্ত রঙের (ফ্রিকোয়েন্সি) দ্বারা তৈরি হয় ) আলোর.

একটি পিক্সেলের মধ্যে নমুনাগুলি এলোমেলো করতে সাদা গোলমাল ব্যবহার করে এমন সমস্যা রয়েছে যে কখনও কখনও আপনার নমুনাগুলি একসাথে ঝাপসা হয়ে যায়। উদাহরণস্বরূপ, যদি আপনি পিক্সেলের গড় ১০০ টি নমুনা হন তবে সেগুলি সবই পিক্সেলের উপরের বাম কোণে থাকে তবে আপনি পিক্সেলের অন্যান্য অংশগুলি সম্পর্কে কোনও তথ্য পাবেন না, সুতরাং আপনার চূড়ান্ত ফলাফলের পিক্সেলের রঙ এটি কী রঙ হওয়া উচিত সে সম্পর্কে তথ্য অনুপস্থিত হবে।

আরও ভাল পদ্ধতির মধ্যে রয়েছে নীল শব্দ যা কিছু বলা হয় যার মধ্যে কেবল উচ্চ ফ্রিকোয়েন্সি উপাদান থাকে (যেমন নীল আলো কীভাবে উচ্চ ফ্রিকোয়েন্সি আলো হয়)।

নীল শব্দের সুবিধা হ'ল আপনি পিক্সেলের উপরে এমনকি কভারেজ পান, যেমন আপনি একটি ইউনিফর্ম স্যাম্পলিং গ্রিড পেয়ে থাকেন তবে আপনি এখনও কিছুটা এলোমেলোতা পান যা শব্দের সাথে অ্যালিয়াসিংয়ে পরিণত হয় এবং আপনাকে আরও ভাল চিত্র দেবে।

দুর্ভাগ্যক্রমে, নীল আওয়াজ গণনা করা খুব ব্যয়বহুল হতে পারে, এবং সর্বোত্তম পদ্ধতিগুলি সমস্তকে পেটেন্ট করা হয়েছে বলে মনে হচ্ছে (কী হ্যাক ?!), তবে এটি করার একটি উপায়, পিক্সার দ্বারা উদ্ভাবিত হয়েছে (এবং পেটেন্টেডও আমি মনে করি তবে 100% নিশ্চিত নয়) নমুনা পয়েন্টগুলির একটি এমনকি গ্রিড তৈরি করা হয়, তারপরে এলোমেলোভাবে প্রতিটি নমুনা বিন্দু একটি অল্প পরিমাণে অফসেট করে - নমুনা গ্রিডের প্রস্থ এবং বিয়োগের অর্ধ প্রস্থ এবং উচ্চতার মধ্যে একটি এলোমেলো পরিমাণের মতো। এই ভাবে আপনি বেশ সস্তার জন্য এক ধরণের নীল শব্দের নমুনা পান।

নোট করুন যে এটি স্ট্রেটেইড স্যাম্পলিংয়ের একটি ফর্ম, এবং পোইসন ডিস্ক স্যাম্পলিং এটিরও একটি রূপ যা নীল আওয়াজ উত্পন্ন করার একটি উপায়: https://www.jasondavies.com/poisson-disc/

আপনি যদি আরও গভীর হতে আগ্রহী হন তবে আপনি সম্ভবত এই প্রশ্নটি এবং উত্তরটিও দেখতে চান!

পিক্সেলের মধ্যে একাধিক এলোমেলো নমুনা ব্যবহার করে অ্যান্টি এলিয়াসিংয়ের মৌলিক যুক্তি কী?

শেষ অবধি, এই স্টাফটি মন্টে কার্লো পাথ ট্রেসিংয়ের রাজ্যে বিভ্রান্ত হতে শুরু করেছে যা আলোকিতাত্ত্বিক রাইট্রেসিংয়ের সাধারণ পদ্ধতি। আপনি যদি সে সম্পর্কে আরও জানতে আগ্রহী হন তবে এটি পড়ুন!

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


আপনার নামটি দেখার সাথে সাথেই আমি জানতাম আপনি নীল আওয়াজে কিছু অন্তর্ভুক্ত করবেন :)
হাবল

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);
    }
}

৪ টি নমুনা এমএসএএ করার জন্য এটির একটি সম্ভাব্য পরিবর্তন হ'ল:

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;
    }
}

আর একটি সম্ভাবনা একটি র্যান্ডম জিটার করা (উপরের ম্যাট্রিক্স ভিত্তিক একের পরিবর্তে) করা, তবে আপনি শীঘ্রই সিগন্যাল প্রসেসিংয়ের ক্ষেত্রটিতে প্রবেশ করেন এবং কীভাবে একটি ভাল শব্দ শোনার ফাংশন চয়ন করতে হয় তা জানতে প্রচুর পড়া দরকার।

ধারণাটি এখনও একই রয়ে গেছে: একটি ক্ষুদ্র বর্গক্ষেত্র অঞ্চল উপস্থাপনের জন্য পিক্সেলটি বিবেচনা করুন এবং পিক্সেলের মধ্য দিয়ে যাওয়া কেবল একটি রশ্মির পরিবর্তে পুরো পিক্সেল অঞ্চল জুড়ে অনেকগুলি রশ্মি অঙ্কিত করুন। রশ্মির বিতরণ যত ঘন হবে ততই তত ভাল সংকেত পাবেন।

PS: আমি ফ্লাইতে উপরের কোডটি লিখেছি, তাই আমি এটিতে কয়েকটি ত্রুটি আশা করব। এটি কেবলমাত্র প্রাথমিক ধারণাটি দেখানো।


দুর্দান্ত উত্তর! এই পদ্ধতিটি ব্যবহার করে @ রাক্সওয়ান ব্যবহৃত পদ্ধতির বিপরীতে কী কী উপকার হবে? বড় আকারে রেন্ডারিং করে এবং তারপরে আরও ছোট আকারে ডাউনস্ক্যাল করে কি একই ফলাফল পাব?
আরজান সিং

মৌলিকভাবে, রে ট্রেসিংয়ের সাথে আপনাকে কেবলমাত্র একটি বৃহত্তর চিত্র সরবরাহ করার দরকার নেই তারপরে এটি কমিয়ে আনুন। এর অর্থ হল আপনার আরও অনেক নমনীয়তা রয়েছে: আপনারা প্রচুর নমুনা নিতে পারেন, অঞ্চলটির উপর নির্ভর করে আপনি নমুনার সংখ্যাতে ভিন্নতা আনতে পারেন এবং সহজভাবে আপনাকে পুনরুদ্ধারের পদক্ষেপটি যুক্ত করতে হবে না।
জুলিয়েন গের্টল্ট

2
ঝাঁকুনির বিষয়ে, এটি মোটামুটি জটিল বিষয় হিসাবে প্রমাণিত। কয়েক বছর আগে গ্রাফিক্স.পিক্সার.লাইবারি
মাল্টিজিট্টারস্যাম্পলিং / পেপার.পিডিএফ

উপরের কোডের নমুনায় একটি 4 নমুনা এমএসএএ ব্যবহার করে, যদি আমি 8x এমএসএএ করতে চাইতাম তবে ম্যাট্রিক্সটি কেমন হবে? উপরে দেখানো জিটার ম্যাট্রিক্সে আমার কী পরিবর্তন করতে হবে?
আরজান সিং

আপনি বলছেন "4 টি নমুনা এমএসএএ হবে:" সম্ভবত আপনি এসএসএএ বোঝাতেন। এমএসএএ, ব্যয় / মানের ট্রেড অফ হিসাবে রাস্টেরাইজেশন হিসাবে ব্যবহৃত হয়, প্রথমে নির্ধারণ করে যে প্রতিটি নমুনা হিট করে কোন বস্তুটি (ত্রিভুজ পড়ুন)। যদি তাদের সমস্ত একই বস্তুটিকে আঘাত করে তবে কেবল একটি শেডিং অপারেশন করা হয়। যদি 2 টি পৃথক বস্তু পাওয়া যায়, তবে 2 শেডিং ক্রিয়াকলাপ সম্পাদন করা হয় এবং ফলাফলগুলিকে প্রতিটি বস্তুর সাথে সংখ্যার নমুনার সংখ্যার সংখ্যার দ্বারা ভারযুক্ত এবং সংক্ষিপ্ত করা হয়, এবং 3 টি ইত্যাদির জন্য। আপনি যা বর্ণনা করছেন তা হ'ল স্ট্যান্ডার্ড সুপার স্যাম্পলিং এএ, আই, ই, এসএসএএ।
সাইমন এফ

0

কেবল উপরের উত্তরগুলিতে যুক্ত করতে:

বিতরণ করা রে ট্রেসিং (কুক, পোর্টার, এবং কার্পেন্টার)। আপনাকে একই সাথে স্থানিক এএ, টেম্পোরাল এএ (অর্থাত গতি অস্পষ্টতা) এবং ক্ষেত্রের ফোকাস / গভীরতা করার অনুমতি দেয়। কাগজটি পড়ার পক্ষে সর্বোত্তম, তবে মূলত আপনি যে এন-রে পিক্সেল প্রতি জ্বালান তাও সিউডো-এলোমেলো সময় (গতি অস্পষ্টতার জন্য) এবং একটি লেন্সের উপর অবস্থিত (ফোকাস ইফেক্ট পেতে) নির্ধারিত হতে পারে।

অভিযোজিত সুপারসম্পলিং: আপনি প্রথমদিকে পিক্সেলটিতে নির্দিষ্ট সংখ্যক রশ্মি ছড়িয়ে দেন। তবে, যদি কোনও স্থানীয় প্রতিবেশীর রশ্মি উল্লেখযোগ্যভাবে পৃথক ফলাফল দেয়, তবে আপনি স্থানীয়ভাবে নমুনার হার বাড়িয়ে তুলতে পারেন (2x বলুন), ফলাফলগুলি উন্নত করতে। আপনি প্রক্রিয়া পুনরাবৃত্তি করতে পারেন। এটি নিখুঁত নয় যেহেতু বস্তুগুলি এখনও 'নমুনাগুলির মধ্যে পড়তে পারে', তবে এটি উচ্চতর হারে সমানভাবে নমুনা দেওয়ার চেয়ে সস্তা che

শঙ্কু দিয়ে রে ট্রেসিং (অ্যামানাটিডস): একটি অনন্ত পাতলা রশ্মি ব্যবহার না করে প্রতিটি রশ্মির পরিবর্তে একটি শঙ্কু দ্বারা সজ্জিত করা হয়, একটি ব্যাস দিয়ে বলুন যা সমস্ত পিক্সেলকে কভার করে (এবং প্রতিবেশীদের মধ্যে কিছু) আপনাকে আংশিক কভারেজটি মূল্যায়ন করতে দেয় । এটি টেক্সচার স্যাম্পলিং / অ্যান্টিএলাইজিং, নরম ছায়া গো এবং মডেলগুলির সম্ভাব্য এলওডির জন্যও বেনিফিট রয়েছে। আমি বহু বছর আগে একটি বাস্তবায়ন করেছি - এটি করা অবশ্যই আরও কঠিন, তবে অতিরিক্ত রশ্মিগুলি এড়িয়ে যায়। আইআইআরসিতে পেন্সিল ট্রেসিং নামে একটি স্কিম ছিল (তবে আমার প্রাথমিক অনুসন্ধানে কাগজের কোনও লিঙ্ক পাওয়া যায়নি)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.