24 টিরও কম সংখ্যক কমের সাথে কি কিউব তৈরি করা সম্ভব?


14

আমার কাছে মিনক্রাফ্টের মতো একটি কিউব-ভিত্তিক বিশ্ব রয়েছে এবং আমি ভাবছি যে 24 টিরও কম সংখ্যক কম ঘনক্ষেত্র দিয়ে একটি ঘনক তৈরির উপায় আছে যাতে আমি স্মৃতির ব্যবহার হ্রাস করতে পারি।

এটি আমার পক্ষে 2 কারণে সম্ভব বলে মনে হচ্ছে না: স্বাভাবিকগুলি ঠিকঠাক বের হয় না এবং প্রতি মুখের টেক্সচারগুলি কাজ করে না।

এটা কি আমি নাকি ভুল? হতে পারে কিছু অভিনব নতুন DX11 প্রযুক্তি রয়েছে যা সাহায্য করতে পারে?

সম্পাদনা: কেবল পরিষ্কার করার জন্য, আমার 2 টি প্রয়োজনীয়তা রয়েছে: যথাযথ আলোকপাতের জন্য আমার প্রতিটি ঘনক্ষেতের মুখের জন্য পৃষ্ঠের স্বাভাবিক হওয়া দরকার এবং প্রতিটি ঘনক মুখের জন্য একটি টেক্সচার অ্যারেতে আলাদা সূচককে সম্বোধন করার একটি উপায় আমার প্রয়োজন need


1
আপনি কি গ্রাফিক্স কার্ডের মেমরির ব্যবহার বা র‌্যাম ব্যবহার হ্রাস করতে চান ?
ডপপেলগ্রিনিয়ার

1
ভার্টেক্স তথ্যটি এখনই র‌্যামে এবং জিপিইউতে সংরক্ষণ করা হয়, সুতরাং এটি হ্রাস করা উভয় হ্রাস করতে পারে।
টেলানর

উত্তর:


9

আপনার যদি কেবল মুখোমুখি নরমালগুলির প্রয়োজন হয় এবং যদি আপনার মুখের জন্য টেক্সকর্ডগুলি কঠোরভাবে 0/0, 0/1, 1/0, 1/1 (বা আপনার লেআউটের সাথে সামঞ্জস্যপূর্ণ) হয় তবে আপনি 8 টি ভার্ট সহ একটি ঘনক তৈরি করতে পারেন এবং হয় 30 (পুনঃসূচনা সহ ফালা) বা 36 (তালিকা) সূচক। আপনার ভার্টেক্স শ্যাডারে SV_VertexID এর উপর ভিত্তি করে ধ্রুবক অ্যারে লুকে ব্যবহার করে নরমাল এবং টেক্সকর্ডগুলি আনুন।

এটি করার অর্থ হ'ল এমনকি আপনার পাঠ্য বাফারে আপনাকে টেক্সকর্ডস বা নরমালগুলিও অন্তর্ভুক্ত করার দরকার নেই, যা আপনাকে আরও একটি স্মৃতি সঞ্চয় করে।

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

প্রতি মুখের টেক্সচারের জন্য, কেবল একটি টেক্সচার অ্যারে ব্যবহার করুন। আপনাকে অবশ্যই নিশ্চিত করতে হবে যে অ্যারেতে এই জাতীয় প্রতিটি টেক্সচার অবশ্যই একই আকারের এবং আপনার যদি এখনও অ্যারে পরিবর্তন করার প্রয়োজন হয় তবে আপনার বর্তমান ব্যাচটি ভেঙে ফেলতে হবে, অন্যথায় এটি কাজটি ঠিকঠাক করে নেবে। আপনার ভার্টেক্স সংজ্ঞায় একটি তৃতীয় টেক্সকর্ড যুক্ত করুন যা প্রতিটি মুখের জন্য ব্যবহার করার জন্য অ্যারের স্লাইসটি সংজ্ঞায়িত করে।

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

আমি আমার ইঞ্জিনে বেনমার্ক কোড দিয়েছি যা এই পদ্ধতিটি ব্যবহার করে কেবল কিউবের একগুচ্ছ আঁকে এবং অপেক্ষাকৃত নিম্ন-প্রান্তের জিপিইউতে 60fps সাফ করার সময় আমি সহজেই 300,000 এরও বেশি কিউব দিয়ে চিবতে পারি এবং প্রক্রিয়াটি অনুকূলকরণের জন্য আরও কিছু না করেই । স্বীকারোক্তিজনকভাবে আমি এগুলিকে আলোকিত করছি না বা পাঠ্যদান করি না, তবে আমার কাছে আলফা মিশ্রণ সক্ষম আছে, ব্যাকফেস ক্লুলিং অক্ষম হয়েছে এবং সামগ্রিকভাবে এটি আমার "অংশীদারীকরণের জন্য অন্য কিছু না করা" এর বিরুদ্ধে ভারসাম্য বজায় রাখে, সুতরাং এটির ধরণের সম্পর্কে আপনাকে যুক্তিসঙ্গত ধারণা দেওয়া উচিত বলপার্ক আপনি এই পদ্ধতিতে আঘাত করতে পারেন।


