আমি প্রোগ্রামিংয়ের দিক এবং উপাদানগুলি একে অপরের সাথে কীভাবে কথা বলব সে সম্পর্কে কিছুটা লিখার সিদ্ধান্ত নিয়েছি। সম্ভবত এটি নির্দিষ্ট কিছু জায়গায় আলোকপাত করবে।
উপস্থাপনা
এমনকি আপনি যে প্রশ্নটি স্ক্রিনে আঁকেন, এমন একক চিত্র পেতে কী কী লাগে?
স্ক্রিনে ত্রিভুজ আঁকার অনেকগুলি উপায় রয়েছে। সরলতার জন্য, ধরে নেওয়া যাক কোনও ভার্টেক্স বাফার ব্যবহার করা হয়নি। (একটি ভার্টেক্স বাফার মেমরির একটি ক্ষেত্র যেখানে আপনি স্থানাঙ্কগুলি সঞ্চয় করেন)) ধরে নেওয়া যাক প্রোগ্রামটি প্রতিটি গ্রাণু (গ্রাফিক্সটি কেবল স্থানের একটি স্থানাঙ্ক) সম্পর্কে সারিবদ্ধভাবে গ্রাফিক্স প্রসেসিং পাইপলাইনটিকে বলেছিল।
তবে , কিছু অঙ্কন করার আগে আমাদের প্রথমে কিছু ভারা চালাতে হবে। আমরা পরে দেখব কেন :
// Clear The Screen And The Depth Buffer
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Reset The Current Modelview Matrix
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// Drawing Using Triangles
glBegin(GL_TRIANGLES);
// Red
glColor3f(1.0f,0.0f,0.0f);
// Top Of Triangle (Front)
glVertex3f( 0.0f, 1.0f, 0.0f);
// Green
glColor3f(0.0f,1.0f,0.0f);
// Left Of Triangle (Front)
glVertex3f(-1.0f,-1.0f, 1.0f);
// Blue
glColor3f(0.0f,0.0f,1.0f);
// Right Of Triangle (Front)
glVertex3f( 1.0f,-1.0f, 1.0f);
// Done Drawing
glEnd();
তাহলে কী করল?
আপনি যখন এমন কোনও প্রোগ্রাম লেখেন যা গ্রাফিক্স কার্ডটি ব্যবহার করতে চায় আপনি সাধারণত ড্রাইভারের কাছে কোনও ধরণের ইন্টারফেস বেছে নেবেন। ড্রাইভারের কয়েকটি পরিচিত ইন্টারফেস হ'ল:
- যেমন OpenGL
- এমন Direct3D
- CUDA
এই উদাহরণের জন্য আমরা ওপেনজিএল দিয়ে থাকব। এখন, আপনার ড্রাইভারে ইন্টারফেস কি সব সরঞ্জাম আপনি আপনার প্রোগ্রাম করতে হবে দেয় আলাপ গ্রাফিক্স কার্ডে (বা চালক, যা আলোচনা কার্ডে)।
এই ইন্টারফেস আপনাকে নির্দিষ্ট সরঞ্জাম দিতে বাধ্য । এই সরঞ্জামগুলি এমন একটি API এর আকার নেয় যা আপনি আপনার প্রোগ্রাম থেকে কল করতে পারেন।
সেই এপিআই হ'ল আমরা উপরের উদাহরণে ব্যবহৃত হচ্ছে। আসুন আরও ঘুরে দেখুন।
ভারা
আপনি প্রকৃত কোনও অঙ্কন করতে পারার আগে আপনাকে একটি সেটআপ করতে হবে । আপনাকে আপনার ভিউপোর্ট (আসলে যে অঞ্চলটি উপস্থাপন করা হবে), আপনার দৃষ্টিভঙ্গি ( আপনার বিশ্বের ক্যামেরা ), কোন অ্যান্টি-এলিয়াসিং আপনি ব্যবহার করবেন (আপনার ত্রিভুজটির প্রান্তটি মসৃণ করার জন্য) ...
তবে আমরা এর কোনটির দিকে নজর দেব না। আমরা প্রতিটি ফ্রেম আপনাকে করতে হবে স্টাফ তাকান । ভালো লেগেছে:
পর্দা সাফ করা হচ্ছে
গ্রাফিক্স পাইপলাইন আপনার জন্য প্রতিটি ফ্রেম স্ক্রিন সাফ করবে না। আপনাকে এটা বলতে হবে। কেন? এই জন্যই:
আপনি পর্দায় পরিষ্কার না থাকে, তাহলে আপনি কেবল করব জায়গায় বসান যে ফ্রেম করুন। সে কারণেই আমরা সেটটি glClear
দিয়ে কল করি GL_COLOR_BUFFER_BIT
। অন্য বিট ( GL_DEPTH_BUFFER_BIT
) ওপেনজিএলকে গভীরতা বাফারটি সাফ করতে বলে । কোন পিক্সেল সামনে (বা পিছনে) অন্যান্য পিক্সেল রয়েছে তা নির্ধারণ করতে এই বাফার ব্যবহার করা হয়।
রুপান্তর
চিত্র উত্স
রূপান্তর হ'ল সেই অংশটি যেখানে আমরা সমস্ত ইনপুট স্থানাঙ্ক (আমাদের ত্রিভুজটির শীর্ষকোষ) গ্রহণ করি এবং আমাদের মডেলভিউ ম্যাট্রিক্স প্রয়োগ করি। এটি ম্যাট্রিক্স যা ব্যাখ্যা করে যে কীভাবে আমাদের মডেল (প্রান্তগুলি) ঘোরানো হয়, মাপানো হয় এবং অনুবাদ করা হয় (সরানো হয়)।
এরপরে, আমরা আমাদের প্রজেকশন ম্যাট্রিক্স প্রয়োগ করি। এটি সমস্ত স্থানাঙ্ককে সরিয়ে দেয় যাতে তারা আমাদের ক্যামেরার সঠিকভাবে মুখোমুখি হয়।
এখন আমরা আমাদের ভিউপোর্ট ম্যাট্রিক্সের সাথে আরও একবার রূপান্তর করি। আমরা আমাদের মনিটরের আকারে আমাদের মডেলটিকে স্কেল করতে এটি করি। এখন আমাদের উল্লম্বের একটি সেট রয়েছে যা রেন্ডার করার জন্য প্রস্তুত!
আমরা একটু পরে রূপান্তর ফিরে আসব।
অঙ্কন
ত্রিভুজ আঁকতে, আমরা কেবল ওপেনজিএলকে ধ্রুবকের সাথে কল করে ত্রিভুজগুলির একটি নতুন তালিকা শুরু করতে বলতে পারি । আপনি আঁকতে পারেন এমন অন্যান্য ফর্মও রয়েছে। একটি ভালো লেগেছে ত্রিভুজ ফালা বা ত্রিভুজ ফ্যান । এগুলি মূলত অপ্টিমাইজেশন, কারণ একই পরিমাণ ত্রিভুজ আঁকতে তাদের সিপিইউ এবং জিপিইউর মধ্যে কম যোগাযোগের প্রয়োজন।glBegin
GL_TRIANGLES
এর পরে, আমরা 3 টি শীর্ষ কোণের একটি তালিকা সরবরাহ করতে পারি যা প্রতিটি ত্রিভুজটি তৈরি করা উচিত। প্রতিটি ত্রিভুজ 3 টি স্থানাঙ্ক ব্যবহার করে (যেমন আমরা 3D-স্পেসে আছি)। অতিরিক্তভাবে, আমি কল করার আগে কল করে প্রতিটি প্রান্তের জন্য একটি রঙ সরবরাহ করি ।glColor3f
glVertex3f
3 টি শীর্ষ কোণ (ত্রিভুজের 3 কোণ) এর মধ্যে ছায়াটি স্বয়ংক্রিয়ভাবে ওপেনএল দ্বারা গণনা করা হয় । এটি বহুভুজটির পুরো মুখের উপরে রঙটি বিভক্ত করবে।
মিথষ্ক্রিয়া
এখন, আপনি উইন্ডো ক্লিক করুন। অ্যাপ্লিকেশনটিতে কেবল উইন্ডো বার্তাটি ক্যাপচার করতে হবে যা ক্লিকের সংকেত দেয়। তারপরে আপনি আপনার প্রোগ্রামটিতে যে কোনও ক্রিয়াকলাপ চালাতে পারেন।
এই পায় অনেক বেশি কঠিন একবার আপনি আপনার 3D দৃশ্য সাথে আলাপচারিতা শুরু করতে চাই।
আপনাকে প্রথমে পরিষ্কারভাবে জানতে হবে যে ব্যবহারকারী কোন পিক্সেলটিতে উইন্ডোটি ক্লিক করেছে। তারপরে, আপনার দৃষ্টিকোণটি বিবেচনায় নিয়ে, আপনি আপনার দৃশ্যে মাউসের ক্লিক থেকে একটি রশ্মির দিক নির্ণয় করতে পারেন। তারপরে আপনার দৃশ্যের কোনও বস্তু সেই রশ্মির সাথে ছেদ করে কিনা তা আপনি গণনা করতে পারেন । এখন আপনি জানেন যে ব্যবহারকারী কোনও বস্তুকে ক্লিক করেছেন কিনা।
তো, আপনি কীভাবে এটি ঘোরান?
রুপান্তর
আমি সাধারণত প্রয়োগ করা হয় এমন দুটি ধরণের রূপান্তর সম্পর্কে সচেতন:
- ম্যাট্রিক্স-ভিত্তিক রূপান্তর
- হাড়-ভিত্তিক রূপান্তর
পার্থক্য হ'ল হাড়গুলি একক শীর্ষকে প্রভাবিত করে । ম্যাট্রিকগুলি সর্বদা একইভাবে সমস্ত টানা অনুভূমিকাকে প্রভাবিত করে। আসুন একটি উদাহরণ তাকান।
উদাহরণ
এর আগে, আমরা আমাদের ত্রিভুজ আঁকার আগে আমাদের পরিচয় ম্যাট্রিক্স লোড করেছি । পরিচয় ম্যাট্রিক্স এমন একটি যা কেবল কোনও রূপান্তর সরবরাহ করে না। সুতরাং, আমি যাই আঁকি না কেন কেবল আমার দৃষ্টিকোণ দ্বারা প্রভাবিত হয়। সুতরাং, ত্রিভুজটি মোটেও ঘোরানো হবে না।
আমি যদি এখনই এটি ঘোরানো চাই, আমি নিজেই গণিতটি করতে পারি (সিপিইউতে) এবং কেবলমাত্র অন্য স্থানাঙ্কগুলির glVertex3f
সাথে কল করতে পারি (যা ঘোরানো হয়)। অথবা আমি জিপিইউকে অঙ্কনের আগে ফোন করে সমস্ত কাজ করতে দিতে পারি :glRotatef
// Rotate The Triangle On The Y axis
glRotatef(amount,0.0f,1.0f,0.0f);
amount
অবশ্যই, একটি নির্দিষ্ট মান। আপনি যদি অ্যানিমেট করতে চান তবে আপনাকে ট্র্যাক রাখতে হবে amount
এবং প্রতিটি ফ্রেম এড়াতে হবে।
তো, অপেক্ষা করুন, এর আগে ম্যাট্রিক্সের সমস্ত টকের কী হয়েছিল?
এই সহজ উদাহরণে, আমাদের ম্যাট্রিক্স সম্পর্কে যত্ন নিতে হবে না। আমরা কেবল কল করি glRotatef
এবং এটি আমাদের জন্য সমস্ত কিছু যত্ন নেয় care
glRotate
angle
ভেক্টর xyz এর চারপাশে ডিগ্রির একটি ঘূর্ণন উত্পাদন করে । বর্তমান ম্যাট্রিক্স (দেখুন গ্লোম্যাট্রিক্সমোড ) একটি ঘূর্ণন ম্যাট্রিক্স দ্বারা গুণিত হয়েছে পণ্যটি বর্তমান ম্যাট্রিক্সকে প্রতিস্থাপন করে, যেন গ্লোমલ્ટ ম্যাট্রিক্সকে তার যুক্তি হিসাবে নিম্নলিখিত ম্যাট্রিক্সের সাথে ডাকা হয়:
x 2 1 - c + cx y 1 - c - z sx z 1 - c + y s 0 y x 1 - সি + জেড সি 2 1 - সি + সি z 1 - সি - x s 0 x z 1 - সি - ওয়াই সি জেড 1 - সি + এক্স এসজেড 2 1 - সি + সি 0 0 0 0 1 1
ঠিক আছে, তার জন্য ধন্যবাদ!
উপসংহার
যা প্রকট হয়ে ওঠে তা হ'ল ওপেনজিএলে অনেক কথা হয় । তবে এটি আমাদের কিছু বলছে না । যোগাযোগ কোথায়?
ওপেনজিএল এই উদাহরণে কেবলমাত্র আমাদের যা বলছে তা হ'ল এটি হয়ে গেলে । প্রতিটি অপারেশন একটি নির্দিষ্ট পরিমাণ সময় নেবে। কিছু অপারেশন অবিশ্বাস্যভাবে দীর্ঘ সময় নেয়, অন্যদের অবিশ্বাস্যভাবে দ্রুত।
জিপিইউতে একটি ভার্টেক্স পাঠানো এত দ্রুত হবে, কীভাবে এটি প্রকাশ করতে হবে তা আমি জানতাম না। সিপিইউ থেকে জিপিইউতে প্রতিটি একক ফ্রেমে হাজার হাজার প্রান্ত পাঠানো সম্ভবত সম্ভবত কোনও সমস্যা নয়।
আপনার ভিউপোর্টটি কতটা বড় তার উপর নির্ভর করে স্ক্রিনটি সাফ করা এক মিলিসেকেন্ড বা তার থেকেও খারাপ সময় নিতে পারে (মনে রাখবেন, আপনার প্রতিটি ফ্রেম আঁকার জন্য সাধারণত আপনার প্রায় 16 মিলিসেকেন্ড সময় থাকে)। এটি সাফ করার জন্য, ওপেনএলকে আপনি যে রঙটি পরিষ্কার করতে চান তাতে প্রতিটি একক পিক্সেল আঁকতে হবে, এটি কয়েক মিলিয়ন পিক্সেল হতে পারে।
এর বাইরে, আমরা কেবলমাত্র গ্রাফিক্স অ্যাডাপ্টারের ক্ষমতার বিষয়ে ওপেনগেলকে জিজ্ঞাসা করতে পারি (সর্বাধিক রেজোলিউশন, সর্বাধিক অ্যান্টি-এলিয়াসিং, সর্বাধিক রঙ গভীরতা, ...)।
তবে আমরা পিক্সেলগুলির সাথে একটি টেক্সচারও পূরণ করতে পারি যে প্রত্যেকটির একটি নির্দিষ্ট রঙ রয়েছে। প্রতিটি পিক্সেল এইভাবে একটি মান ধারণ করে এবং জমিনটি ডেটা দিয়ে ভরা একটি দৈত্য "ফাইল"। আমরা এটিকে গ্রাফিক্স কার্ডে (একটি টেক্সচার বাফার তৈরি করে) লোড করতে পারি, তারপরে একটি শেডার লোড করতে পারি, সেই শ্যাডারটিকে আমাদের টেক্সচারটিকে ইনপুট হিসাবে ব্যবহার করতে এবং আমাদের "ফাইলটিতে" কিছু ভারী গণনা চালাতে বলে।
তারপরে আমরা আমাদের গণনার ফলাফলকে "নতুন রেন্ডার" করতে পারি (নতুন রঙের আকারে) একটি নতুন টেক্সচারে।
এইভাবে আপনি অন্যান্য উপায়ে আপনার জন্য জিপিইউকে কাজ করতে পারেন। আমি ধরে নিই CUDA সেই দিকটির সাথে একই রকম অভিনয় করে, তবে এর সাথে কাজ করার সুযোগ আমার কখনই হয়নি।
আমরা সত্যিই কেবলমাত্র সামান্য বিষয় স্পর্শ। থ্রিডি গ্রাফিক্স প্রোগ্রামিং একটি জন্তুটির নরক hell
চিত্র উত্স