আমি কীভাবে বাস্তব সময়ে স্বাক্ষরিত দূরত্বের ক্ষেত্রগুলি (2 ডি) দ্রুত তৈরি করতে পারি?


21

পূর্ববর্তী একটি প্রশ্নে , প্রস্তাবিত হয়েছিল যে স্বাক্ষরিত দূরত্বের ক্ষেত্রগুলি পূর্বঘটিত করা যেতে পারে, রানটাইমে লোড করা যায় এবং সেখান থেকে ব্যবহার করা যেতে পারে।

যে কারণে আমি এই প্রশ্নের শেষে ব্যাখ্যা করব (আগ্রহী ব্যক্তিদের জন্য), আমার বাস্তব সময়ে দূরত্বের ক্ষেত্রগুলি তৈরি করা দরকার।

বিভিন্ন পদ্ধতির জন্য এখানে কিছু কাগজপত্র রয়েছে যা রিয়েল-টাইম পরিবেশে যেমন व्यवहार যোগ্য বলে মনে করা হয়, যেমন চ্যাম্পার দূরত্বের রূপান্তরগুলির জন্য পদ্ধতি এবং ভোরোনাই চিত্র-আনুমানিক ভিত্তিক রূপান্তরগুলি ( পিক্সেলজঙ্ক শ্যুটার দেবের উপস্থাপনায় প্রস্তাবিত হিসাবে ), তবে আমি (এবং এইভাবে অন্য অনেক লোককে ধরে নেওয়া যেতে পারে) আসলে তাদের ব্যবহারের জন্য রাখার জন্য খুব কঠিন সময় কাটায়, যেহেতু তারা সাধারণত দীর্ঘ, বেশিরভাগ গণিতের সাথে ফুলে যায় এবং তাদের ব্যাখ্যাটিতে খুব অ্যালগরিদমিক নয়।

রিয়েল-টাইমে দূরত্বের ক্ষেত্রগুলি তৈরি করার জন্য আপনি কোন অ্যালগরিদমের পরামর্শ দিবেন (জিপিইউ অনুকূলভাবে) দূরত্বের ক্ষেত্রগুলির ফলাফলের গুণমান বিবেচনা করে?

যেহেতু আমি অন্য একটি কাগজ বা স্লাইডের লিঙ্কের বিপরীতে প্রকৃত ব্যাখ্যা / টিউটোরিয়াল খুঁজছি, এই প্রশ্নটি একটি :-) এর জন্য যোগ্য হলেই এটি একটি অনুগ্রহ পাবে।

আসল সময়ে এটি করার দরকার কেন তা এখানে:

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

উদাহরণস্বরূপ, ১০০ * ১০০ পিক্সেলের টাইল আকারের সাথে 1000 * 256 (প্রস্থ * উচ্চতা) সহ একটি অপেক্ষাকৃত ছোট মানচিত্র এবং সুতরাং 10000 * 2560 পিক্সেলের মোট মাত্রা আপনাকে ইতিমধ্যে প্রায় 2 মেগাবাইট আকারে ব্যয় করতে পারে, যদি আপনি অপেক্ষাকৃত ছোট চয়ন করেন 128x128 এর এসডিএফ রেজোলিউশন, ধরে নেওয়া যে আপনি 0 থেকে 255 এর মধ্যে কেবল দূরত্বের মান সংরক্ষণ করছেন।

স্পষ্টতই, এটি দ্রুত খুব বেশি হয়ে উঠতে পারে এবং এটি একটি ওভারহেড যা আমি চাই না।

আরও কিছু আছে:

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


আমি "স্বাক্ষরিত দূরত্বের ক্ষেত্রটি কী" গগল করেছিলাম এবং প্রথমটি হিট হয়েছিল একটি জিপিইউ সংস্করণ: http.developer.nvidia.com/GPUGems3/gpugems3_ch34.html এটি কিছুটা পুরানো তবে আপনার অনুসন্ধানগুলিতে আরও সহায়তা করতে পারে।
প্যাট্রিক হিউজ 19

