GlActiveTeasure এবং glBindTeasure এর মধ্যে পার্থক্য এবং সম্পর্ক


137

আমি যা সংগ্রহ করি তা থেকে glActiveTextureসক্রিয় "টেক্সচার ইউনিট" সেট করে। প্রতিটি টেক্সচার ইউনিটে একাধিক টেক্সচার লক্ষ্য থাকতে পারে (সাধারণত GL_TEXTURE_1D, 2D, 3D বা CUBE_MAP)।

যদি আমি সঠিকভাবে বুঝতে পারি তবে আপনাকে glActiveTextureপ্রথমে টেক্সচার ইউনিটটি সেট করতে কল করতে হবে (এতে প্রাথমিক GL_TEXTURE0) এবং তারপরে আপনি (এক বা একাধিক) সেই টেক্সচার ইউনিটে "টেক্সচার লক্ষ্যগুলি" বাঁধবেন?

উপলব্ধ টেক্সচার ইউনিটগুলির সংখ্যা সিস্টেম নির্ভর। আমি আমার লাইব্রেরিতে 32 টি পর্যন্ত এনাম দেখি। আমি অনুমান করি এটির মূলত অর্থ আমার জিপিইউর সীমা কম (যা আমি মনে করি) কম রাখতে পারি168) এবং একবারে জিপিইউ মেমরিতে 32 টেক্সচার? আমি অনুমান করি যে একটি অতিরিক্ত সীমা আছে যা আমি আমার জিপিইউর সর্বাধিক মেমরির (অনুমান 1 জিবি) অতিক্রম করি না।

আমি কি টেক্সচার লক্ষ্যগুলি এবং টেক্সচার ইউনিটের মধ্যে সম্পর্কটি সঠিকভাবে বুঝতে পারি? ধরা যাক আমাকে ১ I'm টি ইউনিট এবং চারটি টার্গেটের অনুমতি দেওয়া হয়েছে, তার অর্থ কি 16 * 4 = 64 টি লক্ষ্যমাত্রার জন্য জায়গা রয়েছে, বা এটি কি সেভাবে কাজ করে না?

পরবর্তী আপনি সাধারণত একটি টেক্সচার লোড করতে চান। আপনি এটি মাধ্যমে করতে পারেন glTexImage2D। যার প্রথম যুক্তি একটি জমিন লক্ষ্য। যদি এটি এর মতো কাজ করেglBufferData তবে আমরা মূলত "হ্যান্ডেল" / "জমিনের নাম" টেক্সচার টার্গেটের সাথে আবদ্ধ করি এবং তারপরে টেক্সচারের ডেটাটিকে সেই টার্গেটে লোড করি এবং এভাবে পরোক্ষভাবে handle হ্যান্ডেলের সাথে এটি সংযুক্ত করি।

কি হবে glTexParameter? আমাদের একটি টেক্সচার লক্ষ্য বেঁধে রাখতে হবে, এবং তারপরে সেই একই লক্ষ্যটিকে আবার প্রথম যুক্তি হিসাবে বেছে নিতে হবে? বা যতক্ষণ না আমাদের সঠিক সক্রিয় টেক্সচার ইউনিট রয়েছে ততক্ষণ টেক্সচার টার্গেটের সাথে আবদ্ধ হওয়ার দরকার নেই?

glGenerateMipmap একটি লক্ষ্যেও পরিচালনা করে ... সেই লক্ষ্যটি এখনও সফল হওয়ার জন্য টেক্সচার নামের সাথে আবদ্ধ হতে হয়?

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

উত্তর:


259

ওপেনজিএল বিষয়গুলি সম্পর্কে সমস্ত

ওপেনজিএল সামগ্রীর জন্য আদর্শ মডেল নিম্নরূপ।

অবজেক্টের স্টেট থাকে। এগুলিকে একটি হিসাবে ভাবুন 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। স্যাম্পেলারদের বিভিন্ন ধরণের হ'ল এটি একটি কারণ।

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


12
কি দারুন! তবুও অন্য একটি দুর্দান্ত উত্তর - ধন্যবাদ নিকল! আমি বিশেষ করে একটি 2 ডি জমিন সম্পর্কে অনুচ্ছেদ মত সবসময় একটি 2 ডি জমিন হচ্ছে। আমি এখন এই কয়েকটি জিনিসের চারপাশে একটি মোড়ক তৈরি করছি এবং আমি নিশ্চিত ছিলাম না যে এই পরিবর্তনটি পরিবর্তনের জন্য ছেড়ে দেওয়া উচিত। এবং অংশটি GL_TEXTURE0 + i- আমি এনাম মানগুলি বৈধ কিনা না তা পরীক্ষা করে দেখার অর্থ ছিল। এবং শেষ অনুচ্ছেদ - জানতেন না যে এটি আইনী ছিল কি না। অসাধারণ! আমি আপনার সমস্ত উত্তর বুকমার্ক করছি তাই আমি আবার তাদের উল্লেখ করতে পারি।
এমপেন

