#DrawArrays এবং glDrawE উপাদান এর মধ্যে পার্থক্য


12

OpenGL ES আমার মন রিফ্রেশ করার সময়, আমি জুড়ে এসেছিল glDrawArraysএবংglDrawElements

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

আমি যা বুঝতে পারি না তা হ'ল, আমি কীভাবে glDrawElementsড্র কলগুলি সংরক্ষণ করতে পারি তা দেখতে ব্যর্থ হয়েছি (কল কল সংরক্ষণ করে) করা একটি বিবরণ যা আমি পড়েছি বেশিরভাগ বই দ্বারা উল্লেখ করা হয়েছে, সুতরাং এখানে এটির উল্লেখ করছি)।

একটি সাধারণ দৃশ্যের কল্পনা করুন যাতে আমি 2 টি ত্রিভুজ ব্যবহার করে একটি বর্গ আঁকতে চেষ্টা করেছি।

ব্যবহার করার glDrawArraysসময় আমার কাছে 6 টি উল্লম্বের একটি সেট থাকা দরকারglDrawElements দরকার, আমার সূচক অ্যারে ছাড়াও 4 টি উপাদান থাকা দরকার 4

উপরেরটি দেওয়া, এখানে আমি বুঝতে পারি না:

  1. glDrawElements4 টি উপাদান (6 বার) রয়েছে এমন আমার ভার্টেক্স অ্যারেটিতে সূচীকরণের জন্য সূচকের অ্যারে (6 সূচক, একটি বর্গক্ষেত্রের ক্ষেত্রে) ব্যবহারের প্রয়োজন থাকলে, কলগুলি কীভাবে সংরক্ষণ করতে পারবেন? অন্য শব্দ, এর অর্থ কি?glDrawElements কি এখনও মোট 6 ড্র কল ঠিক একই রকম হওয়া দরকার glDrawArrays?
  2. কিভাবে ব্যবহার করবে glDrawElementsস্থান বাঁচাতে করতে হবে, যদি কারও এখনও 2 টি অ্যারে প্রয়োজন হয়, যেমন একটি শীর্ষে এবং সূচকগুলির জন্য একটি?
  3. 2 ত্রিভুজ থেকে স্কোয়ার আঁকার ক্ষেত্রে, সরলতার জন্য , পৃথকভাবে কতগুলি কল কল করতে পারে glDrawElements(ভার্টেক্স অ্যারেতে 4 আইটেম এবং সূচক অ্যারে glDrawArrays6 টি আইটেম ) এবং (কেবল ভার্টেক্স অ্যারে 6 আইটেম) প্রয়োজন?

ধন্যবাদ।

উত্তর:


16

প্রতিটি glDraw * একটি ড্র কল।

1 glDrawArrays 1 ড্র কল draw
1 glDrawE উপাদান 1 টি কল কল।

এটি কোনও বিষয় নয় (যতক্ষণ না ড্র কলের গণনার সাথে সম্পর্কিত) আপনি কতটি শীর্ষে বা সূচকগুলি ব্যবহার করেন, 1 টি গ্লাড্রু * 1 ড্র কল।

কোয়াড আঁকার সাধারণ কেস (আপনি যে জিএল সংস্করণটি ব্যবহার করেন তা কোয়াড সরিয়ে নিল না) বা ত্রিভুজগুলি তুলনা করার জন্য ভাল উদাহরণ নয়, কারণ কোয়াডের একটি তালিকা বা ত্রিভুজগুলির একটি তালিকা একক কল দিয়ে আঁকতে পারে, এবং glDrawArrays আরও কার্যকর প্রদর্শিত হবে কারণ এতে সূচকের অতিরিক্ত ওভারহেড নেই।

আসুন আমরা আরও কিছুটা জটিল কেস নিই, তবে এটি একটি আরও বাস্তব-বিশ্বের দৃশ্যের প্রতিনিধিত্বকারী। কল্পনা করুন যে আপনার একাধিক ত্রিভুজ স্ট্রিপ এবং অনুরাগীর সমন্বয়ে একটি মডেল রয়েছে:

glDrawArrays (GL_TRIANGLE_FAN, .....);
glDrawArrays (GL_TRIANGLE_STRIP, .....);
glDrawArrays (GL_TRIANGLE_STRIP, .....);
glDrawArrays (GL_TRIANGLE_FAN, .....);
glDrawArrays (GL_TRIANGLE_STRIP, .....);
glDrawArrays (GL_TRIANGLE_FAN, .....);

এই উদাহরণে, glDrawArrays ব্যবহার করে আপনাকে মডেলটির জন্য মোট 6 ড্র কল দেয়। যাইহোক, উভয় স্ট্রিপ এবং অনুরাগীই সহজেই সূচকযুক্ত ত্রিভুজগুলিতে রূপান্তর করতে পারে, তাই সূচকগুলি যুক্ত করুন এবং এটি হয়ে যায়:

glDrawElements (GL_TRIANGLES, .....);

