ভক্সেল রেন্ডারিংয়ের জন্য, আরও দক্ষ কী: প্রাক-তৈরি ভিবিও বা জ্যামিতি শেডার?


26

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

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

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

উত্তর:


9

আমি একটি মাইনক্রাফ্ট প্রকারের দৃশ্যের কথা ভাবছি, যেখানে ভক্সেলের মাধ্যমে আপনি বোঝাচ্ছেন এমন একগুলি বিশ্ব যা ব্লকগুলির একটি পৃথিবী যা আসলে বহুভুজ ব্যবহার করে রেন্ডার করা হয়:

আপনি যদি জ্যামিতির শেডার ব্যবহার করেন তবে ভক্সেল প্রতি ঠিক তিনটি মুখ (বা যা কিছু হোক) এড়ানো এড়ানো কঠিন।

যদি আপনার কাছে খুব বেশি সংলগ্ন ব্লক থাকে যা একই টেক্সচারের হয় তবে আপনি ভিবিও পদ্ধতির আপনার (অধঃপতিত) স্ট্রিপের অনেক কম ত্রিভুজ পেতে টেক্সচারের টাইলিং ব্যবহার করতে পারেন। আমি বলতে চাইছি, যদি ঘাস ভক্সেলের একটি দুর্দান্ত বড় ফ্ল্যাট 6x6 অঞ্চল থাকে তবে আপনি 64 এর পরিবর্তে পুরো শীর্ষটি 2 ​​টি ত্রিভুজগুলিতে আঁকতে পারেন।

জিএস পদ্ধতির সাহায্যে আপনি সংলগ্ন ভক্সেলগুলি দ্বারা মুখের তুচ্ছ কুলিং করতে পারবেন না যা কোনও ভিবিও পদ্ধতির সাথে খুব সোজা।

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

আমি 6 টি মুখের প্রত্যেকের জন্য পৃথক ভিবিও ব্যবহার করেছি - আপনাকে কেবলমাত্র তাদের মধ্যে স্পষ্টতই 3 টির বেশি আঁকতে হবে। এটি মাইনক্রাফ্ট-স্টাইলের ভক্সেলের উপরের অংশগুলিতে সাধারণত ব্যবহৃত বিভিন্ন টেক্সচারের সাথে দুর্দান্তভাবে ফিট করে। কারণ প্রতিটি সেটের জন্য স্বাভাবিক এবং এর পরে অভিন্ন।

GL_REPEATঅনুভূমিক অক্ষের সাথে অ্যাটলাসে উল্লম্ব-টাইল্ড পিক্সাম্যাপ ব্যবহার করার সাথে এবং একই আটলাসে পিক্স্যাম্পের 90-ডিগ্রি ঘোরানো সংস্করণ পেয়ে আমি জানতে পেলাম একই কলটিতে একই ভিবিও ব্যবহার করে আমি স্পষ্টতই বিভিন্ন ব্লকগুলি অঙ্কন করতে পারি। 6x6 ঘাসের অঞ্চলের উদাহরণে, আমি এটিকে 12 টি ত্রিভুজ করে বিভক্ত করলাম যেহেতু আমার আটলাসে কেবলমাত্র একটি মাত্রায় আমি পুনরাবৃত্তি করেছি।

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


3
আপনার কেবলমাত্র ভক্সেলের প্রতি সর্বাধিক 3 টি মুখ আঁকতে হবে তবে আপনার দৃষ্টিভঙ্গির উপর নির্ভর করে প্রতিটি ভক্সেলের জন্য বিভিন্ন মুখ আঁকার প্রয়োজন যাতে অপ্টিমাইজেশনটি এত সহজ নয়? একটি প্রাক-তৈরি ভিবিওতে একাধিক ভক্সেল থাকবে। যদি আপনার দৃষ্টিভঙ্গি ভক্সেলের মধ্যে থাকে তবে আপনি একটির পূর্ব দিক এবং অন্যটির পশ্চিম দিক দেখতে পাবেন see এটির সাহায্য করার একমাত্র উপায় হ'ল আপনি তুচ্ছভাবে আসল পিছনের মুখগুলি মুছতে পারেন তবে সবচেয়ে খারাপ ক্ষেত্রে এখনও আপনি ভক্সেলের একটি গ্রুপে 6 টির 5 টি রেন্ডার করুন। যদি আপনার দৃষ্টিভঙ্গিটি ভিবিওর অক্ষীয় সীমাগুলির বাইরে থাকে , তবে আপনাকে কেবল 3 টি দিক রেন্ডার করতে হবে।
বিজোর ওয়েইন

