ওপেনজিএল: কোনও ভিবিও নির্দিষ্ট না করেই কি ভিএও ব্যবহার করা সম্ভব?


12

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

আমি এটিতে কোনও ডেমো খুঁজে পেলাম না, তাই আমি ঠিক করে দেখলাম এটি চেষ্টা করে দেখুন। কিন্তু এটি কাজ করে না এবং glDrawArrayকলটিতে ক্র্যাশ হয় । দেখে মনে হচ্ছে ভিবিও আবদ্ধ নয়। আমি যে কোডটি ব্যবহার করছি তা এখানে:

রেন্ডারিং:

/* Prepare vertex attributes */
glBindVertexArrayOES(vao);

/* Upload the buffer to the GPU */
glBindBuffer(GL_ARRAY_BUFFER, pool->next());
glBufferSubData(GL_ARRAY_BUFFER, 0, parts * buffer.stride() * 6, buffer.getBuffer());

/* Draw the triangles */
glDrawArrays(GL_TRIANGLES, 0, parts * 6);

glBindVertexArrayOES(0);

ভিএও সৃষ্টি:

glBindVertexArrayOES(vao);

glEnableVertexAttribArray(ls.position);
glVertexAttribPointer(ls.position, 2, GL_FLOAT, GL_FALSE, buffer.stride(), 0);

glEnableVertexAttribArray(ls.color);
glVertexAttribPointer(ls.color, 3, GL_FLOAT, GL_FALSE, buffer.stride(), GL_BUFFER_OFFSET(buffer.dataTypeSize * 2));

glBindVertexArrayOES(0);

lsএমন একটি সাধারণ যেখানে structবৈশিষ্ট্যগুলির অবস্থানগুলি ধারণ করে।

রেন্ডারিং অংশে, অদলবদল করা glBindBufferএবং glBindVertexArrayOESচারপাশে কোনও কাজ হয়নি।

সুতরাং, প্রশ্নটি হল: এটি করা কি সম্ভব, বা প্রতিটি বাফারের জন্য আমাকে ভিএও তৈরি করতে হবে? এবং যদি আমাকে প্রতিটি ভিবিওর জন্য একটি ভিএও তৈরি করতে হয়, তবে কি glBufferSubDataকোনও ভিএওর সাথে মিলিয়ে ভিবিওর ডেটা আপডেট করা সম্ভব ?

উত্তর:


18

ভিএওগুলিতে 'গ্লাইব্যান্ডবফার' রাষ্ট্র থাকে না, GL_ELEMENT_ARRAY_BUFFERতার বাধ্যতামূলক রাষ্ট্র ব্যতীত। আপনি যা বুঝতে পারছেন না তা হ'ল এটি glBindBuffer(GL_ARRAY_BUFFER) কিছুই করে না । ঠিক আছে, যতক্ষণ রেন্ডারিংয়ের সাথে সম্পর্কিত তাই এটি কিছুই করে না। চেষ্টা করে দেখুন; glDraw * কল করার ঠিক আগে, কল করুন glBindBuffer(GL_ARRAY_BUFFER, 0); আপনার রেন্ডারিং ঠিক কাজ করবে।

পথ glVertexAttribPointerকাজ এটি কি GL_ARRAY_BUFFER আবদ্ধ হয় এ রকম দেখায় সময়ে glVertexAttribPointerবলা হয় । রেন্ডার সময় নয়। না পরে. ঠিক সেই মুহুর্তে। এটি সেখানে যা কিছু বাফার অবজেক্ট ছিল তা গ্রহণ করে এবং ওপেনজিএল রাজ্যের অন্য টুকরোতে সংরক্ষণ করে, যা ভিএও-র মধ্যে আবদ্ধ থাকে।

সাধারণভাবে, আপনার কাছে দুটি বিকল্প রয়েছে, তাদের মধ্যে একটি নতুন এবং সম্ভবত এই সময়ে ব্যবহার করা উচিত নয়।