6
@ নিকোল বোলাস: এটি সত্যিই ভালভাবে ব্যাখ্যা করা হয়েছে। আপনার কিছুটি আপনার অনলাইন ওপেনগল বইয়ের টেক্সচার অধ্যায়টিতে অনুলিপি করা উচিত। আমি মনে করি এটি এতটা পরিষ্কার এবং অধ্যায়টি ভালভাবে প্রশংসা করবে।
ওয়েডডেক

3
@ নিকোল বোলাস আমি কেবল ওপেনজিএল শিখতে শুরু করেছি এবং এই উত্তরটি আমাকে অনেক সাহায্য করেছে। ধন্যবাদ!
ইনলাইন

2
আরে নিকো, কেবল আপনার ছোট্ট টাইপটি উল্লেখ করতে চাই: এটি GL_DRAW_FRAMEBUFFER GL_WRITE_FRAMEBUFFER নয়
Defd

3
@ নিকল: বাহ, এর আগে আমার যে সর্বোত্তম সংজ্ঞা ছিল তা ছিল আপনার আরসিটিসিস টিউটোরিয়াল থেকে, এখন আপনি সেই উজ্জ্বল উত্সকেও ছাড়িয়ে গেছেন। থানকিউ
ব্যাগাররা

20

আমি এটা চেষ্টা করে দেখব ! এগুলি এত জটিল নয়, শর্তগুলির একটি প্রশ্ন, আশা করি আমি নিজেকে পরিষ্কার করব clear


আপনার সিস্টেমে মেমরি উপলব্ধ থাকার কারণে আপনি মোটামুটি টেক্সচার অবজেক্ট তৈরি করতে পারেন । এই বস্তুগুলি glTexParameter দ্বারা সরবরাহিত পরামিতিগুলির সাথে আপনার টেক্সচারের আসল ডেটা (টেক্সেলগুলি) রাখে ( FAQ দেখুন )।

যখন তৈরি করা হচ্ছে, আপনি একটি দায়িত্ব অর্পণ করা আছে বুনট উদ্দিষ্ট এক জমিন বস্তু, যার জমিন ধরণ প্রতিনিধিত্ব করে করার জন্য ( GL_TEXTURE_2D, GL_TEXTURE_3D, GL_TEXTURE_CUBE, ...)।

এই দুটি আইটেম, টেক্সচার অবজেক্ট এবং টেক্সচার টার্গেট টেক্সচার ডেটার প্রতিনিধিত্ব করে। আমরা পরে তাদের কাছে ফিরে আসব।

জমিন ইউনিট

এখন, ওপেনজিএল টেক্সচার ইউনিটগুলির একটি অ্যারে সরবরাহ করে , যা অঙ্কন করার সময় একসাথে ব্যবহার করা যেতে পারে। অ্যারের আকার ওপেনজিএল সিস্টেমের উপর নির্ভর করে, আপনার 8 টি রয়েছে।

আপনি করতে পারেন বাঁধে একটি জমিন ইউনিট একটি জমিন বস্তুর যখন অঙ্কন দেওয়া জমিন ব্যবহার করতে।

একটি সরল এবং সহজ বিশ্বে একটি প্রদত্ত টেক্সচারটি আঁকতে, আপনি টেক্সচার ইউনিটের সাথে একটি টেক্সচার অবজেক্টকে আবদ্ধ করুন এবং আপনি (সিউডোকোড) করবেন:

glTextureUnit[0] = textureObject

জিএল হ'ল একটি রাষ্ট্রীয় মেশিন, হায় হায়, এটি এভাবে কাজ করে না। মনে করুন যে টেক্সচার টার্গেটের textureObjectজন্য আমাদের ডেটা রয়েছে GL_TEXTURE_2D, আমরা পূর্ববর্তী কার্যটি এই হিসাবে প্রকাশ করব:

glActiveTexture(GL_TEXTURE0);                   // select slot 0 of the texture units array
glBindTexture(GL_TEXTURE_2D, textureObject);    // do the binding

নোট করুন যে GL_TEXTURE_2Dপাঠ্যটি আপনি আবদ্ধ করতে চান তার ধরণের উপর নির্ভর করে।

