কোন ওপেনজিএল ভার্টেক্স অ্যারে অবজেক্টে (ভিএও) সংরক্ষণ করা আছে এবং আমি কীভাবে ভিএওকে সঠিকভাবে ব্যবহার করব?


25

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


আমি কীভাবে ভিএও'র ব্যবহার করা উচিত তা অনুমান করি

সহজ উদাহরণ থেকে আমি বুঝতে পেরেছি যে ভিএওর সঠিক ব্যবহার নীচে রয়েছে:

সেটআপ

Generate VAO
BindVAO
---- Specify vertex attributes
---- Generate VBO's
---- BindVBO's
-------- Buffer vertex data in VBO's
---- Unbind VBO's
Unbind VAO

অনুবাদ

Bind VAO
---- Draw
Unbind VAO

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


অতএব, আমার প্রশ্নগুলি হ'ল:

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

1
VAO ভার্টেক্স গুণ বৈশিষ্ট্যের অবস্থানগুলি সম্পর্কে ডেটা সঞ্চয় করে। এটি ভিবিওগুলির আইডিও সঞ্চয় করে যেখানে এই বৈশিষ্ট্যগুলি অন্তর্ভুক্ত রয়েছে। আপনি যখন কিছু আঁকেন তখন আপনার ভিবিওকে আবদ্ধ করার প্রয়োজন হয় না, আপনি ভিএও তৈরি করার সময় glVertexAttribPointer () কল করার আগে আপনাকে এটি আবদ্ধ করতে হবে।
হলিব্ল্যাকট্যাগ

উত্তর:


18

VAO ভার্টেক্স গুণ বৈশিষ্ট্যের অবস্থানগুলি সম্পর্কে ডেটা সঞ্চয় করে। (এবং তাদের সম্পর্কিত আরও কিছু ডেটা))
"VBO bindings, active shader program, texture bindings, texture sampling/wrapping settings, uniforms"এর সাথে সম্পূর্ণ সম্পর্কিত নয়।

আপনি জিজ্ঞাসা করতে পারেন কেন এটি ভিবিও বাধ্যতামূলক মনে রাখে না। যেহেতু আপনাকে কিছু আঁকার জন্য আপনাকে ভিবিওকে আবদ্ধ করার দরকার নেই, আপনি ভিএও তৈরি করার সময় কেবল এটি আবদ্ধ করতে হবে: আপনি যখন কল করবেন তখন glVertexAttribPointer(...)ভিএও মনে রাখবেন ভিবিও বর্তমানে আবদ্ধ কি। আপনি যখন এটি আঁকেন তখন ভিএও এই ভিবিওগুলি থেকে বৈশিষ্ট্য গ্রহণ করবে, যদিও এই ভিবিও বর্তমানে আবদ্ধ নয়।


এছাড়াও, ভিএও এবং ভিবিওগুলিকে কিছুটা আলাদাভাবে ব্যবহার করা উচিত:

এটি কাজ করবে না

Generate VAO
BindVAO
---- Specify vertex attributes
---- Generate VBO's
---- BindVBO's
-------- Buffer vertex data in VBO's
---- Unbind VBO's
Unbind VAO

কারণ আপনাকে অ্যাট্রিবিউটের অবস্থানগুলি নির্দিষ্ট করতে ভিবিওকে আবদ্ধ করতে হবে।

সুতরাং, আপনার এটি করা উচিত:

Generate VAO
BindVAO
Generate VBO's
BindVBO's
Specify vertex attributes

আপনি যখনই চান ভিবিওর ডেটা পরিবর্তন করতে পারেন তবে আপনাকে অবশ্যই এটি আগে আবদ্ধ করতে হবে।

এবং অঙ্কনটি দেখতে এইরকম হওয়া উচিত:

Bind VAO
Draw


আপনি লক্ষ্য করতে পারেন, আমি unbindআপনার তালিকা থেকে কল সরিয়েছি । এগুলি প্রায় সম্পূর্ণ অকেজো এবং তারা আপনার প্রোগ্রামটি কিছুটা কমিয়ে দেবে, তাই আমি তাদের কল করার কোনও কারণ দেখতে পাচ্ছি না।


9
"তাই আমি তাদের কল করার কোনও কারণ দেখতে পাচ্ছি না।" দুর্ঘটনাক্রমে তাদের পরিবর্তন রোধ করতে। বিশেষত তৃতীয় পক্ষের গ্রন্থাগারগুলি ব্যবহার করার সময় একটি সমস্যা।
ratchet freak

মহান উত্তরের জন্য আপনাকে ধন্যবাদ! সুতরাং সংক্ষেপে, ভিএও কেবল ভার্টেক্স অ্যাট্রিবিউটের অবস্থানগুলি সঞ্চয় করে। ভিএও-কে বাধ্যতামূলক করার সময় VBO এর পুনঃসুত্থান হয় না, কারণ VAO কী বৈশিষ্ট্যগুলি সন্ধান করতে পারে তা জানে other অন্য সমস্ত রাজ্য গ্লোবাল ওপেনগেল রাজ্যে অন্তর্ভুক্ত রয়েছে।
জেলি ভ্যান ক্যাম্পেন

@ জেল্ল্যাভান ক্যাম্পেন ইয়েপ, সঠিক এফওয়াইআই, এটি বৈশিষ্ট্যগুলি ( gl{Enable|Disable}VertexAttribArray()), তাদের ডিফল্ট মান ( glVertexAttrib*()), তাদের ইনস্ট্যান্সিং মোড ( glVertexAttribDivisor()) এবং সম্ভবত অন্য কোনও কিছুর উপরে / স্টোর করে ।
হলিব্ল্যাকটিজ

