টিউটোরিয়ালগুলি ওপেনজিএল রেন্ডারিংয়ের জন্য কেন বিভিন্ন পন্থা ব্যবহার করে?


43

http://www.sdltutorials.com/sdl-opengl-tutorial-basics

http://www.opengl-tutorial.org/beginners-tutorials/tutorial-2-the-first-triangle/

এই দুটি টিউটোরিয়াল প্রায় একই ফলাফল পেতে সম্পূর্ণ ভিন্ন পন্থা ব্যবহার করে। প্রথমটি পছন্দ মতো জিনিস ব্যবহার করে glBegin(GL_QUADS)। দ্বিতীয়টি vertexBufferObjectsGLEW এর উপর ভিত্তি করে শেডারের মতো স্টাফ ব্যবহার করে। তবে ফলাফলটি একই: আপনি বেসিক আকারগুলি পান।

কেন এই পার্থক্য বিদ্যমান?

প্রথম পদ্ধতির বোঝা অনেক সহজ বলে মনে হচ্ছে। জটিল দ্বিতীয় পদ্ধতির সুবিধা কী?


4
বিড়ালের চামড়ার একমাত্র উপায় কখনও নেই।
ফিলিপ

4
@ ফিলিপ হ্যাঁ, তবে সঠিক উপায় এবং ভুল উপায়, পুরানো উপায় এবং নতুন উপায় রয়েছে (এবং নীচের উত্তরগুলি যেমন দেখায় যে পুরানো এবং নতুন উপায়গুলি সমস্ত পরিস্থিতিতে সামঞ্জস্যপূর্ণ হতে পারে না)
অ্যান্ড্রু হিল

3
আছে কোন সত্য পথকে ও ভুল উপায়ে শুধুমাত্র খারাপ উপায়ে এবং ভাল উপায় (বিভিন্ন মাত্রার মধ্যে)।
ব্যবহারকারী 253751

glBeginএবং glEndঅবজ্ঞাত করা হয়েছে কারণ তারা বর্তমান গ্রাফিক্স আর্কিটেকচারের জন্য অত্যন্ত অদক্ষ
অ্যালেক্স

উত্তর:


77

ওপেনএল-এর চারটি আলাদা আলাদা সংস্করণ রয়েছে, মোবাইল ডিভাইস এবং এম্বেড থাকা সিস্টেমগুলির জন্য সংস্করণ গণনা না করে (ওপেনজিএল | ইএস) এবং জাভাস্ক্রিপ্ট (ওয়েবজিএল) এর মাধ্যমে ওয়েব। ডাইরেক্ট 3 ডি 11 যেমন ডাইরেক্ট 3 ডি 8 এর চেয়ে আলাদা আলাদা আলাদা পদ্ধতি করে থাকে, তেমনি ওপেনজিএল 3-এও ওপেনজিএল 1 এর চেয়ে আলাদা আলাদা জিনিস রয়েছে। বড় পার্থক্যটি হ'ল ওপেনজিএল সংস্করণগুলি বেশিরভাগ পুরানো সংস্করণগুলিতে কেবল অ্যাড-অন (তবে নয়) সম্পূর্ণরূপে)।

ওপেনজিএলের বিভিন্ন সংস্করণ এবং সংস্করণগুলির শীর্ষে, মূল ওপেনজিএল প্রোফাইলগুলির ধারণাটিও যুক্ত করেছে। যথা: সামঞ্জস্যতা প্রোফাইল (যা পুরানো সংস্করণগুলি থেকে APIs জন্য সমর্থন সক্ষম করে) এবং কোর প্রোফাইল (যা সেই পুরানো API গুলি অক্ষম করে)। ভালো জিনিস glBeginকেবল কাজ করে না যখন আপনি কোর প্রোফাইল ব্যবহার করতে পারে তবে আপনি উপযুক্ততা প্রোফাইল ব্যবহার করবে যখন (যা ডিফল্ট)।

আরও একটি বড় জটিলতা হিসাবে, আপনি যখন কোর প্রোফাইল ব্যবহার করছেন তখন ওপেনজিএলের কিছু বাস্তবায়ন (অন্যদের মধ্যে অ্যাপলের মতো) কেবল নতুন ওপেনজিএল বৈশিষ্ট্যগুলিকে সক্ষম করবে। এর অর্থ হল যে নতুন এপিআইগুলি ব্যবহার করতে আপনাকে অবশ্যই পুরানো API গুলি ব্যবহার বন্ধ করতে হবে

