সর্বাধিক সঠিক উত্তরটি হ'ল এটি আপনি কীভাবে প্রোগ্রাম করবেন তার উপর নির্ভর করে তবে এটি নিয়ে চিন্তিত হওয়া ভাল। জিপিইউ অবিশ্বাস্যরূপে দ্রুততর হয়ে উঠেছে, জিপিইউ র্যামে এবং আসা ব্যান্ডউইদথটি নয় এবং এটি আপনার সবচেয়ে হতাশাবোধের বাধা হয়ে দাঁড়াবে।
এর ডেটা কি কেবল একবার জিপিইউ মেমরিতে প্রেরণ করে সেখানে চিরতরে বসে থাকে?
আশা করি, হ্যাঁ গতি রেন্ডারিংয়ের জন্য, আপনি প্রতিটি ফ্রেমে এটি পুনরায় পাঠানোর পরিবর্তে আপনার যতটা সম্ভব জিপিইউতে বসতে চান data VBO এর সঠিক উদ্দেশ্যটি পরিবেশন করে। স্থিতিশীল এবং গতিশীল ভিবিও উভয়ই রয়েছে, প্রাক্তন স্ট্যাটিক মডেলগুলির পক্ষে সেরা এবং পরবর্তীকর্মগুলি এমন মডেলগুলির পক্ষে সেরা যাঁর উল্লম্বগুলি প্রতিটি ফ্রেমকে বদলে দেবে (বলুন, একটি কণার সিস্টেম)। এমনকি ডায়নামিক ভিবিও-র কথা হলেও, আপনি প্রতিটি ফ্রেমটি সমস্ত ভার্টিকোস পুনরায় পাঠাতে চান না; শুধু যে পরিবর্তন হয়।
আপনার বিল্ডিংয়ের ক্ষেত্রে, ভার্টেক্স তথ্য কেবল সেখানে বসে থাকবে এবং পরিবর্তিত হওয়া একমাত্র জিনিসটি আপনার ম্যাট্রিক (মডেল / ওয়ার্ল্ড, প্রজেকশন এবং দেখুন) view
একটি কণা সিস্টেমের ক্ষেত্রে, আমি একটি গতিশীল ভিবিও তৈরি করেছি যাতে এই সিস্টেমে সর্বাধিক সংখ্যক কণা থাকতে পারে। প্রতিটি ফ্রেম আমি কয়েকটা ইউনিফর্ম সহ সেই ফ্রেমের নির্গত কণার জন্য ডেটা প্রেরণ করি এবং এটিই অনেক কিছু। যখন আমি আঁকব, আমি সেই ভিবিওতে একটি সূচনা এবং শেষ পয়েন্ট নির্দিষ্ট করতে পারি, সুতরাং কণা ডেটা মুছতে হবে না। আমি শুধু বলতে পারি যে এগুলি আঁকো না।
যখন মডেলটি প্রতিটি ফ্রেমে প্রকৃতপক্ষে রেন্ডার হয়ে যায় তখন জিপিইউ মেমরি থেকে জিপিইউ প্রসেসরগুলিকে প্রতিবার তার ডেটা আনতে হবে? আমার অর্থটি হ'ল - যদি আমি প্রতিটি 2 টি মডেল প্রতি একাধিকবার রেন্ডার করতাম - তবে আমি প্রথমে প্রথম একাধিকবার এবং তারপরে দ্বিতীয়টি একাধিকবার উপস্থাপন করলাম তা বিবেচনা করবে বা আমি যদি প্রথমটি কেবল একবার একবার উপস্থাপন করি তবে দ্বিতীয়টি কেবল একবার এবং এভাবে ইন্টারলিভ করে রেখেছি?
কেবল একটির পরিবর্তে একাধিক ড্র কল পাঠানোর কাজটি অনেক বড় সীমা। উদাহরণস্বরূপ রেন্ডারিং পরীক্ষা করে দেখুন; এটি আপনাকে অনেক সাহায্য করতে পারে এবং এই প্রশ্নের উত্তরটিকে অকেজো করতে পারে। এটিতে আমার সাথে চালকের কিছু সমস্যা ছিল যা আমি এখনও কাজ করি নি, তবে আপনি যদি এটি কাজ করে নিতে পারেন তবে সমস্যা সমাধান।
স্পষ্টতই গ্রাফিক্স কার্ডগুলিতে সীমিত র্যাম রয়েছে - যখন এটি 1 ফ্রেমের রেন্ডারিংয়ের জন্য প্রয়োজনীয় সমস্ত মডেল ডেটা ধরে রাখতে পারে না আমার ধারণা এটি প্রতিটি ফ্রেমে সিপিইউ র্যাম থেকে এটি আনতে (কিছু কিছু) রাখে, এটা কি সঠিক?
আপনি জিপিইউ র্যামের বাইরে যেতে চান না। আপনি যদি করেন তবে জিনিসগুলি পরিবর্তন করুন যাতে আপনি না করেন। আপনি যে কল্পিত দৃশ্যে দৌড়াতে পেরেছেন, সম্ভবত এটি কোনওভাবে ক্র্যাশ হয়ে যাবে, তবে আমি কখনই এমনটি ঘটতে দেখিনি যাতে আমি সততার সাথে জানি না।
আমি একটি পার্থক্য করতে ভুলে গেছি: এখানে জিপিইউতে ডেটা পাঠানো হচ্ছে এবং বাফারগুলিকে বর্তমান হিসাবে সেট / বাঁধাই রয়েছে। পরবর্তী কি কোনও ডেটা প্রবাহ ঘটায়?
কোনও উল্লেখযোগ্য ডেটা প্রবাহ নয়, না। এটির জন্য কিছু ব্যয় রয়েছে, তবে আপনার লেখার কোডের প্রতিটি লাইনের জন্য এটি সত্য। আপনার কতটা ব্যয় হয় তা আবার খুঁজে বের করা, আবার কোনটি প্রোফাইলিংয়ের জন্য।
সূচনা সহ বাফার সৃষ্টি
রাকসওয়ানের উত্তর ভাল লাগছে, তবে এটি মোটেও সঠিক নয়। ওপেনজিএলে, বাফার তৈরি করা কোনও স্থান সংরক্ষণ করে না । আপনি যদি কোনও ডেটা ছাড়াই স্থান সংরক্ষণ করতে চান তবে আপনি glBufferData কল করতে পারেন এবং কেবল নাল পাস করতে পারেন। ( এখানে নোট বিভাগ দেখুন ।)
বাফার ডেটা আপডেট
আমি অনুমান করছি আপনার মানে গ্লুফারডাটা, বা এর মতো অন্যান্য ফাংশন, তাই না? এখানেই আসল ডেটা স্থানান্তর ঘটে। (যদি আপনি নাল পাস না করেন, যেমন আমি কেবল শেষ অনুচ্ছেদে বলেছি))
বাফারটিকে সক্রিয় হিসাবে আবদ্ধ করা (এটি কি কেবলমাত্র API কে বলার উপায় যে আমি চাইছি যে এই বাফারটি পরবর্তী ড্র কলটিতে রেন্ডার করা হবে এবং এটি নিজে থেকে কিছুই করে না?)
হ্যাঁ, তবে এটি এর চেয়ে আরও কিছু বেশি করতে পারে। উদাহরণস্বরূপ, আপনি যদি কোনও ভিএও (ভার্টেক্স অ্যারে অবজেক্ট) আবদ্ধ করেন, তবে একটি ভিবিওকে আবদ্ধ করুন, যা ভিবিও ভিএও-তে আবদ্ধ হয়ে যায়। পরে, আপনি যদি সেই ভিএও কে আবার বেঁধে রাখেন এবং glDrawArrays কল করেন, তবে ভিবিও কী আঁকতে হবে তা তা জানতে পারবে।
নোট করুন যে যখন অনেক টিউটোরিয়াল আপনার প্রতিটি ভিবিওর জন্য একটি ভিএও তৈরি করবে, তখন আমাকে বলা হয়েছে এটি তাদের উদ্দেশ্যযুক্ত ব্যবহার নয়। মনে হয় আপনার একটি ভিএও তৈরি করা উচিত এবং একই বৈশিষ্ট্যযুক্ত প্রতিটি ভিবিওর সাথে এটি ব্যবহার করা উচিত। আমি এটি এখনও চেষ্টা করি নি, তাই এটি আরও ভাল বা খারাপ কিনা তা আমি নিশ্চিত করে বলতে পারি না।
এপিআই ড্র কল
এখানে যা ঘটে তা বেশ সোজা (আমাদের দৃষ্টিকোণ থেকে) is বলুন আপনি একটি ভিএও বাঁধুন, তারপরে glDrawArrays কল করুন। আপনি একটি প্রারম্ভিক বিন্দু এবং একটি গণনা নির্দিষ্ট করেছেন এবং এটি আপনার রেখার প্রতিটি শীর্ষবিন্দুর জন্য শীর্ষস্থানীয় শেডার চালায় যা ফলস্বরূপ তার আউটপুটগুলি রেখার নিচে দিয়ে যায়। যদিও এই পুরো প্রক্রিয়াটি তার নিজস্ব একটি প্রবন্ধ, যদিও।