আপনার প্রথম বিকল্পটি একই বাফার অবজেক্টে একই বস্তু বিন্যাস (যেমন: বাফার অবজেক্ট এবং অফসেট ব্যতীত সমস্ত কিছু) ব্যবহার করে এমন সমস্ত বস্তু স্থাপন করা । মূলত, একটি বিশাল আকারের অ্যারে তৈরি করুন যা একই ফর্ম্যাট ব্যবহার করে এমন সমস্ত অবজেক্টের জন্য সমস্ত শীর্ষবিন্দু রয়েছে।

যখন রেন্ডার করার সময় আসে তখন আপনি শীর্ষে একটি অংশ রেন্ডার করতে পারেন। glDrawArraysরেন্ডার করতে উপাদানগুলির একটি ব্যাপ্তি নেয় এবং আপনি glDrawElementsএকই সূচকগুলি ঠিক করতে পারেন । অন্যথা, আপনি ব্যবহার করতে পারেন glDrawElementsBaseVertexথেকে পক্ষপাত ছেদচিহ্ন , যাতে একটি অফসেট প্রতিটি সূচক যোগ করা হয়। এই অফসেটটি বৃহত্তর অ্যারেতে যেটি ভার্টেক্সের পূর্বে উল্লম্বের সংখ্যা।

অন্য বিকল্পটি হ'ল জিএল ৪.৩-এ যুক্ত হওয়া অপেক্ষাকৃত নতুন ফর্ম্যাট বৈশিষ্ট্য বিভাজন সিস্টেমটি ব্যবহার করা। এটি আপনাকে বিন্যাসটি পুনরায় সেট না করেই বাফারগুলি পরিবর্তন করার অনুমতি দেবে। সুতরাং আপনি একটি একক ভিএও বাঁধবেন, তারপরে প্রয়োজন অনুযায়ী বিভিন্ন বাফারে কেবলমাত্র বিকল্প প্রতিস্থাপন করুন glBindVertexBuffer। এটি ES 3.1 এ উপলব্ধ।


1
এনভি GL4.3 ড্রাইভার এখন সম্পূর্ণ রিলিজ হয়।
ম্যাক্সিমাস মিনিমাস

GlVertexAttribPointer যেভাবে কাজ করে তা ব্যাখ্যা করার জন্য আপনাকে অনেক ধন্যবাদ। এটি আলোকিত ছিল এবং কেন এবং কীভাবে এটি কাজ করে তা ব্যাখ্যা করে।
মার্টিজান আদালত

5

ভিএও glVertexAttribPointer রাজ্যের সঞ্চয় করে। ভিএও পরিবর্তন করা বর্তমান গ্লোবাইন্ডবফারকে প্রভাবিত করে না, বা গ্লোবাইন্ডবফার পরিবর্তন করা ভিএওকে প্রভাবিত করে না। কলটিতে ব্যবহারের জন্য বাফারটি রেকর্ড করে কেবলমাত্র glVertexAttribPointer কলটি ভিএওকে প্রভাবিত করে।

সুতরাং আপনার প্রশ্নের উত্তর না হয়।

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


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

2
@ মার্তিজন কোর্টেউক্স: " ভিএও-র ইন্টারনেটের সমস্ত নিবন্ধগুলি দেখায় যে কোনও ভিএও বাঁধাই স্বয়ংক্রিয়ভাবে ভিবিওকে আবদ্ধ করে। " না, তারা দেয় না। ভার্টেক্স স্পেসিফিকেশনের ওপেনজিএল উইকি এটি করে না। প্রকৃতপক্ষে, আমাকে যে বলছেন যে কোনো ইন্টারনেটে একটি একক নিবন্ধ দেন glBindBufferরাষ্ট্র ব্যতীত GL_ELEMENT_ARRAY_BUFFER একটি vào বাঁধাই দ্বারা পরিবর্তিত হয়।
নিকল বোলাস

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