তারপরে আপনি টিউটোরিয়ালগুলির জন্য বেশ কয়েকটি বিভ্রান্তিকর দৃশ্যের সাথে শেষ করেন:

  1. টিউটোরিয়ালটি পুরানো এবং কেবল অবহিত API গুলি ব্যবহার করে।
  2. টিউটোরিয়ালটি নতুন এবং ভাল-লিখিত এবং কেবল কোর-সামঞ্জস্যপূর্ণ এপিআই ব্যবহার করে।
  3. টিউটোরিয়ালটি নতুন তবে এটি ধরে নিতে ভুল করেছেন যে আপনি কোনও ড্রাইভারের সাথে কাজ করছেন যা সমস্ত এপিআইগুলিকে সামঞ্জস্যতা মোডে সক্ষম করে এবং নতুন এবং পুরাতন উভয় এপিআইকে অবাধে মিশিয়ে দেয়।
  4. টিউটোরিয়ালটি ওপেনজিএল | ইএস এর মতো ওপেনলএল এর আলাদা সংস্করণের জন্য যা কোনও সংস্করণে পুরানো কোনও এপিআইকে সমর্থন করে না।

এর মতো বিষয়গুলি এমন glBeginকিছু অংশ যা কখনও কখনও তাত্ক্ষণিক মোড এপিআই বলে। এটি অত্যন্ত বিভ্রান্তিকর কারণ ওপেনজিএলে ধরে রাখা মোড এবং "তাত্ক্ষণিক মোড" এর গ্রাফিক্সে ইতিমধ্যে আলাদা সংজ্ঞা ছিল বলে কোনও জিনিস নেই। ওপেনজিএল ২.১ এর পর থেকে তারা অপ্রচলিত হওয়ায় ওপেনজিএল ১.x এপিআই হিসাবে উল্লেখ করা আরও ভাল।

ওপেনএলএল এর 1.x এপিআই পুরানো দিনগুলিতে গ্রাফিক্স পাইপলাইনে তত্ক্ষণাত্ শীর্ষকোষ জমা দেবে। এটি ভালভাবে কাজ করেছিল যখন সিটিইউসটি ভার্টেক্স তথ্য উত্পন্ন করার জন্য সিপিইউর গতির সাথে মোটামুটিভাবে সরবরাহ করে এমন হার্ডওয়্যারটির গতি মোটামুটি ছিল। ওপেনজিএল পিছনে তখন ঠিক ত্রিভুজ রাস্টারাইজেশনটি অফলোড করেছে এবং অন্যটি নয়।

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

সমস্ত জিএল ড্রাইভারকে অবশ্যই glBeginঅভ্যন্তরীণভাবে একটি ভার্টেক্স বাফার বরাদ্দ করে, glVertexএই বাফারের সাথে জমা দেওয়া শীর্ষকোষগুলি রেখে , এবং তারপরে ডাকার পরে সেই পুরো বাফারটি একক ড্র কলটিতে জমা দিতে হবে glEnd। এই ফাংশনগুলির ওভারহেড এর চেয়ে অনেক বেশি যদি আপনি নিজের উপরের ভার্টেক্স বাফারটি আপডেট করেন তবে কিছু ডকুমেন্টেশন (খুব ভুলভাবে!) "ভার্টিমাইজেশন" হিসাবে ভার্টেক্স বাফারগুলিকে উল্লেখ করবে (এটি কোনও অপ্টিমাইজেশন নয়; এটি আসলে একমাত্র উপায় জিপিইউতে কথা বলুন)।

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

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

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

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

আপনি যে ডকুমেন্টেশনটি সন্ধান করছেন তা এমনকি ওপেনগিএলের জন্য নাও হতে পারে তবে অন্যান্য অনুরূপ এপিআইয়ের একটিতেও হতে পারে। ওপেনজিএল | ইএস 1.x এর ফিক্স-ফাংশন রেন্ডারিং ছিল তবে ভার্টেক্স জমা দেওয়ার জন্য ওপেনজিএল 1.x এপিআই নেই। ওপেনজিএল | ইএস 2.x + এবং ওয়েবজিএল 1+ এর কোনও স্থির-ফাংশন বৈশিষ্ট্য নেই এবং। APIগুলির জন্য কোনও পশ্চাদগামী সামঞ্জস্যতা মোড নেই।