@ হোলিব্ল্যাকগ্যাট আপনি কি নিশ্চিত যে ডিফল্ট রাষ্ট্র (glVertexAttrib ()) ভিএও রাজ্যের অংশ? ওপেনজিএল উইকি অন্যথায় দাবি করে যে তারা প্রসঙ্গের রাজ্য।
rdb

@ এনডিবি না, আমি নিশ্চিত নই আমি তাদের VAO রাজ্যের অংশ হিসাবে প্রত্যাশা করেছি এবং আমি এটি পরীক্ষা করে দেখিনি।
হলিব্ল্যাকগেট

4

এটি কেবল ভার্টেক্স বাইন্ডিং এবং সূচক বাফার বাঁধাই সঞ্চয় করে

glVertexAttribPointerকল করার সময় Vertex_Array_buffer এ আবদ্ধ প্লাসের বাফারগুলির সমস্ত পরামিতি glVertexAttribPointerএবং সীমাবদ্ধ এলিমেন্ট_আরে_বফার।

ইউনিফর্মগুলি বর্তমান প্রোগ্রামের অংশ।

অন্য সব কিছুই গ্লোবাল স্টেট।

সন্দেহের সাথে আপনি যে সংস্করণটি ব্যবহার করছেন সেটির বৈশিষ্ট্যে আপনি রাষ্ট্রের টেবিলগুলি পরীক্ষা করতে পারেন।


উত্তরের জন্যও ধন্যবাদ! এটি আমার জন্য বিষয়গুলি পরিষ্কার করে দেয়।
জেলি ভ্যান ক্যাম্পেন

4

এখানে একটি সহজ তবে কার্যকর ব্যাখ্যা রয়েছে, মূলত একটি বাফার অবজেক্টের এমন তথ্য রয়েছে যা কেবলমাত্র কাঁচা ডেটার বিট হিসাবে ব্যাখ্যা করা যায়, যার নিজস্ব অর্থ কিছুই হয় না, তাই এটি নির্ভুলভাবে ডেটা যা কোনওভাবেই সত্যই দেখা যায়

i.e float vbo[]={1.0,2.0,34.0...}

ওপেনজিএল যেভাবে কাজ করার জন্য ডিজাইন করা হয়েছিল তা হ'ল আপনাকে অবশ্যই নির্ধারণ করতে হবে যে বিভিন্ন শেডারে আপনার পাসিং ডেটারটি শেডারগুলির মতো দেখতে কেমন হবে

এতে আপনাকে এটিও নির্ধারণ করতে হবে যে এটি কীভাবে ডেটা পড়বে, এটি কোন ফর্ম্যাটে রয়েছে এবং এর সাথে কী করবে এবং এটি কীভাবে ব্যবহৃত হবে এবং কীসের জন্য এই সমস্ত তথ্য ভিএওতে সঞ্চিত রয়েছে

উদাহরণস্বরূপ আপনি এমন ডেটা ঘোষণা করতে পারেন যা এই জাতীয় অ্যারেতে সঞ্চিত থাকে float vbo = {11.0,2.0,3.0,4.0}

এই মুহুর্তে পরবর্তী কী প্রয়োজন তা হ'ল ভিএও-র ভিবিও থেকে প্রাপ্ত ডেটা কীভাবে ব্যাখ্যা করা যায় এবং এর অর্থ কী নীচে দেওয়া হয়

ভিএও-তে ভার্টেক্সে 2 টি ফ্লোট পড়ার জন্য সেট করা যেতে পারে (এটি এটি দুটি মাত্রা x, y দিয়ে 2 ভেক্টর তৈরি করবে) বা আপনি ভায়োকে 4 টি মাত্রা অর্থাত x, y, z, w ইত্যাদি সহ 1 ভেক্টর হিসাবে এটি ব্যাখ্যা করতে বলতে পারেন

তবে সেই ডেটার অন্যান্য বৈশিষ্ট্যগুলিও ভিএওতে যেমন ডেটা ফর্ম্যাট হিসাবে সংজ্ঞায়িত করা হয় এবং সংরক্ষণ করা হয় (তবুও আপনি ভাসমানের একটি অ্যারে ঘোষণা করেছিলেন আপনি শেডারকে এটি একটি পূর্ণসংখ্যা হিসাবে পড়তে বলতে পারেন, অবশ্যই সিস্টেমটি কাঁচা ডেটা রূপান্তরিত করে প্রক্রিয়াটি ভাসমান থেকে পূর্ণসংখ্যায় চলে আসে এবং এ জাতীয় পরিস্থিতিতে কী করা উচিত তার নিজস্ব নিয়ম রয়েছে has

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

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

আপনি যা করতে পারেন তা হ'ল আপনি একটি বাফার অবজেক্টটি ভিএও 1 তে আবদ্ধ করতে পারেন এবং একইভাবে আলাদা আলাদাভাবে ব্যাখ্যা করার সাথে একই বাফার অবজেক্টটি ভিএও 2-তে আবদ্ধ করতে পারেন যাতে আপনার শেডার যদি ডেটা প্রক্রিয়াকরণ করতে পারে তবে কোন ভিএওর উপর নির্ভর করে বাউন্ড এটি একই কাঁচা ডেটা ফ্রেমব্ফার (উইন্ডোতে পিক্সেল অঙ্কন) থেকে আলাদাভাবে প্রক্রিয়া করবে যার ফলস্বরূপ একই ডেটার বিভিন্ন প্রদর্শন প্রদর্শিত হবে যা আপনি ভিএওতে এর ব্যবহারটি কীভাবে সংজ্ঞায়িত করেছেন তার উপর ভিত্তি করে তৈরি হবে


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