কীভাবে ওপেনজিএল সর্বনিম্ন স্তরে কাজ করে? [বন্ধ]


85

আমি ওপেনজিএল / ডাইরেক্টএক্স প্রোগ্রামগুলি কীভাবে লিখব তা আমি বুঝতে পেরেছি, এবং এর পিছনে গণিত এবং ধারণাগত উপাদানগুলিও জানি তবে জিপিইউ-সিপিইউ যোগাযোগ কীভাবে নিম্ন স্তরে কাজ করে তা আমি আগ্রহী।

বলুন আমি সি তে লিখিত একটি ওপেনজিএল প্রোগ্রাম পেয়েছি যা একটি ত্রিভুজ প্রদর্শন করে এবং ক্যামেরাটিকে 45 ডিগ্রি ঘোরায়। আমি যখন এই প্রোগ্রামটি সংকলন করব, তখন এটি কি আইওএসটিএল-কলগুলির একটি সিরিজে রূপান্তরিত হবে, এবং জিপিইউ ড্রাইভারটি তারপরে উপযুক্ত কমান্ডগুলি জিপিইউতে প্রেরণ করবে, যেখানে ত্রিভুজটি ঘোরানো এবং উপযুক্ত পিক্সেলকে উপযুক্ত রঙে সেট করার সমস্ত যুক্তি তারযুক্ত ভিতরে? অথবা প্রোগ্রামটি কোনও "জিপিইউ প্রোগ্রাম" তে সংকলিত হবে যা জিপিইউতে লোড করা হয় এবং ঘূর্ণন ইত্যাদি গণনা করে? নাকি সম্পূর্ণ আলাদা কিছু?

সম্পাদনা করুন : কয়েক দিন পরে আমি এই নিবন্ধ সিরিজটি পেয়েছি, যা মূলত প্রশ্নের উত্তর দেয়: http://fgiesen.wordpress.com/2011/07/01/a-trip-through-thetographic-- পাইপলাইন2011-part- 1 /


ওপেনগিএল স্পেসিফিকেশন স্টেট যা আদেশগুলি ক্লায়েন্ট / সার্ভার মোডে প্রেরণ করা হয়। ওপেনজিএল বাস্তবায়ন দ্বারা ব্যবহৃত নির্দিষ্ট টেকনোলজি নির্ধারণের জন্য স্পেসিফিকেশনটি খুব বিস্তৃত।
লুকা

উত্তর:


87

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

প্রশ্নটি হতে পারে: কোনও ওপেনজিএল ড্রাইভার নিম্নতম স্তরে কীভাবে কাজ করে। এখন এটি সাধারণভাবে উত্তর দেওয়া আবার অসম্ভব, কারণ কোনও ড্রাইভার কিছু হার্ডওয়ারের সাথে খুব ঘনিষ্ঠভাবে আবদ্ধ থাকে, যা আবার এমন কিছু করতে পারে তবে বিকাশকারী এটি নকশা করেছিলেন।

সুতরাং প্রশ্নটি হওয়া উচিত ছিল: "ওপেনজিএল এবং গ্রাফিক্স সিস্টেমের পর্দার পিছনে এটি কীভাবে গড় দেখায়?" নীচে থেকে এটি তাকান:

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

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

  3. তারপরে ড্রাইভার নির্ভর ওপেনজিএল ক্লায়েন্ট লাইব্রেরি / ড্রাইভার রয়েছে। উইন্ডোজে এটি প্রক্সি দ্বারা ওপেনগ্ল 32.ডিলের মাধ্যমে লোড হয়ে যায়, ইউনিক্স সিস্টেমে এটি দুটি জায়গায় থাকে:

    • এক্স 11 জিএলএক্স মডিউল এবং ড্রাইভার নির্ভর জিএলএক্স ড্রাইভার
    • এবং /usr/lib/libGL.so সরাসরি রেন্ডারিংয়ের জন্য কিছু ড্রাইভার নির্ভর স্টাফ থাকতে পারে

    ম্যাকস এক্স-তে এটি "ওপেনজিএল ফ্রেমওয়ার্ক" হতে পারে।

    এই অংশটিই ওপেনজিএল কলগুলিতে অনুবাদ করে যে কীভাবে আপনি এটি (2) এ বর্ণিত ড্রাইভারের অংশের ড্রাইভার নির্দিষ্ট ফাংশনগুলিতে কলগুলিতে করেন।

  4. অবশেষে আসল ওপেনজিএল এপিআই লাইব্রেরি, উইন্ডোজে ওপেনগ্ল 32.ডিল এবং ইউনিক্স / ইউএসআর / লিবি / লিবিজিএল; এটি বেশিরভাগই কমান্ডগুলি কেবল ওপেনএল বাস্তবায়নের যথাযথভাবে পাস করে।