1
আমি আগে ইনস্ট্যান্সিং ব্যবহার করছিলাম এবং এটি 40k কিউব এর নীচে দুর্দান্ত কাজ করে। তবে আমার কমপক্ষে 256k কিউব রয়েছে এবং ইনস্ট্যান্সিংও এটি পরিচালনা করছে না। SV_VertexID একটি লুকের সাথে ব্যবহার করা যদিও খুব আশাব্যঞ্জক মনে হচ্ছে।
টেলানর

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

এছাড়াও - মানচিত্রের সংখ্যা কম রাখা অপরিহার্য। মানচিত্র / একটি কিউব লিখুন / আনম্যাপে 40 কে বার মানচিত্রের চেয়ে অনেক ধীর হতে চলেছে / 40k কিউব লিখবে / একবার আনম্যাপ করুন। আপনি যদি প্রাক্তনটি করে থাকেন তবে পরবর্তীগুলিতে স্যুইচ করার চেষ্টা করছেন।
ম্যাক্সিমাস মিনিমাস

15

আমি মনে করি আপনি তৈরি করতে পারেন এমন প্রধান অপ্টিমাইজেশন, এই তথ্যের উপর ভিত্তি করে যে প্রতিটি ঘনক্ষেত্রের জন্য আসলে সমস্ত 24 টি শীর্ষ কোণের প্রয়োজন হবে না । প্রকৃতপক্ষে, কেবলমাত্র ঘনক্ষেত্রের জন্য যেগুলি 24 টি शिरোখণ্ডের প্রয়োজন, সেগুলি মাঝারি ভাসমান যা সম্ভবত একটি বিরল ঘটনা।

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

নীচের চিত্রটি এই ধারণাটি দেখায়, তবে সহজ বোঝার জন্য 2D তে। চিত্রটিতে 11 টি দখলকৃত ব্লক রয়েছে (পূর্ণ ধূসর বৃত্তগুলি দ্বারা প্রতিনিধিত্ব করা হয়), যা সাধারণত উপস্থাপনের জন্য 4 x 11 = 44 প্রান্তের প্রয়োজন (4 কারণ এটি একটি বর্গক্ষেত্র নয়, কিউব নয়)। তবে আপনি দেখতে পাচ্ছেন, খালি বর্গক্ষেত্রের সংস্পর্শে আসার সময় আপনাকে কেবল সত্যিকারের প্রান্তটি আঁকতে হবে, যা এই ক্ষেত্রে মাত্র 8 টি প্রান্তে রয়েছে।

এখানে চিত্র বর্ণনা লিখুন

যদি 2 ডি-তে এর সরল উদাহরণ 44 টি প্রান্ত 8 টি প্রান্তকে হ্রাস করতে পরিচালিত হয়, তবে একটি বৃহত 3 ডি বিশ্বে লাভগুলি কল্পনা করুন ...

এটি এই নিবন্ধে বর্ণিত পদ্ধতির , যা আমি আপনাকে ওপেনজিএল লক্ষ্য করেও পড়ার পরামর্শ দিচ্ছি। ধারণাগুলি যদিও বেশ সার্বজনীন হওয়া উচিত।

আপনি সম্ভবত জিপিইউতে ফ্লাইয়ের উপরের উত্সগুলি তৈরি করতে জ্যামিতির শেডার ব্যবহার করতে পারেন , তাদের স্মৃতিতে সঞ্চয় করার প্রয়োজনীয়তা বাদ দিয়ে, তবে আমার এটির অভিজ্ঞতা নেই, বা এটিও জানেন না যে এটি একটি বৃহত্তর জন্য কতটা ভাল সঞ্চালন করবে দুনিয়া।


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

আপনি কী বোঝাতে চেয়েছেন যে জ্যামিতি শেডার এবং ক্রম পণ্যটি নরমালগুলি গণনা করতে ব্যবহার করুন? আমি এটি ব্যবহার করার কথা ভাবছিলাম, যেমন সমতল পৃষ্ঠগুলির জন্য পৃথক প্রোগ্রাম তৈরি করা (আমি টেক্সচারের সাথে সম্পর্কিত নই)।
dreta

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

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