কিছু পরিভাষা কিছুটা বন্ধ:
- এ
Vertex Array
হ'ল একটি অ্যারে (সাধারণত একটি float[]
) যাতে ভার্টেক্স ডেটা থাকে। এটি কোনও কিছুর সাথে আবদ্ধ হওয়ার দরকার নেই। কোনও Vertex Array Object
বা ভিএওর সাথে বিভ্রান্ত হওয়ার দরকার নেই , যা আমি পরে যাব
- একটি
Buffer Object
, সাধারণত Vertex Buffer Object
शिरোখণ্ডগুলি সংরক্ষণ করার সময় হিসাবে উল্লেখ করা হয় , বা সংক্ষেপে ভিবিও, আপনি কেবল এটিকে ডাকছেন Buffer
।
- ভার্টেক্স অ্যারেতে কোনও কিছুই সংরক্ষণ করা যায় না,
glVertexAttribPointer
ঠিক একইভাবে কাজ করে glVertexPointer
বা glTexCoordPointer
কাজ করে, কেবলমাত্র নামযুক্ত বৈশিষ্ট্যের পরিবর্তে, আপনাকে এমন একটি নম্বর সরবরাহ করতে হবে যা আপনার নিজস্ব বৈশিষ্ট্য নির্দিষ্ট করে। আপনি এই মান হিসাবে পাস index
। glVertexAttribPointer
পরের বার আপনি যখন ফোন করবেন glDrawArrays
বা বলবেন তখন আপনার সমস্ত কল কাত হয়ে থাকবে glDrawElements
। আপনার যদি কোনও ভিএও আবদ্ধ থাকে তবে ভিএও আপনার সমস্ত বৈশিষ্ট্যের জন্য সেটিংস সংরক্ষণ করবে।
এখানে মূল সমস্যাটি হ'ল আপনি ভিএওএসের সাথে ভার্টেক্স গুণাবলী বিভ্রান্ত করছেন। ভার্টেক্স অ্যাট্রিবিউটস অঙ্কন করার জন্য শীর্ষবিন্দু, টেক্সকর্ডস, নরমাল ইত্যাদির সংজ্ঞা দেওয়ার নতুন উপায় মাত্র just ভিএওস স্টোরের রাজ্য। আমি প্রথমে ব্যাখ্যা করতে যাচ্ছি যে কীভাবে অঙ্কনটি ভার্টেক্স গুণাবলীর সাথে কাজ করে, তারপরে কীভাবে আপনি ভিএও-র মাধ্যমে পদ্ধতি কলগুলির সংখ্যা হ্রাস করতে পারেন তা ব্যাখ্যা করুন:
- শেডারে এটি ব্যবহার করার আগে আপনাকে অবশ্যই কোনও বৈশিষ্ট্য সক্ষম করতে হবে। উদাহরণস্বরূপ, আপনি যদি একটি শেডারকে শীর্ষে প্রান্ত পাঠাতে চান তবে আপনি সম্ভবত এটি প্রথম অ্যাট্রিবিউট হিসাবে প্রেরণ করতে যাচ্ছেন, ০. সুতরাং আপনাকে রেন্ডার করার আগে আপনাকে এটিটি সক্ষম করতে হবে
glEnableVertexAttribArray(0);
।
- এখন যে কোনও অ্যাট্রিবিউট সক্ষম হয়েছে, আপনাকে এটি ব্যবহার করতে চলেছে ডেটা নির্ধারণ করতে হবে। এটি করার জন্য আপনাকে আপনার ভিবিও - কে আবদ্ধ করতে হবে
glBindBuffer(GL_ARRAY_BUFFER, myBuffer);
।
- এবং এখন আমরা বৈশিষ্ট্যটি সংজ্ঞায়িত করতে পারি -
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
। প্যারামিটারের ক্রম: 0 আপনি যে বৈশিষ্ট্যটি সংজ্ঞায়িত করছেন এটি হ'ল 3 প্রতিটি প্রতিটি শীর্ষবিন্দুর আকার, GL_FLOAT
প্রকার, GL_FALSE
প্রতিটি অনুভূমিককে স্বাভাবিক না করার অর্থ, শেষ 2 টি শূন্যের অর্থ দাঁড়াচ্ছে যে শীর্ষে কোনও স্ট্রাইড বা অফসেট নেই।
- এটি দিয়ে কিছু আঁকুন -
glDrawArrays(GL_TRIANGLES, 0, 6);
- আপনি যে পরবর্তী জিনিসটি আঁকবেন তাতে অ্যাট্রিবিউট 0 ব্যবহার করতে পারে না (বাস্তবে এটি হবে তবে এটি একটি উদাহরণ), সুতরাং আমরা এটিকে অক্ষম করতে পারি -
glDisableVertexAttribArray(0);
glUseProgram()
কলগুলিতে এটি মোড়ানো এবং আপনার কাছে একটি রেন্ডারিং সিস্টেম রয়েছে যা শেডারগুলির সাথে সঠিকভাবে কাজ করে। তবে আসুন আমরা বলি যে আপনার কাছে 5 টি আলাদা আলাদা অ্যাট্রিবিউটস, শীর্ষকোষ, টেক্সকর্ডস, নরমালগুলি, রঙ এবং লাইটম্যাপ স্থানাঙ্ক রয়েছে। প্রথমত, আপনি glVertexAttribPointer
এই বৈশিষ্ট্যের প্রতিটিটির জন্য একক কল করবেন এবং আপনাকে সমস্ত বৈশিষ্ট্য আগেই সক্ষম করতে হবে। আসুন বলে দিন যে আপনি 0-4 বৈশিষ্ট্যগুলি সংজ্ঞায়িত করেছেন কারণ আমি তাদের তালিকাভুক্ত করেছি। আপনি তাদের সকলকে এমনভাবে সক্ষম করবেন:
for (int i = 0; i < 5; i++)
glEnableVertexAttribArray(i);
এবং তারপর আপনি প্রতিটি অ্যাট্রিবিউট জন্য বিভিন্ন VBOs জুড়তে অনুমতি (যদি না আপনি তাদের সব এক VBO এবং ব্যবহার অফসেট / দীর্ঘ স্টোর) হবে, তাহলে আপনি 5 বিভিন্ন করতে হবে glVertexAttribPointer
কল থেকে glVertexAttribPointer(0,...);
থেকে glVertexAttribPointer(4,...);
যথাক্রমে lightmap স্থানাঙ্ক থেকে ছেদচিহ্ন জন্য।
আশা করা যায় যে একা এই ব্যবস্থাটি উপলব্ধি করে। এখন আমি ভিএও-তে যেতে চলেছি যাতে এই ধরণের রেন্ডারিংয়ের সময় পদ্ধতি কলগুলির সংখ্যা কমানোর জন্য কীভাবে তাদের ব্যবহার করতে হয় তা ব্যাখ্যা করতে। মনে রাখবেন যে ভিএও ব্যবহার করার প্রয়োজন নেই।
প্রতিটি কল করার সময় টার্গেট করা Vertex Array Object
সমস্ত glVertexAttribPointer
কল এবং ভিবিওগুলির স্থিতি সংরক্ষণ করতে এ বা ভিএও ব্যবহৃত হয় glVertexAttribPointer
।
আপনি কল দিয়ে একটি তৈরি করুন glGenVertexArrays
। আপনার প্রয়োজনীয় সমস্ত কিছু ভিএওতে সঞ্চয় করতে, এটির সাথে আবদ্ধ করুন glBindVertexArray
, তারপরে একটি সম্পূর্ণ ড্র কল করুন । সমস্ত ড্র বাইন্ড কলগুলি ভিএও-র দ্বারা আটকানো এবং সংরক্ষণ করা হয়। আপনি VAO এর সাথে আনবাইন্ড করতে পারেনglBindVertexArray(0);
এখন আপনি যখন বস্তুটি আঁকতে চান, আপনাকে সমস্ত ভিবিও বাইন্ড বা glVertexAttribPointer
কলগুলি পুনরায় কল করতে হবে না , আপনাকে কেবল ভিএও-কে আবদ্ধ করতে হবে glBindVertexArray
তারপরে কল করুন glDrawArrays
অথবা glDrawElements
আপনি ঠিক একই জিনিসটি আঁকবেন যদিও আপনি এই সমস্ত পদ্ধতি কল করছিল। আপনি সম্ভবত পরে VAO আনবাইন্ড করতে চান।
আপনি একবার ভিএও-কে বাঁধাই করলে, সমস্ত রাজ্য আপনার ভিএও-কে আবদ্ধ করার আগে এটি কেমন ছিল তা ফিরিয়ে দেয়। আমি নিশ্চিত নই যে ভিএও আবদ্ধ থাকাকালীন আপনার যে পরিবর্তনগুলি করা হয়েছে তা রক্ষা করা হয়েছে, তবে এটি পরীক্ষা প্রোগ্রামের সাহায্যে সহজেই বের করা যায়। আমার ধারণা আপনি glBindVertexArray(0);
"ডিফল্ট" ভিএও-র সাথে বাধ্যতামূলক হিসাবে ভাবতে পারেন ...
আপডেট: কেউ আসল ড্র কলটির প্রয়োজনীয়তা আমার নজরে এনেছে। যেমনটি দেখা যাচ্ছে, ভিএও সেট আপ করার সময় আপনাকে কেবল সমস্ত বন্ডিং স্টাফের জন্য একটি সম্পূর্ণ ড্র কল করতে হবে না। কেন আমি আগে এটি প্রয়োজনীয় মনে করেছিলাম তা জানেন না, তবে এটি এখন ঠিক।