ওপেনগিএলের ভার্টেক্স অ্যারে অবজেক্টগুলির উদ্দেশ্য কী?


36

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

যদি ভার্টেক্স বাফার অবজেক্টটি ভার্টেক্স ডেটা (যেমন তাদের অবস্থান এবং টেক্সচারের স্থানাঙ্ক) সংরক্ষণ করার জন্য ব্যবহার করা হয় এবং ভিএওগুলিতে কেবল স্থিতির পতাকা থাকে তবে সেগুলি কোথায় ব্যবহার করা যেতে পারে? তাদের উদ্দেশ্য কী?

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

উত্তর:


49

আমি মনে করি আপনি একটি নমুনা দিয়ে তাদের উদ্দেশ্য আরও ভালভাবে বুঝতে পারবেন। মন্তব্যগুলি পড়ে আপনি বুঝতে পারবেন কীভাবে ভিএও ব্যবহার করা হয়।

// BEGIN INITIALIZATION
// Define some vertex data 
struct Vertex {
  GLfloat position[3];
  GLfloat texcoord[2];
};
Vertex vertexdata[NUM_VERTS] = { ... };
GLubyte indexdata[NUM_INDICES] = { 0, 1, 2, ... };

// Create and bind a VAO
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);

// Create and bind a BO for vertex data
GLuint vbuffer;
glGenBuffers(1, &vbuffer);
glBindBuffer(GL_ARRAY_BUFFER, vbuffer);

// copy data into the buffer object
glBufferData(GL_ARRAY_BUFFER, NUM_VERTS * sizeof(Vertex), vertexdata, GL_STATIC_DRAW);

// set up vertex attributes
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, position));
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, texcoord));

// Create and bind a BO for index data
GLuint ibuffer;
glGenBuffers(1, &ibuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibuffer);

// copy data into the buffer object
glBufferData(GL_ELEMENT_ARRAY_BUFFER, NUM_INDICES * sizeof(GLubyte), indexdata, GL_STATIC_DRAW);

// At this point the VAO is set up with two vertex attributes
// referencing the same buffer object, and another buffer object
// as source for index data. We can now unbind the VAO, go do
// something else, and bind it again later when we want to render
// with it.

glBindVertexArray(0);

// END INITIALIZATION

// BEGIN RENDER LOOP

// This is it. Binding the VAO again restores all buffer 
// bindings and attribute settings that were previously set up
glBindVertexArray(vao);
glDrawElements(GL_TRIANGLES, NUM_INDICES, GL_UNSIGNED_BYTE, (void*)0);

// END RENDER LOOP

2
আমি কী GL_DYNAMIC_DRAW বাফার ডেটা দিয়ে এটি করতে পারি? উপস্থাপনা অংশে কি কেবল glBindVertexArray (), glBufferData () এবং তারপরে glDrawE উপাদান () থাকতে পারে?
পিকু

আপনি এই উদাহরণটিতে নরমালদের সাথে কীভাবে আচরণ করবেন? আমি বলতে চাইছি আপনি যদি GLfloat normal[3]আপনার ভার্টেক্স ক্লাসে একটি যোগ করেন এবং ক্লায়েন্টে নরমালগুলি আপলোড করতে চান?
লাইনলো

1

ভিএওগুলি দরকারী, কারণ আপনাকে সর্বদা সমস্ত বৈশিষ্ট্যগুলি সেট আপ করতে হবে না। এটি দ্রুত হওয়া উচিত কেবলমাত্র একটি ভিএও আবদ্ধ করুন তারপরে সমস্ত বৈশিষ্ট্যগুলি সেট করে।


1

এটি আমার প্রিয় লিঙ্ক: http://www.songho.ca/opengl/gl_vertexarray.html

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


6
আপনি যে নিবন্ধটি সংযুক্ত করেছেন সেটিতে ভিএও-র অন্তর্ভুক্ত নেই, কেবল ভার্টেক্স অ্যারেগুলি (যা প্রায় দীর্ঘ সময় ধরে হয়েছে)। আমি নিজেই এই দুজনের মধ্যে নির্দিষ্ট পার্থক্য নিয়ে বিস্মিত হই।
স্টিভেন লু

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

0

লেকচার 9 এখানে http://nccastaff.bournemouth.ac.uk/jmacey/CA1/index.html এর সম্পর্কে কিছু স্টাফ রয়েছে (আমার বাকী নোটগুলি যেমন রয়েছে) এবং আপনি যদি একই সাইটটিতে এনজিএল লাইব্রেরিটি দেখেন তবে একটি শ্রেণি যা একটি ভিএও এর আচরণকে গুটিয়ে রাখে

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