বৃহত্তর ভার্টেক্স বাফার বনাম একাধিক ড্র কল


14

আমি কেবল ওপেনজিএল দিয়ে শুরু করছি, এবং আমি এটি 2 ডি গেম তৈরি করতে ব্যবহার করার চেষ্টা করছি। এই গেমটিতে, আমার কাছে একটি হেক্সাগোনাল গ্রিড রয়েছে যা বিভিন্ন ধরণের বিভিন্ন রঙের ষড়জাগুলির একটি বিশাল আকারের দ্বারা গঠিত। নবাগত ওপেনজিএল প্রোগ্রামার হিসাবে আমি এই গ্রিডটি আঁকার দুটি উপায় দেখছি:

  1. একক ষড়্ভুজের জন্য ডেটা সহ একটি ভার্টেক্স বাফার ব্যবহার করে, তারপরে ইউনিফর্ম অফসেট মান ব্যবহার করে এবং সিপিইউতে পুনরাবৃত্তি করে একই প্রোগ্রামটি বহুবার আঁকতে আমার গ্রিড না হওয়া পর্যন্ত।
  2. একটি একক কলের মধ্যে সমস্ত হেক্সাগনকে আঁকায় এমন একক খুব বড় প্রাক-গণনাযুক্ত ভার্টেক্স বাফার তৈরি করা।

সবচেয়ে দক্ষ পদ্ধতি কি? এটি করার আরও ভাল উপায় আছে?


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

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

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

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

উত্তর:


9

এই জাতীয় গ্রিড তৈরির কয়েকটি উপায় রয়েছে।

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

মনে রাখবেন যে ইনস্ট্যান্সিংটি অন্য পদ্ধতির তুলনায় কেবলমাত্র দ্রুত হয় যদি আপনি নির্দিষ্ট পরিমাণ উদাহরণস্বরূপ বস্তুর চেয়ে বেশি আঁকেন। উদাহরণস্বরূপ 300 টি অঙ্কন দ্রুত 1 বড় ভিবিও ব্যবহার করে দ্রুত হতে পারে, তবে আপনি উদাহরণস্বরূপ রেন্ডারিং ব্যবহার করলে 2 মিলিয়ন অঙ্কন দ্রুততর হতে পারে।

যদি আপনি উদাহরণস্বরূপ রেন্ডারিং ব্যবহার করেন তবে আপনি অ্যাট্রিবিউট ডিভাইডার ব্যবহার করে প্রতি-বস্তুর ডেটা প্রেরণ করতে পারেন । আপনার ক্ষেত্রে আপনি অবস্থান এবং রঙটি প্রেরণ করতে চান।

উদাহরণস্বরূপ রেন্ডারিংয়ের একটি ভাল টিউটোরিয়াল: ক্লিক করুন

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

এছাড়াও নোট করুন যে ইনস্ট্যান্ট রেন্ডারিং একটি আধুনিক ওপেনএল কার্যকারিতা এবং এটি ব্যবহারের জন্য আপনাকে ছায়ার ব্যবহার করতে হবে। তবে এটি প্রথম থেকেই সঠিক উপায়ে শেখা ভাল।


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

একমত। উদাহরণস্বরূপ আমি উইন্ডোজ / লিনাক্স এবং আতি / এনভিডিয়ায় বিভিন্ন পারফরম্যান্স দেখেছি। সংযোজনের জন্য ধন্যবাদ।
বাসা

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

3

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

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

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