এই এপিআইগুলি মূল ওপেনগিএলের সাথে খুব মিল দেখায়; এগুলি বেশ সামঞ্জস্যপূর্ণ নয়, তবে ওপেনজিএলে অফিসিয়াল এক্সটেনশন রয়েছে যা কিছু (সমস্ত নয়) ড্রাইভার ওপেনজিএল | ইএস (যা ওয়েবজিএল ভিত্তিক) এর সাথে সামঞ্জস্যপূর্ণ হওয়ার জন্য সমর্থন করে। কারণ বিষয়গুলি আগে যথেষ্ট বিভ্রান্তিকর ছিল না।


4
+1 চমত্কার উত্তর! আপনি যদি নতুন ওপেনগিএলে সরল রেন্ডারিংয়ের জন্য সেই কয়েকটি অফিশিয়াল লাইব্রেরি এবং সরঞ্জামগুলির একটি উল্লেখ করতে পারেন তবে দুর্দান্ত হবে :)
মেহেরদাবাদ

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

আমি ওপেনগ্লিউটিউটোরিয়াল.আর লেখক এবং আমি শানের সাথে একমত হই। মূলত পারফরম্যান্সের কারণে এপিআই এইভাবে বিকশিত হয়েছিল।
Calvin1602

বিষয় সম্পর্কে খুব ভাল তথ্য ..
রেইনমার

1
@ মেহরদাদ: আমি আমার মাথার উপরের অংশের কোনও কথা মনে করি না; এসডিএল 2 বা এসএফএমএলের মতো লাইব্রেরি রয়েছে যা সরলিকৃত 2 ডি রেন্ডারিং, বিভিন্ন দৃশ্যের গ্রাফ লাইব্রেরি, সি # এর জন্য মনোগেম ইত্যাদি যুক্ত করে, তবে আমি সরাসরি টিকের সাথে সরাসরি সমতুল্য কিছু সম্পর্কে অবগত নই যে আমি এখন এটি সম্পর্কে চিন্তা করি। "অনেক" বলার পরে পোস্টটি সম্পাদনা করা বড় চর্বিযুক্ত মিথ্যা হতে পারে। :)
শান মিডলডিচ

9

প্রাথমিক পার্থক্যটি কৌশলগুলি কতটা আপ টু ডেট। প্রথম টিউটোরিয়ালে ব্যবহৃত তাত্ক্ষণিক মোড:

glBegin(GL_QUADS);
    glColor3f(1, 0, 0); glVertex3f(0, 0, 0);
    glColor3f(1, 1, 0); glVertex3f(100, 0, 0);
    glColor3f(1, 0, 1); glVertex3f(100, 100, 0);
    glColor3f(1, 1, 1); glVertex3f(0, 100, 0);
glEnd();

পুরানো এবং নতুন সংস্করণগুলিতে সমর্থিত নয়।

ভার্টেক্স বাফার এবং শেডারগুলি ব্যবহার করা ওপেনজিএল দিয়ে রেন্ডার করার বর্তমান পদ্ধতি। এটি আরও জটিল বলে মনে হচ্ছে তবে এটি আরও ভাল পারফর্ম করে। অতিরিক্ত হিসাবে, একবার আপনার সমর্থন কোডটি ওপেনএল স্ট্যাপ মোড়ানোর পরে, পার্থক্যগুলি বেশিরভাগ অংশে বিমূর্ত হয়ে যায়।


2

অন্যান্য চমৎকার উত্তরের সাথে আরও কিছু প্রসঙ্গ যুক্ত করতে।