আসল যোগাযোগ কীভাবে ঘটে তা সাধারণ করা যায় না:

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

যোগাযোগ 3 বি </>> আইওএসটিএল মাধ্যমে যেতে পারে, পড়তে / লিখতে পারে, বা প্রক্রিয়া ঠিকানা স্পেসে কিছু মেমরি ম্যাপিংয়ের মাধ্যমে এবং যখনই সেই স্মৃতিতে পরিবর্তন হয়ে যায় তখন কিছু ড্রাইভার কোড ট্রিগার করতে এমএমইউ কনফিগার করে। এটি যে কোনও অপারেটিং সিস্টেমে একেবারে অনুরূপ যেহেতু আপনাকে সর্বদা কার্নেল / ইউজারল্যান্ডের সীমানাটি অতিক্রম করতে হয়: শেষ পর্যন্ত আপনি কিছু সিস্টেমে যান।

পেরিফিয়াল বাস এবং এটি যে অ্যাক্সেস পদ্ধতির দ্বারা সংজ্ঞায়িত করা হয় তার মাধ্যমে সিস্টেম এবং জিপিইউর মধ্যে যোগাযোগ ঘটে, সুতরাং পিসিআই, এজিপি, পিসিআই-ই, ইত্যাদি, যা পোর্ট-আই / ও, মেমরি ম্যাপযুক্ত আই / ও, ডিএমএ, আইআরকিউগুলির মাধ্যমে কাজ করে।


4
এই বর্ণনাটি সম্ভবত খুব নিম্ন স্তরের এবং খুব অল্প ওপেনএল স্পেসিফিকেশন সহ জেনেরিক। এটি মোটামুটি একটি কম্পিউটারে উপস্থিত কোনও হার্ডওয়্যার উপাদান প্রয়োগ করে।
v.sashenko

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

4
@ ভি.শ্যাশেনকো: আপনি যদি আরও বিশদ চান, তবে আপনাকে একটি নির্দিষ্ট বাস্তবায়ন সম্পর্কে জিজ্ঞাসা করতে হবে। উদাহরণস্বরূপ বলুন, এক্স 11 + জিএলএক্স + ডিআরআই → মেসা / এএমডিজিপিইউ → লিনাক্স-কেএমএস + ডিআরএম (ডাইরেক্ট রেন্ডারিং ম্যানেজার)। এবং এই উপাদানগুলির প্রতিটি হ'ল এতগুলি বিশদ সহ একটি জটিল প্রাণী, যাতে আপনি প্রতিটি উপাদান কীভাবে কাজ করে তার বিশদ সহ বইগুলি পূরণ করতে পারে। তবে এটি লিনাক্স-এএমডিজিপিইউ বাস্তবায়ন বর্ণনা করবে। তবে লিনাক্স + এনভিডিয়া সম্পূর্ণ ভিন্ন জন্তু different এবং উইন্ডোজ আবার তার ভিন্ন।
ডেটনল্ফ

আপনি কি আমাকে স্মরণ করেছেন আমরা বেশ কয়েকদিন আগে চ্যাট করেছি, আমি কিছু জানতে চাইলে আপনাকে কীভাবে যোগাযোগ করতে হবে তা আমি জানতে চেয়েছিলাম??
সুরজ জৈন

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

