ভার্টেক্স অ্যারে অবজেক্টস কি?


114

এই টিউটোরিয়ালটি থেকে আমি আজই ওপেনজিএল শিখতে শুরু করছি: http://openglbook.com/the-book/
আমি দ্বিতীয় অধ্যায়টি পেয়েছি, যেখানে আমি একটি ত্রিভুজ আঁকছি এবং আমি ভিএওগুলি বাদে সব কিছুই বুঝতে পারি (এটি কি সংক্ষিপ্ত রূপ ঠিক আছে?)। টিউটোরিয়ালের এই কোডটি রয়েছে:

glGenVertexArrays(1, &VaoId);
glBindVertexArray(VaoId);

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

একটি ভার্টেক্স অ্যারে অবজেক্ট (বা ভিএও) এমন একটি বস্তু যা বর্ণনা করে যে কীভাবে ভার্টেক্স অ্যাট্রিবিউটগুলি ভার্টেক্স বাফার অবজেক্টে (বা ভিবিও) সংরক্ষণ করা হয়। এর অর্থ হ'ল ভিএও হ'ল ভার্টেক্স তথ্য সংরক্ষণের প্রকৃত অবজেক্ট নয়, তবে ভারটিেক্সের ডেটা বর্ণনাকারী। ভার্টেক্স অ্যাট্রিবিউটগুলি glVertexAtribPointer ফাংশন এবং এর দুটি বোন ফাংশন glVertexAttribIPointer এবং glVertexAttribLPointer দ্বারা বর্ণনা করা যেতে পারে, যার মধ্যে প্রথমটি আমরা নীচে অনুসন্ধান করব।

আমি বুঝতে পারছি না ভিএও কীভাবে ভার্টেক্স গুণাবলী বর্ণনা করে। আমি সেগুলি কোনওভাবেই বর্ণনা করি নি। এটি কি glVertexAttribPointer থেকে তথ্য পায়? আমার ধারণা এটি অবশ্যই হবে be ভিএও কি কেবল গ্লোভার্টেক্স অ্যাট্রিবিপয়েন্টার থেকে প্রাপ্ত তথ্যের গন্তব্য?

পাশের নোটে, আমি যে টিউটোরিয়ালটি অনুসরণ করছি তা কি গ্রহণযোগ্য? আমার দেখার মতো কিছু আছে বা আরও ভাল টিউটোরিয়াল অনুসরণ করতে হবে?

উত্তর:


100

"ভার্টেক্স অ্যারে অবজেক্ট" টিপস নামগুলির জন্য ওপেনজিএল এআরবি সাবকমিটি আপনার কাছে এনেছে।

এটিকে জ্যামিতি অবজেক্ট হিসাবে ভাবেন। (পুরানো সময়ের এসজিআই পারফর্মার প্রোগ্রামার হিসাবে, আমি তাদের জিওসেট বলি)

যখন কোনও ভিএও প্রথম সীমাবদ্ধ থাকে, আপনি ফোন করে এই সদস্যদের অর্পণ করেন

glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer...;
glEnableClientState(GL_NORMAL_ARRAY); glNormalPointer...;

ইত্যাদি। কোন বৈশিষ্ট্য সক্ষম এবং আপনার সরবরাহ করা পয়েন্টারগুলি ভিএওতে সঞ্চিত থাকে।

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