1
হতে পারে আমি কিছু মিস করছি, তবে আপনাকে কেন রিয়েল টাইমে এটি করা দরকার (কিছুটা নয়, কেন এটি স্পয়লার-ট্যাগ করা হয়েছে) এর বিবৃতিতে আমি কিছুটা বিভ্রান্ত; প্রথমত, আপনি কোথায় 128x128 এর এসডিএফ এর জন্য 2 এমবি চিত্র পাবেন? দ্বিতীয়ত, আপনি 2 এমবি বিশেষত ভারী মেমরির ব্যবহার কেন বিবেচনা করেন? আমি সম্মত হই যে এটি অনিবার্য নয়, তবে এটি আপনার সামগ্রিক মানচিত্রের মেমরির ব্যবহারের একটি সামান্য অংশ মনে হয়। এবং তৃতীয়, রিয়েলটাইমে ক্ষেত্রটি কীভাবে তৈরি করা সেই স্মৃতিটিকে বাঁচাবে? আপনাকে এখনও একই তথ্য সংরক্ষণ করতে হবে এটি উড়ে বা উত্পাদিত না, না?
স্টিভেন স্টাডনিকি

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

1
যদি আমি বাস্তব সময়ে দূরত্ব ক্ষেত্রটি উত্পন্ন করি তবে আমি কেবল ফ্রেম প্রতি সেই 2MB এক সময় তৈরি করব (মোট মেমরি ওভারহেড সর্বদা একটি দূরত্বের ক্ষেত্রের জন্য প্রয়োজনীয় মেমরি হবে, যেহেতু আমার কেবল পর্দার জন্য একটি প্রয়োজন)। আমার যদি আমার 1000x128 উদাহরণের চেয়ে বড় মানচিত্র থাকে (আমি মনে করি বড় টেরারিয়া মানচিত্রগুলি 10000 এর চেয়ে বেশি এগিয়ে যায়) সেই মানচিত্রটির প্রতি 1000x128 সাবম্যাপের জন্য আমার সেই 2 এমবিগুলির একটি দরকার। আমার প্রথম স্থানে এসডিএফগুলির দরকার কেন এই প্রশ্নের শুরুতে আমি যুক্ত হওয়া প্রথম প্রশ্নে বর্ণিত হয়েছে (এটি জিপিইউ 2 ডি শ্যাডো কাস্টিংয়ের জন্য)।
ট্র্যাভিসজি

1
@ আপনি কি একবার ফ্রেমে 2 এমবি ডেটা তৈরি করার চেষ্টা করছেন? সিরিয়াসলি?
কাওড

উত্তর:


9

ক্যাটালিন জিমা তার নিবন্ধে ডায়নামিক 2 ডি ছায়া কীভাবে অর্জন করবেন তা ব্যাখ্যা করে - এবং তিনি স্বাক্ষরিত দূরত্বের ক্ষেত্রটি ব্যবহার করেন (যা থেকে আমি বলতে পারি যে এই প্রসঙ্গে একটি ছায়া বাফারের জন্য অভিনব নাম)। তার পদ্ধতির জন্য একটি জিপিইউ দরকার, এবং তার বাস্তবায়ন যেমন হয় তেমন সেরা হয় না (আমার মেশিনে প্রায় 20 টি লাইটে তার 60Hz এর নিচে নামানো হয়েছে, আমার প্রায় 500 টি লাইট পেয়েছে); যা তার গতিবেগের ওভার স্পিডের কোডের স্পষ্টতার পক্ষে রয়েছে বলে আশা করা যায়।

বাস্তবায়ন