টেক্সচার অবজেক্টস

সিউডো কোডে টেক্সচার ডেটা বা টেক্সচার প্যারামিটার সেট করতে আপনি উদাহরণস্বরূপ এটি করতে চাই:

setTexData(textureObject, ...)
setTexParameter(textureObject, TEXTURE_MIN_FILTER, LINEAR)

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

glBindTexture(GL_TEXTURE_2D, textureObject)       // this 'installs' textureObject in texture unit
glTexImage2D(GL_TEXTURE_2D, ...)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)

shaders

শেডারগুলির সমস্ত টেক্সচার ইউনিটে অ্যাক্সেস রয়েছে, তারা সক্রিয় টেক্সচারের বিষয়ে চিন্তা করে না।

স্যাম্পলার ইউনিফর্মগুলি intস্যাম্পলারের জন্য ব্যবহার করার জন্য টেক্সচার ইউনিটের সূচকের প্রতিনিধিত্বকারী মানগুলি (এবং ব্যবহারের জন্য টেক্সচার অবজেক্ট নয় ) values

সুতরাং আপনি আপনার টেক্সচার অবজেক্টগুলিকে আপনি যে ইউনিটগুলি ব্যবহার করতে চান তার সাথে আবদ্ধ করতে হবে।

নমুনার ধরণটি টেক্সচার ইউনিটে ব্যবহৃত টেক্সচার টার্গেটের সাথে ম্যাচটি করবে: এর Sampler2Dজন্য GL_TEXTURE_2Dএবং আরও ...


একটি জিনিস আমি বুঝতে পারি না। ধরে নেওয়া যাক আমার কিছু টেক্সচার আছে এবং এটি বিভিন্ন টেক্সচার ইউনিটের অনেক শেডারগুলিতে ব্যবহৃত হয়। ধরা যাক আমি রান টাইমে টেক্সচার ফিল্টারিং পরিবর্তন করতে চাই। আমার কোন টেক্সচার ইউনিট ব্যবহার করা উচিত? আমি কি ইউনিট 0 তে টেক্সচারের স্টেট পরিবর্তন করতে পারি এবং তারপরে বিভিন্ন ইউনিটে সেই টেক্সচারটি ব্যবহার করতে পারি?
majakthecoder

@ মজাকথেকোডার আমার উত্তরে, আমি ফিল্টারিংকে টেক্সচার অবজেক্টের সম্পত্তি হিসাবে বিবেচনা করি - যার অর্থ আপনি কোনও টেক্সচার ইউনিটে এটি বিশেষত পরিবর্তন করতে পারবেন না। আপনি টার্গেট করছেন ওপেনএল এর স্বাদের উপর নির্ভর করে আপনি এই সমস্যাটি সমাধান করার জন্য বস্তুগুলিকে স্যাম্পলার করতে সক্ষম হতে পারেন ( ওপেনগ্ল.গ্রা / উইকি / স্যাম্পলার_অজেক্ট ), অন্যথায়, একাধিক একসাথে ফিল্টারিং করতে আপনাকে টেক্সচার অবজেক্টটি নকল করতে হতে পারে।
16:55

12

কিছু পেইন্ট প্রসেসিং প্ল্যান্টের মতো জিপিইউ কল্পনা করুন।

এখানে বেশ কয়েকটি ট্যাঙ্ক রয়েছে, যা কিছু পেইন্টিং মেশিনে রঞ্জক সরবরাহ করে। পেইন্টিং মেশিনে ডাইয়ের পরে বস্তুর সাথে প্রয়োগ করা হয়। সেই ট্যাঙ্কগুলি টেক্সচার ইউনিট

এই ট্যাঙ্কগুলি বিভিন্ন ধরণের ছোপানো সজ্জিত হতে পারে। প্রতিটি ধরণের রঞ্জনের জন্য অন্য কিছু ধরণের দ্রাবক প্রয়োজন। "দ্রাবক" টেক্সচার লক্ষ্য । সুবিধার জন্য প্রতিটি ট্যাঙ্ক কিছু দ্রাবক সরবরাহের সাথে সংযুক্ত থাকে এবং প্রতিটি ট্যাঙ্কে এক সময় কেবল এক ধরণের দ্রাবক ব্যবহার করা যায়। তাই সেখানে একটি ভালভ / সুইচ এর TEXTURE_CUBE_MAP, TEXTURE_3D, TEXTURE_2D, TEXTURE_1D। আপনি একই সাথে ট্যাঙ্কে সমস্ত রঞ্জক প্রকারগুলি পূরণ করতে পারেন তবে যেহেতু কেবল এক ধরণের দ্রাবক প্রবেশ করে, এটি কেবল ধরণের রঙ্গিন মেলাকে "পাতলা" করবে। সুতরাং আপনি প্রতিটি ধরণের টেক্সচারটি আবদ্ধ হতে পারেন, তবে "সর্বাধিক গুরুত্বপূর্ণ" দ্রাবকটির সাথে আবদ্ধ হওয়াটি ট্যাঙ্কের মধ্যে চলে যাবে এবং এটির সাথে সংযুক্ত রঙের সাথে মিশ্রিত হবে।