(এক বারের সেটআপ, একাধিক ব্যবহার হ'ল ভিএও ব্যবহার করার সহজতম উপায়, তবে আপনি কেবল এটিকে আটকে রেখে আরও সক্ষম / পয়েন্টার কল করে বৈশিষ্ট্যগুলিও পরিবর্তন করতে পারেন V ভিএওগুলি ধ্রুবক নয়))

প্যাট্রিকের প্রশ্নের জবাবে আরও তথ্য:

নতুন তৈরি করা ভিএওর জন্য ডিফল্ট হ'ল এটি খালি (এএফআইএকে)। কোনও জ্যামিতি একেবারেই নয়, এমনকি ভার্টেক্সও নয়, তাই আপনি যদি এটি আঁকতে চেষ্টা করেন তবে আপনি একটি ওপেনএল ত্রুটি পাবেন। এটি যুক্তিযুক্তভাবে বুদ্ধিমান, যেমন "মিথ্যা / NULL / শূন্যে সমস্ত কিছু শুরু করুন"।

আপনি কেবল glEnableClientStateযখন জিনিসগুলি সেট আপ করেন তখনই আপনার প্রয়োজন । ভিএও প্রতিটি পয়েন্টারের জন্য সক্ষম / অক্ষম রাষ্ট্রের কথা স্মরণ করে।

হ্যাঁ ভিএও সংরক্ষণ করবে glEnableVertexAttribArrayএবং glVertexAttrib। পুরাতন ভার্টেক্স, সাধারণ, রঙ, ... অ্যারেগুলি অ্যাট্রিবিউট অ্যারে, ভার্টেক্স == # 0 এবং এর মতো।


62
'"ভার্টেক্স অ্যারে অবজেক্ট" টিপস নামগুলির জন্য ওপেনজিএল এআরবি সাবকমিটি আপনার কাছে এনেছে' ' হ্যাঁ, কোনও বস্তুর জন্য এমন নিরীহ নাম যা ভার্টেক্স অ্যারের বাইন্ডিংগুলি সঞ্চয় করে ।
নিকল বোলাস

2
এছাড়াও, কী সম্পর্কিত কোনও ভিএও রয়েছেglVertexAttribPointer
প্যাট্রিক

2
মূল প্রোফাইলটি ব্যবহার করা লোকদের জন্য জেনেরিক ভার্টেক্স গুণাবলী ব্যবহার সম্পর্কে কিছু তথ্য যুক্ত করুন।
ওসকার

8
@ নিকোলবোলাস এর চেয়ে আরও ভাল নাম VertexArrayMacroবা অনুরূপ কিছু হবে ।
bobobobo

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

8

ভার্টেক্স অ্যারে অবজেক্টগুলি ওয়ার্ড প্রসেসিং প্রোগ্রামগুলিতে ম্যাক্রোগুলির মতো এবং এর মতো। একটি ভাল বর্ণনা এখানে পাওয়া যায় ।

ম্যাক্রো শুধু মনে রাখবেন আপনি কল যখন যেমন সক্রিয় এই গুণ, বাঁধাই করা যে বাফার ইত্যাদি ক্রিয়াগুলি করেছিল glBindVertexArray( yourVAOId ), এটা শুধু রিপ্লেতে ঐ অ্যাট্রিবিউট পয়েন্টার বাইন্ডিং এবং বাইন্ডিং বাফার।

সুতরাং আপনার পরবর্তী কলটি ভিএও-র দ্বারা আবদ্ধ ছিল যা ব্যবহার করে তা আঁকতে।

ভিএও'র ভার্টেক্স ডেটা সংরক্ষণ করবেন না । নং। ভারটিেক্স ডেটা একটি ভার্টেক্স বাফারে বা ক্লায়েন্ট মেমরির একটি অ্যারেতে সঞ্চয় করা হয়।


19
-1: এগুলি ম্যাক্রোর মতো নয়। যদি সেগুলি হয়, তবে নতুন ভিএও-তে বাঁধাই করা পূর্ববর্তী ভিএও-র দ্বারা সক্রিয় ভার্টেক্স অ্যারেগুলিকে অক্ষম করবে না, যদি না নতুন ভিএও " স্পষ্টত " সেই অ্যারেগুলি অক্ষম না করে থাকে। সমস্ত ওপেনজিএল অবজেক্টের মতো ভিএওও কমান্ড নয়, স্টেট রাখে । কমান্ডগুলি কেবলমাত্র রাষ্ট্র পরিবর্তন করে তবে অবজেক্টগুলি ডিফল্ট স্টেট সেট সহ আসে। একারণে নতুন তৈরি করা ভিএও-র সাথে বাঁধাই সমস্ত বৈশিষ্ট্য সর্বদা অক্ষম করবে ।
নিকল বোলাস

6

আমি সর্বদা ওপেনএল দ্বারা ব্যবহৃত ডেটা বাফারের অ্যারে হিসাবে ভিএও সম্পর্কে ভাবি। আধুনিক ওপেনজিএল ব্যবহার করে আপনি একটি ভিএও এবং ভার্টেক্স বাফার অবজেক্ট তৈরি করবেন।

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

//vaoB is a buffer
glGenVertexArrays(1, vaoB); //creates one VAO
glBindVertexArray(vao.get(0));
glGenBuffers(vbo.length, vbo, 0); //vbo is a buffer
glBindVertexArray(vao.get(1));
glGenBuffers(vbo1.length, vbo1, 0); //vbo1 is a buffer
glBindVertexArray(vao.get(2));
glGenBuffers(vbo2.length, vbo2, 0); //vbo2 is a buffer

পরবর্তী পদক্ষেপটি একটি বাফারের সাথে ডেটা বাঁধাই:

glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);
glBufferData(GL_ARRAY_BUFFER,vertBuf.limit()*4, vertBuf, GL_STATIC_DRAW); //vertf buf is a floatbuffer of vertices

এই মুহুর্তে ওপেনজিএল দেখেছে:

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

বাফারে থাকা ডেটা কী উপস্থাপন করে তা ওপেনজিএলকে এখন বলতে আমরা glVertexAttribPointer ব্যবহার করতে পারি:

glBindBuffer(GL_ARRAY_BUFFER, 0); //bind VBO at 0
glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0); //each vertex has 3 components of size GL_FLOAT with 0 stride (space) between them and the first component starts at 0 (start of data)

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

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

