বাফার আনবাইন্ড করা উচিত?


12

আমি ওপেনজিএল ইএস 2 দিয়ে কিছু পরীক্ষা নিচ্ছি এবং কিছু প্রশ্ন পেয়েছি, আমার বর্তমান প্রোগ্রামটি এরকম:

Init
-------
-> create index buffer
-> fill index buffer glBufferData 
-> create vertex buffer
-> fill vertex buffer glBufferData 

Draw
-------
 1. Apply vertex buffer

    -> Bind VAO
       -> bind vertex buffer
          - enable attributs (glVertexPointer, …)
       -> unbind vertex buffer
    -> Unbind VAO
    -> Bind VAO

 3. Apply index buffer
 4. Draw

সমস্যাটি

প্রদত্ত কোড ক্র্যাশ, কিছু গবেষণার পরে, আমি বুঝতে পেরেছি কেন: আমাকে আমার সূচক বাফারটি ডিআইপি অংশে ("ফিল্ড ইনডেক্স বাফার গ্লাফারডাটা" পরে) আবদ্ধ করতে হবে বা প্রথম "বাইন্ড ভিএও" এর আগে এটি আবদ্ধ করতে হবে

আমার প্রশ্নগুলি হ'ল:

  • আমি কী আমার সূচক বাফারটি ভিএওতে (ভিএও স্টক সূচক বাফার?) রাখতে পারি?
  • প্রতিটি আপডেটের পরে আমার কি বাফারগুলি আনবাইন্ড করতে হবে (glBufferData)?

আমার অ্যাপ্লিকেশনটিতে আমি কিছু বাফার পেয়েছি যারা প্রতিটি ফ্রেমে আপডেট হয় (উদাহরণ: কণা) সুতরাং আমি এর মতো একটি ওপেনএল স্ট্যাক পেয়েছি:

-> bind buffer 1
-> update buffer 1
-> close buffer 1
-> bind buffer 1
-> draw

প্রথম 3 লাইন ভার্টেক্স বাফার আপডেট করে, দুটি শেষ আঁকানো বস্তু, এটি এমন কিছু হওয়া উচিত:

-> bind buffer 1
-> update buffer 1
-> draw

ধন্যবাদ

উত্তর:


12

আপনি অপ্রয়োজনীয় বাঁধাই / আনবাইন্ডিংয়ের জন্য অনেক কিছু করছেন বলে মনে হচ্ছে। আপনি যদি কোনও ভিএও ব্যবহার করছেন, তবে আপনি যখন সেট আপ করবেন এবং জ্যামিতি আঁকবেন তখন কেবলমাত্র ভিএও-র সাথে আবদ্ধ হওয়া উচিত। আপনি কেবলমাত্র VBO / IBO কে আবদ্ধ করুন যখন আপনার আপডেট করার দরকার পড়ে।

কোনও বাফার অঙ্কন বা আপডেট করার পরে, আপনাকে অবশ্যই এটি আবদ্ধ করতে হবে না, যদিও আবদ্ধ থাকা বাফারগুলিতে দুর্ঘটনাক্রমে লেখা এড়াতে এটি করা ভাল ধারণা হতে পারে।

এখন আপনার মুখ্য ক্রিয়াকলাপটি গ্রহণ করা, এটি সামগ্রিক অর্ডার যা আমি আশা করব:

ডিআইএম অন:

  1. একটি ভিএও তৈরি এবং বাঁধাই করুন। আপনি যে অনুক্রমের সাথে বাঁধেন এমন কোনও ভিবিও এবং আইবিও বর্তমান ভিএওর (এটির) সাথে যুক্ত হবে।

  2. সূচী বাফার তৈরি এবং বাঁধাই করুন।

    • সূচক বাফারটি পূরণ করুন glBufferData/glMapBuffer
  3. ভার্টেক্স বাফার তৈরি এবং বাঁধাই করুন।

    • ভেরিটেক্স বাফার পূরণ করুন glBufferData/glMapBuffer
  4. glEnableVertexAttribArray/glVertexAttribPointerইত্যাদি সহ ভার্টেক্স গুণাবলী সেট আপ করুন etc.

  5. বাফার এবং ভিএওর দুর্ঘটনাজনিত পরিবর্তন এড়াতে বৈকল্পিকভাবে সমস্ত কিছু বাঁধুন। VAO কে প্রথমে আনবাইন্ড করতে ভুলবেন না । উদাহরণ:glBindVertexArray(0);