23

আমি যখন এই প্রোগ্রামটি সংকলন করব, তখন এটি কি আইওএসটিএল-কলগুলির একটি সিরিজে রূপান্তরিত হবে, এবং জিপিইউ ড্রাইভারটি তারপরে উপযুক্ত কমান্ডগুলি জিপিইউতে প্রেরণ করবে, যেখানে ত্রিভুজটি ঘোরানো এবং উপযুক্ত পিক্সেলকে উপযুক্ত রঙে সেট করার সমস্ত যুক্তি তারযুক্ত ভিতরে? অথবা প্রোগ্রামটি কোনও "জিপিইউ প্রোগ্রাম" তে সংকলিত হবে যা জিপিইউতে লোড করা হয় এবং ঘূর্ণন ইত্যাদি গণনা করে?

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

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

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


20

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


18

সি / সি ++ সংকলক / লিকাররা ঠিক একটি কাজ করে: তারা টেক্সট ফাইলগুলিকে মেশিন-নির্দিষ্ট ওপকোডের সিরিজে রূপান্তর করে যা সিপিইউতে চালিত হয়। ওপেনজিএল এবং ডাইরেক্ট 3 ডি কেবলমাত্র সি / সি ++ এপিআই; তারা আপনার সি / সি ++ সংকলক / লিঙ্কারকে জিপিইউর জন্য একটি সংকলক / লিঙ্কারে রূপান্তর করতে পারে না।

আপনার লেখা সি / সি ++ কোডের প্রতিটি লাইন সিপিইউতে কার্যকর করা হবে। ওপেনজিএল / ডাইরেক্ট 3 ডি-তে কলগুলি সি / সি ++ পাঠাগারগুলিতে কল করবে, স্ট্যাটিক বা ডায়ামিকের ক্ষেত্রে যেমন হতে পারে।

আপনার কোডটি সুস্পষ্টভাবে ছায়া গো তৈরি করলে একটি "জিপিইউ প্রোগ্রাম" কার্যকর হবে place এটি হ'ল, যদি আপনি ওপেনজিএল / ডি 3 ডি এপিআই কল করেন যা শেডারগুলির সংকলন এবং লিঙ্ক তৈরি করে cause এটি করার জন্য, আপনি (রানটাইম সময়ে, সি / সি ++ কমপাইল-টাইম নয়) হয় স্ট্র্যান্ডগুলি তৈরি বা লোড করুন যা কিছু শেডার ভাষায় শেডারগুলিকে উপস্থাপন করে। তারপরে আপনি এগুলি শেডার সংকলকটির মাধ্যমে সরিয়ে দিন এবং সেই এপিআই-তে এমন কোনও বস্তু ফিরে পাবেন যা সেই শেডারকে উপস্থাপন করে। তারপরে আপনি একটি নির্দিষ্ট রেন্ডারিং কমান্ডে এক বা একাধিক শেডার প্রয়োগ করেন। এই পদক্ষেপগুলির প্রত্যেকটি আপনার সি / সি ++ কোডের নির্দেশে স্পষ্টভাবে ঘটে, যা পূর্বে বর্ণিত সিপিইউতে চলে।

অনেক শেডার ভাষা সি / সি ++ ব্যবহার করে - সিনট্যাক্সের মতো। তবে এটি তাদের সি / সি ++ এর সমতুল্য করে না।


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

4
বেশিরভাগ "ফিক্সড ফাংশন পাইপলাইন" এখন শেডার প্রোগ্রামগুলির একটি ডিফল্ট সেট দ্বারা প্রয়োগ করা হয়। একটি শ্যাডার পাওয়ার জন্য আপনাকে স্পষ্টভাবে একটি শেডারের অনুরোধ করার দরকার নেই।
বেন ভয়েগট

4
@ বেন ভয়েগ্ট: সত্য, তবে যদি কেউ আপনাকে না বলে, আপনি পার্থক্যটি বলতে পারবেন না।
নিকল বোলাস

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