এবং তারপরে রঞ্জকটি নিজেই রয়েছে যা একটি গুদাম থেকে আসে এবং এটি "বাঁধাই" করে ট্যাঙ্কে ভরা হয়। এটা আপনার জমিন।


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

2
@ মার্ক: আচ্ছা, আমি এমন একজন চিত্রশিল্পীর কথা বলার চেষ্টা করছিলাম যিনি আক্ষরিক রঙ্গক (তেল ভিত্তিক এবং জল ভিত্তিক বলে) নিয়ে কাজ করেন works যাইহোক, হ্যাঁ আপনি যদি একাধিক টেক্সচার লক্ষ্যগুলিকে বাঁধাই ও সক্ষম করে থাকেন তবে এর চেয়ে বেশি নজির রয়েছে: CUBE_MAP> 3D> TEXTURE_ARRAY> 2D> 1D।
ডেটনল্ফ

1
ঝরঝরে! এর নজির আমার জানা ছিল না। এখন আরও বোধগম্য হয়ে উঠেছে যে আমি জানি যে টেক্সচার ইউনিটটিতে কেবলমাত্র একটি টেক্সচার লক্ষ্য ব্যবহার করা যেতে পারে।
এমপেন

1
@ কিংবদন্তি 2 কে: ঠিক আছে, এখন এটি আকর্ষণীয় হয়ে উঠছে। আমরা কি কোর বা সামঞ্জস্যতা প্রোফাইল সম্পর্কে কথা বলছি? আমরা কি আদর্শ, বা বগী ড্রাইভার হিসাবে ধরে নিই? তত্ত্বে ইউনিফর্মের ধরণটি টেক্সচার ইউনিটের কোন লক্ষ্যটি নির্বাচন করতে হবে তা নির্বাচন করে। অনুশীলনে এটি মূল প্রোফাইলে ঘটে। সামঞ্জস্যতা প্রোফাইলে কিছু বগী ড্রাইভার আপনাকে সমস্ত সাদা ডিফল্ট টেক্সচারের সাথে উপস্থাপনের আশা করে যদি টেক্সচার ইউনিটের পূর্ববর্তী লক্ষ্যটি নমুনার ধরণের সাথে মেলে না।
ডেটনওয়ल्फ

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

2

যদি আপনার শেডারে আপনার 2 টেক্সচার থেকে অনুসন্ধান প্রয়োজন:

uniform sampler2D tex1;  
uniform sampler2D tex2;  

টেক্সট 1 এবং টেক্সট 2 এর জন্য তাদের উত্সগুলি নিম্নরূপে ইঙ্গিত করা প্রয়োজন:

tex1 = gl.createTexture();  
gl.activeTexture(gl.TEXTURE3);  
gl.bindTexture(gl.TEXTURE_2D, tex1); 
gl.texParameteri(gl.TEXTURE_2D, ...);  
....


tex2 = gl.createTexture();  
gl.activeTexture(gl.TEXTURE7);  
gl.bindTexture(gl.TEXTURE_2D, tex2); 
gl.texParameteri(gl.TEXTURE_2D, ...);  
....  
var tex1Loc  = gl.getUniformLocation(your_shader,"tex1");  
var tex2Loc  = gl.getUniformLocation(your_shader,"tex2");

রেন্ডার লুপে:

gl.uniform1i(tex1Loc, 3);  
gl.uniform1i(tex2Loc, 7);  
// but you can dynamically change these values

একটি gl_bindtexture সহ, এই জাতীয় কাজ করা সম্ভব নয়। অন্যদিকে রেন্ডারিংয়ের লুপে একটি বাঁধাইয়ের সম্ভাব্য ব্যবহার হ'ল ক্ষেত্রে, যেখানে আপনি স্ট্রিমের একটি সামগ্রী (ভিডিও, ওয়েবক্যাম) দিয়ে একটি জমিন খাওয়ান:

gl.bindTexture(gl.TEXTURE_2D, tex1);  
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, video);  
// in the render loop
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.