ড্র করার সময়:

  1. যদি কেবল বাফারগুলি আঁকেন :

    • ভিএও বাঁধুন;
    • ড্র কল (গুলি) সম্পাদন করুন।
  2. আপডেট এবং অঙ্কন :

    • ভিএও, ভিবিও, আইবিওকে আবদ্ধ করুন;
    • বাফারগুলি আপডেট করুন (ভার্টেক্স অ্যাট্রিবিটগুলি আপডেট করা কেবলমাত্র ভার্টেক্সের ফর্ম্যাট পরিবর্তিত হলে প্রয়োজনীয়);
    • ড্র কল (গুলি) সম্পাদন করুন।
  3. বাফার এবং ভিএওর দুর্ঘটনাজনিত পরিবর্তন এড়াতে Oচ্ছিকভাবে আনবাইন্ড করুন।

এটি যে হিসাবে সহজ। এই ক্রমের ক্রমটি সমস্যা ছাড়াই কাজ করা উচিত।


2
আমি যুক্ত করতে চাই আমার বাস্তব পরীক্ষাগুলি (২০১৪) সহ (জিপিইউতে বাধা না দেওয়ার মতো সহজ ছায়াময়) আমি যথাযথ অর্ডার দেওয়ার পরে ভিএও ব্যবহার করে পারফরম্যান্সের উন্নতিগুলি তুচ্ছ (2% সিপিইউ সঞ্চয়) পেয়েছি found ধারাবাহিক রেন্ডার কলগুলিতে একই ভিবিও ব্যবহার করার সময় সম্পূর্ণরূপে ভিবিও সেটআপ এড়ানোর জন্য রেন্ডার কলগুলি প্রয়োগ করা হয়েছিল (10 থেকে 33% সিপিইউ সঞ্চয়), এবং আমি ভিএও-র সাথে কয়েকটি ড্রাইভারের বাগ আঘাত করেছি যাতে আমি তাদের ডিফল্টরূপে বন্ধ করে দিয়েছি। জটিল ছায়া গো, এমএসএএ ইত্যাদি ব্যবহার করার সময় এটি আরও কম তাৎপর্যপূর্ণ ছিল যা জিপিইউতে বাধা দেয় এমনকি সিপিইউ এমনকি মোবাইলে অপেক্ষা করছিল।
স্টিফেন হকেনহুল

2
নোট করুন যে হার্ডওয়্যার দ্বারা সমর্থিত নয় এমনভাবে ভার্টেক্স তথ্যটি জিপিইউ ড্রাইভারদের প্রতিটি সেটআপে ভিবিও ডেটা পুনরায় অর্ডার করতে বাধ্য করবে যখন কোনও কিছু পরিবর্তন না হওয়া পর্যন্ত চালকরা একবার ভিএও-র সাথে পুনরায় অর্ডার করতে পারবেন। যাই হোক না কেন প্রান্তিক ডেটা সারিবদ্ধ করার জন্য সর্বোত্তম।
স্টিফেন হকেনহুল

1
কেন সব কিছু আগে VAO আবদ্ধ করা আবশ্যক?
ড্যানিয়েল সাফারি

@ ড্যানিয়েল সাফারি, আপনি কি সেটআপের পরে? আপনি যদি প্রথমে কোনও বাফারকে আনবাইন্ড করতে চান (বাফার 0 / নালকে বাঁধাই করা), এটি বর্তমান ভিএওতে এই বাঁধাই পয়েন্টটি সাফ করবে। এজন্য নাল ভিএও প্রথমে সেট করা উচিত।
গ্ল্যাম্পার্ট

@ গ্ল্যাম্পার্ট - না, বাঁধাই কীভাবে কাজ করে না; glVertexAttribPointer বলা হয়ে বাফার বাইন্ডিং ব্যবহৃত হয়, অন্যথায় নয় (ব্যতিক্রম: GL_ELEMENT_ARRAY_BUFFER)। আপনার glVertexAttribPointer কলের পরে বাফার বাঁধাইয়ের কোনও প্রভাব নেই।
ম্যাক্সিমাস মিনিমাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.