প্রথম লিঙ্কে বর্ণিত তাত্ক্ষণিক মোডটি যেমন অন্যেরা বলেছেন, ওপেনজিএল (১.১) এর প্রথম সংস্করণ থেকে প্রাপ্ত লিগ্যাসি কোড। এটি আবার ব্যবহার করা হয়েছিল যখন জিপিইউগুলি ত্রিভুজ রাস্টারাইজারগুলির চেয়ে কিছুটা বেশি ছিল এবং প্রোগ্রামেবল পাইপলাইনের ধারণা উপস্থিত ছিল না। উদাহরণস্বরূপ, আপনি GLQuake এবং Quake 2 এর মতো প্রাথমিক কিছু হার্ডওয়্যার-ত্বরণযুক্ত গেমগুলির উত্স কোডের দিকে নজর দিলে আপনি ব্যবহারের সাথে সাথে তাত্ক্ষণিক মোড দেখতে পাবেন। সহজ কথায়, সিপিইউ একবারে একবারের জন্য একবার জিপিইউ-তে স্ক্রিনে ত্রিভুজ অঙ্কন শুরু করার জন্য একটি শীর্ষ দিকের নির্দেশনা প্রেরণ করে। রেকর্ডের জন্য, জিপিইউকে ফ্লাইতে নিজেই ত্রিভুজগুলিতে পরিণত করতে জিপিইউ ব্যতীত জিএল_আরএইপিএলএস-এর একই ফলাফল রয়েছে।

আধুনিক (৩.২+) ওপেনএল একটি ভিন্ন পদ্ধতির গ্রহণ করে। এটি তাত্ক্ষণিকভাবে অ্যাক্সেসের জন্য ভার্টেক্স তথ্যটি জিপিইউ মেমরির মধ্যে বাফার করে এবং তারপরে আপনি glDrawArrays বা glDrawE উপাদান ব্যবহার করে অঙ্কন নির্দেশাবলী পাঠাতে পারেন। আপনার কাছে প্রোগ্রামেবল পাইপলাইনও রয়েছে (glUsePogram) যা আপনাকে GPU পজিশনগুলি এবং শিখরগুলি কীভাবে রঙ করে তা কাস্টমাইজ করতে দেয়।

তাত্ক্ষণিক মোডটিকে অবমূল্যায়ন করার কয়েকটি কারণ রয়েছে, এর মূল কারণটি হল কর্মক্ষমতা। শান তার উত্তরে বলেছিলেন, আজকাল জিপিইউগুলি সিপিইউ আপলোড করার চেয়ে দ্রুত ডেটা ক্রাচ করতে পারে, তাই আপনি জিপিইউর পারফরম্যান্সকে বাধা দিবেন। আপনার করা প্রতিটি কলের জন্য একটি ছোট ওভারহেড জড়িত রয়েছে, এটি ক্ষুদ্রতর তবে আপনি যখন প্রতি ফ্রেমে কয়েক হাজার কল করছেন তখন এটি স্ট্যাক আপ শুরু হয়। সোজা কথায়, তাত্ক্ষণিক মোড ব্যবহার করে টেক্সচারযুক্ত মডেলটি আঁকতে আপনার প্রতি ফ্রেম প্রতি কমপক্ষে কমপক্ষে 2 টি কল (glTexCoord2f এবং glVertex3f) প্রয়োজন। আধুনিক ওপেনএল-এর সাহায্যে আপনি ডেটা বাফার শুরুতে কয়েকটি কল ব্যবহার করেন, তারপরে আপনি ভার্টেক্স অ্যারে অবজেক্টটি আবদ্ধ করতে কয়েকটি কল ব্যবহার করে, এটিতে যতগুলি উল্লম্ব রয়েছে তা নির্বিশেষে আপনি পুরো মডেলটি আঁকতে পারেন, কিছু বৈশিষ্ট্য পয়েন্টার সক্ষম করে এবং তারপরে glDrawE উপাদান বা glDrawArrays এ একক কল।

কোন কৌশলটি সঠিক? ওয়েল এটি আপনি যা করার চেষ্টা করছেন তার উপর নির্ভর করে। একটি সাধারণ 2 ডি গেম যার জন্য কোনও অভিনব পোস্ট প্রসেসিং কৌশল বা শেডারগুলির প্রয়োজন হয় না তাৎক্ষণিক মোড ব্যবহার করে ঠিক কাজ করবে এবং কোডটি লেখা সম্ভবত সহজ হবে easier তবে, আরও একটি আধুনিক 3 ডি গেমটি সত্যই লড়াই করবে এবং যদি আপনি জিএলএসএল (শেডার ভাষা) শেখার পরিকল্পনা করে থাকেন তবে অবশ্যই আধুনিক কৌশলটি শিখুন।

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