পুরো মডেলের জন্য এটি একটি ড্র কল।


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

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

  • ভার্টেক্স পুনঃব্যবহার। এটি কেবল মেমরি-সঞ্চয়ের চেয়ে অনেক বেশি। আপনার জিপিইউতে সম্ভবত একটি হার্ডওয়্যার ভার্টেক্স ক্যাশে রয়েছে, যেখানে সম্প্রতি রূপান্তরিত উল্লম্বগুলি সংরক্ষণ করা যেতে পারে; যদি একই ভার্টেক্স আবার ফিরে আসে এবং যদি এটি ক্যাশে থাকে তবে এটি আবার রূপান্তরিত করার পরিবর্তে ক্যাশে থেকে পুনরায় ব্যবহার করা যেতে পারে। আপনার হার্ডওয়্যার সূচকগুলি তুলনা করে ক্যাশেটি পরীক্ষা করবে, সুতরাং ওপেনগিএল পদে আপনি ক্যাশেটি ব্যবহার করার একমাত্র উপায় হ'ল glDrawE উপাদান ব্যবহার করুন।


সুতরাং আপনার নির্দিষ্ট প্রশ্নের উত্তর দিতে:

  1. কিভাবে glDrawE উপাদান ড্র কল কল সংরক্ষণ করতে পারে ...? উদাহরণস্বরূপ আপনি ব্যবহার করেন, এটি হয় না। প্রত্যেকের একটি করে ড্র কল রয়েছে। আমি উপরে আলোচনা হিসাবে, এই উদাহরণ দুটি তুলনা করার জন্য খুব খারাপ একটি।

  2. কীভাবে glDrawE উপাদান ব্যবহার করে স্থান বাঁচাবে ...? সূচকগুলি উল্লম্বের চেয়ে ছোট are একটি 16-বিট সূচক দুটি বাইট, একটি অবস্থান / রঙ / টেক্সকর্ড ভার্টেক্স 24 বাইট। Vert টি উল্লম্বটি 144 বাইট, 4 টি শীর্ষ এবং আরও 6 সূচকগুলি 108 বাইট।

  3. 2 ত্রিভুজ থেকে স্কোয়ার আঁকার ক্ষেত্রে ...? এক এবং এক. একটি glDraw * কলটি একটি ড্র কল, ব্যবহৃত পরিমাপের বা সূচকগুলির সংখ্যা এই পরিমাপের জন্য অপ্রাসঙ্গিক। তবে আমাকে অবশ্যই পুনরায় জোর দিতে হবে, এটি দুটি তুলনার জন্য খুব খারাপ উদাহরণ।


অবশেষে, এবং কেবল বিষয়গুলি কিছুটা জটিল করার জন্য, যখন ত্রিভুজগুলির সাথে glDrawE উপাদানগুলি ডেস্কটপ জিপিইউগুলির সর্বোত্তম পথ, মোবাইলে এটি খুব আলাদা হতে পারে। কিছু মোবাইল জিপিইউ জিএল_আরআইআরএলজি_আরসিপি'র সাথে গ্লোড্রআরাইগুলি পছন্দ করতে পারে (আপনি এই ক্ষেত্রে আদিমকে একত্রে অবনমিত ত্রিভুজগুলি যুক্ত করবেন), এবং আমি এমনকি আদিম পুনঃসূচনা বা মাল্টি-ড্রয়ের মতো আরও উন্নত বিষয়েও স্পর্শ করতে পারি নি।


আপনার মতামতের জন্য অনেক ধন্যবাদ; আপনি যা ভাগ করেছেন তা আমি কেবল একটু সময় নিচ্ছি। শুধু আপনাকে জানাতে চেয়েছিলাম আমি আপনার প্রতিক্রিয়া স্বীকার করেছি। আবার ধন্যবাদ.
আনহেলিগ

আপনার 6 ড্রআউটরিঙ্গেলফ্যানস এবং ড্র ট্রাইঙ্গেল স্ট্রিপস কলগুলিকে 1 একক ড্রআত্রিয়াংলস কলগুলিতে রূপান্তর করার উদাহরণে। এটি কি কিছু কর্মক্ষমতা উন্নত করে? আমার বোঝার জন্য 100 টি ত্রিভুজ সমন্বিত একটি ত্রিভুজ স্ট্রিপ অঙ্কন করা পৃথকভাবে 100 ত্রিভুজ আঁকার চেয়ে অনেক বেশি দক্ষ এবং সুবিধাটি সহজেই 1 এর পরিবর্তে 6 ফাংশন কল ব্যবহার করে যে কোনও জরিমানা ঘটবে তা অফসেট করে দেবে
স্যামুয়েল লি

@ সামুয়েললি 6-থেকে -1 কোনও বিশাল উন্নতি হবে না, এটি কেবল নীতিটি বর্ণনা করার উদ্দেশ্যে। এছাড়াও, এবং যেমনটি আমি ইঙ্গিত করেছি, স্ট্রিপগুলি সাধারণত 1998-পরবর্তী ডেস্কটপ হার্ডওয়্যারে সূচিযুক্ত তালিকার চেয়ে পারফরম্যান্সের জয় নয়। স্ট্রিপগুলি ব্যবহার করার পরামর্শ দিয়ে যে কোনও নথিতে তারিখটি পরীক্ষা করে দেখুন।
ম্যাক্সিমাস মিনিমাস

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