বিজোরনে স্পট, এটি করণীয়। (কিন্তু আমি প্রয়োজনীয় হিসাবে ব্লক জন্য VBOs তৈরি করছি এবং পুনর্বিবেচনা আমি যা নির্মিত হয়েছে ক্যামেরা প্যাচসমূহ, বরং সব সময়ে VBOs মধ্যে সমগ্র বিশ্বের থাকার চেয়ে; তাই আমি এই পছন্দ করতে একটি প্রাকৃতিক সময় আছে)
উইল

10

উদাহরণস্বরূপ অ্যারে ব্যবহার করে তৃতীয় বিকল্পটি কী? মূলত আপনি ভক্সেল-ডেটা ভিবিওর (ওপেনগিএল ব্যবহার glVertexAttribDivisorকরে, নিশ্চিত) পয়েন্টস (এবং অন্যান্য ডেটা) অনুসারে একটি একক ড্র কল সহ অনেকগুলি বাক্স (একটি সাধারণ 8-ভার্টেক্স কিউব দিয়ে তৈরি) আঁকেন ডিএক্সেরও তা আছে)। এটি জ্যামিতির শেডার পদ্ধতির চেয়ে দ্রুততর হতে পারে যদিও অ্যাপ্লিকেশন কোডটি (নন শেডার) খুব একই রকম হওয়া উচিত, কারণ আমি মনে করি জ্যামিতির শেডারগুলি ধীর হওয়ার জন্য খ্যাতি অর্জন করেছে, যদিও আমি এখনও বসে আছি বলে তাদের সাথে আমার কোনও অভিজ্ঞতা নেই (বা তাত্ক্ষণিক) ২.১ হার্ডওয়ারে

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


হ্যাঁ এই সমস্যাটির সেরা সমাধান। আমার কাছে কেন ঘটল না? :)
নোটবেইন

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

@ জারিকম্প্পা বেকড জ্যামিতি বলতে কী বোঝাতে চেয়েছেন?
স্টিভেন লু

উদাহরণগুলি প্রাক-অনুবাদিত এবং একক জালে অনুলিপি করা হয়েছে। এক জাল থাকা যেমন একশ কিউব বা যা কিছু উপস্থাপন করে।
জারি কম্প্পা

@ জারিকম্প্পা আমি একই ফলাফলগুলি দেখেছি, যেখানে জাল তৈরি করা খুব দ্রুত। তবে জিটিএক্স 680 এ ইনস্ট্যান্সিং বিকল্পটি আরও দ্রুত, অদ্ভুতভাবে কাজ করছে বলে মনে হচ্ছে।
লেবি এইচ

1

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

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

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


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

ব্যান্ডউইথ বড় সমস্যা হবে না (আমার অভিজ্ঞতা থেকে), তবে অবশ্যই এটি সত্য। এবং আপনি জিএসের অন্যান্য আদিমগুলিতে অনুসন্ধান করতে পারবেন না (এটি কি আমি জানি :))।
নোটবেইন

@ তমসচি: হ্যাঁ এই প্রশ্নটি লেখার ঠিক পরে আমার কাছে এই সমস্যাটি দেখা দিয়েছে .. সিপিইউ-সংস্করণের জন্য, সলিউডের মাঝের ভক্সেলগুলি দমন করা হয়, তবে জিপিইউতে এটি প্রাক-পাস ব্যতীত অসম্ভব হতে পারে যার পরিমাণ কী হবে with
বিচ্ছিন্নতা

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