glBindBuffer(GL_ARRAY_BUFFER, vbo[1]);
glBufferData(GL_ARRAY_BUFFER,coordBuf.limit()*4, coordBuf, GL_STATIC_DRAW);
glVertexAttribPointer(0, 2, GL_FLOAT, false, 0, 0);

পরবর্তী আপনি টেক্সচারটি আবদ্ধ করতে এবং অ্যারে আঁকতে পারেন, আপনি একটি ভার্ট এবং ফ্রেগ শেডার তৈরি করতে চান, এটি একটি প্রোগ্রামে সংকলন এবং সংযুক্ত করতে চান (এখানে অন্তর্ভুক্ত নয়)।

glActiveTexture(textureID); //bind our texture
glBindTexture(GL_TEXTURE_2D, textureID);
glDrawArrays(GL_TRIANGLES,0,6); //in this case 6 indices are used for two triangles forming a square

5

ভিএও হ'ল একটি অবজেক্ট যা ওপেনজিএল পাইপলাইনের ভার্টেক্স আনার পর্যায়টি উপস্থাপন করে এবং ভার্টেক্স শেডারকে ইনপুট সরবরাহ করতে ব্যবহৃত হয়।

আপনি এর মতো ভার্টেক্স অ্যারে অবজেক্ট তৈরি করতে পারেন

GLuint vao;
glCreateVertexArrays(1, &vao);
glBindVertexArray(vao);

প্রথমে একটি সহজ উদাহরণ করা যাক। শেডার কোডে এই জাতীয় ইনপুট পরামিতি বিবেচনা করুন

layout (location = 0) in vec4 offset; // input vertex attribute

এই বৈশিষ্ট্যটি পূরণ করতে আমরা ব্যবহার করতে পারি

glVertexAttrib4fv(0, attrib); // updates the value of input attribute 0

যদিও ভার্টেক্স অ্যারের অবজেক্টটি আপনার জন্য এই স্থির বৈশিষ্ট্য মানগুলি সঞ্চয় করে তবে এটি আরও অনেক কিছু করতে পারে।

ভার্টেক্স অ্যারে অবজেক্ট তৈরি করার পরে আমরা তার রাজ্যে পূরণ করা শুরু করতে পারি। আমরা বাফার অবজেক্টে সঞ্চিত ডেটা ব্যবহার করে ওপেনজিএল এটি স্বয়ংক্রিয়ভাবে পূরণ করতে বলব। প্রতিটি ভার্টেক্স অ্যাট্রিবিউট একটি বাফার থেকে বেশ কয়েকটি ভার্টেক্স বাফার বাইন্ডিংগুলির মধ্যে একটিতে আবদ্ধ ডেটা আনতে পারে। এই শেষ জন্য আমরা ব্যবহার glVertexArrayAttribBinding(GLuint vao, GLuint attribindex, GLuint bindingindex)। এছাড়াও আমরা glVertexArrayVertexBuffer()একটিটি ভার্টেক্স বাফার বাইন্ডিংয়ের সাথে একটি বাফারে বাঁধতে ফাংশনটি ব্যবহার করি । আমরা glVertexArrayAttribFormat()ডেটাটির লেআউট এবং ফর্ম্যাটটি বর্ণনা করতে ফাংশনটি ব্যবহার করি এবং অবশেষে আমরা কল করে বৈশিষ্ট্যের স্বয়ংক্রিয় ফিলিং সক্ষম করি glEnableVertexAttribArray()

যখন একটি প্রান্তবিন্দু অ্যাট্রিবিউট সক্ষম হলে, যেমন OpenGL প্রান্তবিন্দু বিন্যাস এবং অবস্থানের তথ্য আপনার সাথে প্রদান করেছেন তার উপর ভিত্তি করে shader তথ্য ভোজন হবে glVertexArrayVertexBuffer()এবং glVertexArrayAttribFormat()। বৈশিষ্ট্যটি অক্ষম হয়ে গেলে, ভার্টেক্স শ্যাডারটি আপনি কল দিয়ে যে স্ট্যাটিক তথ্য সরবরাহ করেন তা সরবরাহ করা হবে glVertexAttrib*()

// First, bind a vertex buffer to the VAO
glVertexArrayVertexBuffer(vao, 0, buffer, 0, sizeof(vmath::vec4));

// Now, describe the data to OpenGL, tell it where it is, and turn on automatic
// vertex fetching for the specified attribute
glVertexArrayAttribFormat(vao, 0, 4, GL_FLOAT, GL_FALSE, 0);

glEnableVertexArrayAttrib(vao, 0);

এবং একটি শেডারে কোড

layout (location = 0) in vec4 position;

সর্বোপরি আপনাকে কল করতে হবে glDeleteVertexArrays(1, &vao)


এটিকে আরও ভাল করে বুঝতে আপনি ওপেনজিএল সুপারবাইল পড়তে পারেন ।


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