ঠিক তাঁর দ্বারা বাস্তবায়িত:

  1. সমস্ত ছায়া কাস্টারকে একটি টেক্সচারে রেন্ডার করুন।
  2. প্রতিটি পিক্সেলের জন্য আলোর কেন্দ্রের দূরত্ব গণনা করুন এবং অস্বচ্ছ পিক্সেলের আরজিবিতে সেই মান নির্ধারণ করুন।
  3. চিত্রটিকে বিকৃত করুন যাতে এটি উপস্থাপন করে যে কোনও 3 ডি ক্যামেরা কীভাবে সেই পিক্সেল দেখেছিল।
  4. তাঁর নিবন্ধে বর্ণিত অস্বাভাবিক আকার পরিবর্তন করে চিত্রটিকে 2xN আকারের চিত্রে স্কোয়াশ করুন (একটি সরল আকার পরিবর্তন করবে না)।
  5. 2xN চিত্রটি এখন আলোর চারটি কোয়াড্রেন্টের জন্য আপনার স্বাক্ষরিত দূরত্ব ক্ষেত্র (মনে রাখবেন যে একটি কোয়াড্রেন্ট মূলত 90 ডিগ্রিতে একক ক্যামেরা হতাশ)।
  6. লাইটম্যাপটি রেন্ডার করুন।
  7. হালকা মানচিত্রটি হালকা করুন (আলোক থেকে দূরত্বের ভিত্তিতে) যাতে আপনি নরম ছায়া পান।

আমার চূড়ান্ত বাস্তবায়নটি ছিল (প্রতিটি পদক্ষেপই একক শেডার):

  1. (1) করুন।
  2. কি (2) এবং (3)
  3. (4) করুন। তার বাস্তবায়নটি আসলেই ধীর: আপনি যদি এর জন্য জিপিজিপিইউ চেষ্টা করতে পারেন এবং ব্যবহার করতে পারেন। আমি জিপিজিপিইউ (এক্সএনএ) ব্যবহার করতে পারিনি তাই আমি যা করলাম তা হ'ল:
    • একটি জাল স্থাপন করুন যেখানে প্রথম এন / 2 কলামগুলিকে এন / 2 কোয়াড দ্বারা প্রতিনিধিত্ব করা হয়েছিল ঠিক একই অবস্থান (চূড়ান্ত বাফারের প্রথম কলামটি কভার করে) তবে আলাদা আলাদা জমিনের সমন্বয় (দ্বিতীয় এন / 2 কলামের জন্য একই জিনিস)
    • জিপিইউতে গভীরতা-পরীক্ষা বন্ধ করুন।
    • এমআইএন পিক্সেল মিশ্রণ ফাংশনটি ব্যবহার করুন।
  4. (6) এবং (7) করুন।

এটি বেশ বুদ্ধিমান: এটি মূলত কোনও ছায়া গো থ্রিডি তে কীভাবে 2 ডি তে পরিচালিত হয় তার সরাসরি অনুবাদ।

pitfalls

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


60fps এর উপরে 500 লাইট পরিচালনা করার জন্য এটির আকার পরিবর্তন করার একমাত্র জিনিসটি কি পুনরায় আকারের পদ্ধতির সাথে সামঞ্জস্য ছিল?
ট্র্যাভিসজি

ঠিক আছে, আমি উত্তরটি গ্রহণ করব যেহেতু এটি আমার আসল সমস্যাটি সমাধান করে তবে আমি যা অনুদানের জন্য দিয়েছিলাম তা সত্যিই উত্তর দেয় না। আমি অপেক্ষা করব এবং সম্ভবত কেউ চারপাশে স্বাক্ষরিত দূরত্বের ক্ষেত্র উত্পাদন করার জন্য বেশ কয়েকটি ও (এন) পদ্ধতির একটি ব্যাখ্যা করতে দীর্ঘ সময় আসবে।
ট্র্যাভিসজি

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

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

1
@ এইটি আমার শ্যাডার : gist.github.com/2384073 । বিকৃতকরণ 2 + 3 হয়।
জোনাথন ডিকিনসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.