ওপেনজিএল বিষয়গুলি সম্পর্কে সমস্ত
ওপেনজিএল সামগ্রীর জন্য আদর্শ মডেল নিম্নরূপ।
অবজেক্টের স্টেট থাকে। এগুলিকে একটি হিসাবে ভাবুন struct। সুতরাং আপনার কাছে এটির মতো সংজ্ঞায়িত কোনও জিনিস থাকতে পারে:
struct Object
{
int count;
float opacity;
char *name;
};
অবজেক্টটির এতে নির্দিষ্ট মান রয়েছে এবং এটির স্থিতি রয়েছে । ওপেনজিএল অবজেক্টগুলিরও অবস্থা রয়েছে।
রাষ্ট্র পরিবর্তনশীল
সি / সি ++ এ, যদি আপনার টাইপের উদাহরণ থাকে তবে আপনি Objectতার অবস্থাটি নিম্নরূপে পরিবর্তন করতে পারবেন: obj.count = 5;আপনি সরাসরি অবজেক্টের উদাহরণটি উল্লেখ করতে পারবেন, যে নির্দিষ্ট রাজ্যের যে অংশটি আপনি পরিবর্তন করতে চান তা পেয়ে যাবেন এবং এর মধ্যে একটি মান সরিয়ে ফেলবেন।
ওপেনজিএলে, আপনি এটি করবেন না ।
উত্তরাধিকারগত কারণে আরও ভাল অব্যক্ত বামে, ওপেনগিএল অবজেক্টের অবস্থা পরিবর্তন করতে, আপনাকে প্রথমে প্রসঙ্গে আবদ্ধ করতে হবে । এটি glBind*কল অফ কিছু থেকে সম্পন্ন হয় ।
সি / সি ++ এর সমতুল্য নিম্নরূপ:
Object *g_objs[MAX_LOCATIONS] = {NULL};
void BindObject(int loc, Object *obj)
{
g_objs[loc] = obj;
}
টেক্সচার আকর্ষণীয়; তারা বাঁধাইয়ের একটি বিশেষ ক্ষেত্রে প্রতিনিধিত্ব করে। অনেক glBind*কল একটি "লক্ষ্য" পরামিতি আছে। এটি ওপেনএল প্রসঙ্গে বিভিন্ন অবস্থানের প্রতিনিধিত্ব করে যেখানে সেই ধরণের অবজেক্টগুলিকে আবদ্ধ করা যায়। উদাহরণস্বরূপ, আপনি ( GL_READ_FRAMEBUFFER) লেখার জন্য বা ( GL_DRAW_FRAMEBUFFER) লেখার জন্য ফ্রেমবফার বস্তুকে বেঁধে রাখতে পারেন । এটি ওপেনজিএল কীভাবে বাফার ব্যবহার করে তা প্রভাবিত করে। locউপরের প্যারামিটারটি এটি প্রতিনিধিত্ব করে।
টেক্সচারগুলি বিশেষ কারণ আপনি যখন প্রথমে এটিকে কোনও লক্ষ্যে আবদ্ধ করেন, তখন তারা বিশেষ তথ্য পান information আপনি যখন কোনও টেক্সচারটিকে প্রথমে বাঁধেন GL_TEXTURE_2D, আপনি আসলে টেক্সচারে একটি বিশেষ অবস্থা স্থাপন করছেন। আপনি বলছেন যে এই টেক্সচারটি 2 ডি টেক্সচার। এবং এটি সর্বদা 2D টেক্সচার হবে; এই রাষ্ট্র আর কখনও পরিবর্তন করা যায় না । আপনার যদি এমন একটি টেক্সচার থাকে যা প্রথমে এ হিসাবে আবদ্ধ হয় তবে GL_TEXTURE_2Dআপনাকে অবশ্যই সর্বদা এটি হিসাবে আবদ্ধ করা উচিত GL_TEXTURE_2D; এটির সাথে আবদ্ধ করার চেষ্টা করা GL_TEXTURE_1Dএকটি ত্রুটির জন্ম দেবে (রান-টাইমের সময়)।
একবার বস্তুটি আবদ্ধ হয়ে গেলে তার অবস্থার পরিবর্তন করা যায়। এটি সেই অবজেক্টের জন্য নির্দিষ্ট জেনেরিক ফাংশনগুলির মাধ্যমে করা হয়। তারাও এমন একটি অবস্থান নেয় যা কোন বস্তুকে সংশোধন করতে পারে তা উপস্থাপন করে।
সি / সি ++ এ, দেখে মনে হচ্ছে:
void ObjectParameteri(int loc, ObjectParameters eParam, int value)
{
if(g_objs[loc] == NULL)
return;
switch(eParam)
{
case OBJECT_COUNT:
g_objs[loc]->count = value;
break;
case OBJECT_OPACITY:
g_objs[loc]->opacity = (float)value;
break;
default:
//INVALID_ENUM error
break;
}
}
লক্ষ্য করুন যে এই ফাংশনটি বর্তমানে সীমাবদ্ধ locমান হিসাবে যা ঘটে তা সেট করে ।
টেক্সচার অবজেক্টের জন্য, মূল টেক্সচারের রাষ্ট্র পরিবর্তনকারী ফাংশনগুলি glTexParameter। টেক্সচারের স্থিতি পরিবর্তনকারী কেবলমাত্র অন্যান্য ক্রিয়াকলাপগুলি হ'ল glTexImageকার্য এবং তাদের প্রকরণ ( glCompressedTexImage, glCopyTexImageসাম্প্রতিক glTexStorage)। বিভিন্ন SubImageসংস্করণের জমিন বিষয়বস্তু পরিবর্তন করেন, কিন্তু তারা টেকনিক্যালি তার পরিবর্তন করবেন না রাষ্ট্র । Imageফাংশন জমিন স্টোরেজ বরাদ্দ এবং টেক্সচার ফর্ম্যাটটি সেট; SubImageফাংশন শুধু পিক্সেল প্রায় কপি করুন। এটি জমিনের রাজ্য হিসাবে বিবেচনা করা হয় না।
আমাকে পুনরাবৃত্তি করার অনুমতি দিন: এগুলি কেবলমাত্র টেক্সচারের স্থিতি পরিবর্তন করে ify glTexEnvপরিবেশ রাষ্ট্র পরিবর্তন; এটি টেক্সচার অবজেক্টগুলিতে সঞ্চিত কিছুকে প্রভাবিত করে না।
অ্যাক্টিভ টেক্সচার
টেক্সচারের জন্য পরিস্থিতি আরও জটিল, আবার উত্তরাধিকারসূত্রে অকার্যকর বাম কারণে। এখানেই glActiveTextureআসে।
অঙ্গবিন্যাস, সেখানে মাত্র লক্ষ্যমাত্রা (নও GL_TEXTURE_1D, GL_TEXTURE_CUBE_MAPইত্যাদি)। টেক্সচার ইউনিটও রয়েছে । আমাদের সি / সি ++ উদাহরণের নিরিখে, আমাদের যা আছে তা হ'ল:
Object *g_objs[MAX_OBJECTS][MAX_LOCATIONS] = {NULL};
int g_currObject = 0;
void BindObject(int loc, Object *obj)
{
g_objs[g_currObject][loc] = obj;
}
void ActiveObject(int currObject)
{
g_currObject = currObject;
}
লক্ষ্য করুন যে এখন, আমাদের কেবলমাত্র একটি 2 ডি তালিকা নেই Object, তবে আমাদের বর্তমান অবজেক্টের ধারণাও রয়েছে। আমাদের বর্তমান অবজেক্টটি সেট করার জন্য একটি ফাংশন রয়েছে, আমাদের সর্বাধিক সংখ্যক বর্তমান অবজেক্টের ধারণা রয়েছে এবং আমাদের সমস্ত অবজেক্ট ম্যানিপুলেশন ফাংশন বর্তমান অবজেক্ট থেকে নির্বাচন করতে সামঞ্জস্য করা হয়।
আপনি যখন বর্তমানে সক্রিয় বস্তুটি পরিবর্তন করেন, আপনি লক্ষ্য অবস্থানগুলির পুরো সেটটি পরিবর্তন করেন। সুতরাং আপনি এমন কিছুকে বাঁধতে পারেন যা বর্তমান অবজেক্ট 0 এ যায়, বর্তমান অবজেক্ট 4 এ স্যুইচ করুন, এবং সম্পূর্ণ ভিন্ন অবজেক্টটি পরিবর্তন করবেন।
টেক্সচার অবজেক্টের সাথে এই সাদৃশ্যটি নিখুঁত ... প্রায়।
দেখুন, glActiveTextureএকটি পূর্ণসংখ্যা গ্রহণ করে না; এটি একটি গণক লাগে । যা তত্ত্বের অর্থ হ'ল এটি থেকে GL_TEXTURE0যে কোনও কিছুই নিতে পারে GL_TEXTURE31। তবে আপনার একটি জিনিস অবশ্যই বুঝতে হবে:
এই মিথ্যা!
প্রকৃত ব্যাপ্তি glActiveTextureনিতে পারে তা দ্বারা নিয়ন্ত্রিত হয় GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS। এটি বাস্তবায়নের অনুমতি দেয় একযোগে বহু বহুসংখ্যক সংখ্যা। এগুলি প্রতিটি বিভিন্ন শেডার পর্যায়ে বিভিন্ন গ্রুপিংয়ে বিভক্ত। উদাহরণস্বরূপ, জিএল 3.x শ্রেণীর হার্ডওয়্যারটিতে, আপনি 16 ভার্টেক্স শ্যাডার টেক্সচার, 16 টুকরা শেডার টেক্সচার এবং 16 জ্যামিতি শেডার টেক্সচার পাবেন। সুতরাং, GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS48 হবে।
তবে 48 জন গণক নেই। যে কারণে glActiveTextureপ্রকৃতপক্ষে গণনা করা হয় না। সঠিক কলে পথ glActiveTextureনিম্নরূপ:
glActiveTexture(GL_TEXTURE0 + i);
যেখানে i0 এবং এর মধ্যে একটি সংখ্যা GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS।
অনুবাদ
সুতরাং এই সমস্ত কি রেন্ডারিং সঙ্গে আছে?
শেডারগুলি ব্যবহার করার সময়, আপনি আপনার নমুনা ইউনিফর্মগুলি একটি টেক্সচার ইমেজ ইউনিটে সেট করেন ( glUniform1i(samplerLoc, i)যেখানে iচিত্রের ইউনিট রয়েছে)। এটি আপনার সাথে ব্যবহৃত নম্বরটি উপস্থাপন করে glActiveTexture। স্যাম্পলারটি স্যাম্পলারের ধরণের উপর ভিত্তি করে লক্ষ্য চয়ন করবে। সুতরাং একটি লক্ষ্য sampler2Dথেকে বাছাই করবে GL_TEXTURE_2D। স্যাম্পেলারদের বিভিন্ন ধরণের হ'ল এটি একটি কারণ।
এখন এটি সন্দেহজনকভাবে শোনাচ্ছে আপনার মতো দুটি জিএলএসএল স্যাম্পলার থাকতে পারে, বিভিন্ন ধরণের যা একই টেক্সচার ইমেজ ইউনিট ব্যবহার করে। তবে আপনি পারবেন না; ওপেনজিএল এটি নিষিদ্ধ করে এবং আপনি যখন রেন্ডার করার চেষ্টা করবেন তখন আপনাকে একটি ত্রুটি দেবে।
GL_TEXTURE0 + i- আমি এনাম মানগুলি বৈধ কিনা না তা পরীক্ষা করে দেখার অর্থ ছিল। এবং শেষ অনুচ্ছেদ - জানতেন না যে এটি আইনী ছিল কি না। অসাধারণ! আমি আপনার সমস্ত উত্তর বুকমার্ক করছি তাই আমি আবার তাদের উল্লেখ করতে পারি।