একজন WebGL ডেভেলপার হিসেবে, আপনি WebGPU ব্যবহার শুরু করার জন্য ভয় ও উত্তেজিত হতে পারেন, WebGL-এর উত্তরসূরি যা ওয়েবে আধুনিক গ্রাফিক্স API-এর অগ্রগতি নিয়ে আসে।
এটা জেনে আশ্বস্ত হয় যে WebGL এবং WebGPU অনেকগুলি মূল ধারণা শেয়ার করে৷ উভয় APIই আপনাকে GPU-তে শেডার নামে ছোট প্রোগ্রাম চালানোর অনুমতি দেয়। WebGL ভার্টেক্স এবং ফ্র্যাগমেন্ট শেডার সমর্থন করে, WebGPU এছাড়াও কম্পিউট শেডার সমর্থন করে। WebGL ওপেনজিএল শেডিং ল্যাঙ্গুয়েজ (GLSL) ব্যবহার করে যখন WebGPU ব্যবহার করে WebGPU শেডিং ল্যাঙ্গুয়েজ (WGSL)। যদিও দুটি ভাষা ভিন্ন, অন্তর্নিহিত ধারণাগুলি বেশিরভাগই একই।
সেই কথা মাথায় রেখে, আপনাকে শুরু করতে সাহায্য করতে এই নিবন্ধটি WebGL এবং WebGPU-এর মধ্যে কিছু পার্থক্য তুলে ধরে।
বৈশ্বিক রাষ্ট্র
ওয়েবজিএল-এর প্রচুর গ্লোবাল স্টেট রয়েছে। কিছু সেটিংস সমস্ত রেন্ডারিং অপারেশনে প্রযোজ্য, যেমন কোন টেক্সচার এবং বাফারগুলি আবদ্ধ। আপনি বিভিন্ন API ফাংশন কল করে এই গ্লোবাল স্টেট সেট করেন এবং আপনি এটি পরিবর্তন না করা পর্যন্ত এটি কার্যকর থাকে। ওয়েবজিএল-এর গ্লোবাল স্টেট হল ত্রুটির একটি প্রধান উৎস , কারণ একটি গ্লোবাল সেটিং পরিবর্তন করতে ভুলে যাওয়া সহজ। উপরন্তু, গ্লোবাল স্টেট কোড শেয়ারিংকে কঠিন করে তোলে, কারণ ডেভেলপারদের সতর্কতা অবলম্বন করতে হবে যাতে ভুলবশত গ্লোবাল স্টেট এমনভাবে পরিবর্তন না হয় যা কোডের অন্যান্য অংশকে প্রভাবিত করে।
WebGPU একটি রাষ্ট্রহীন API, এবং এটি একটি বিশ্বব্যাপী অবস্থা বজায় রাখে না। পরিবর্তে, এটি একটি পাইপলাইনের ধারণা ব্যবহার করে সমস্ত রেন্ডারিং স্টেটকে এনক্যাপসুলেট করে যা WebGL-এ বিশ্বব্যাপী ছিল। একটি পাইপলাইনে কোন ব্লেন্ডিং, টপোলজি এবং অ্যাট্রিবিউটগুলি ব্যবহার করার মতো তথ্য থাকে৷ একটি পাইপলাইন অপরিবর্তনীয়। আপনি যদি কিছু সেটিংস পরিবর্তন করতে চান তবে আপনাকে আরেকটি পাইপলাইন তৈরি করতে হবে। WebGPU কমান্ড এনকোডারগুলিকে একত্রে ব্যাচ করতে এবং সেগুলি যে ক্রমে রেকর্ড করা হয়েছিল সেই ক্রমে চালায়। এটি শ্যাডো ম্যাপিং-এর ক্ষেত্রে উপযোগী, উদাহরণস্বরূপ, যেখানে, বস্তুর উপর একক পাসে, অ্যাপ্লিকেশন একাধিক কমান্ড স্ট্রিম রেকর্ড করতে পারে, প্রতিটি আলোর ছায়া মানচিত্রের জন্য একটি।
সংক্ষেপে বলতে গেলে, WebGL-এর গ্লোবাল স্টেট মডেল যেমন শক্তিশালী, কম্পোজেবল লাইব্রেরি এবং অ্যাপ্লিকেশনগুলিকে কঠিন এবং ভঙ্গুর করে তুলেছে, WebGPU উল্লেখযোগ্যভাবে সেই পরিমাণ হ্রাস করেছে যা ডেভেলপারদের GPU-তে কমান্ড পাঠানোর সময় ট্র্যাক রাখতে হবে।
আর সিঙ্ক করবেন না
GPU-তে, কমান্ড পাঠানো এবং সিঙ্ক্রোনাসভাবে তাদের জন্য অপেক্ষা করা সাধারণত অদক্ষ, কারণ এটি পাইপলাইন ফ্লাশ করতে পারে এবং বুদবুদ সৃষ্টি করতে পারে। এটি বিশেষ করে WebGPU এবং WebGL-এর ক্ষেত্রে সত্য, যেগুলি জাভাস্ক্রিপ্ট থেকে একটি পৃথক প্রক্রিয়ায় চলমান GPU ড্রাইভার সহ একটি মাল্টি-প্রসেস আর্কিটেকচার ব্যবহার করে।
WebGL-এ, উদাহরণস্বরূপ, gl.getError()
কল করার জন্য JavaScript প্রক্রিয়া থেকে GPU প্রক্রিয়া এবং পিছনে একটি সিঙ্ক্রোনাস আইপিসি প্রয়োজন। দুটি প্রক্রিয়া যোগাযোগের ফলে এটি CPU পাশে একটি বুদবুদ সৃষ্টি করতে পারে।
এই বুদবুদগুলি এড়াতে, WebGPU সম্পূর্ণরূপে অ্যাসিঙ্ক্রোনাস করার জন্য ডিজাইন করা হয়েছে৷ ত্রুটি মডেল এবং অন্যান্য সমস্ত অপারেশন অ্যাসিঙ্ক্রোনাসভাবে ঘটে। উদাহরণস্বরূপ, যখন আপনি একটি টেক্সচার তৈরি করেন, অপারেশনটি অবিলম্বে সফল হতে দেখা যায়, এমনকি টেক্সচারটি আসলে একটি ত্রুটি হলেও। আপনি শুধুমাত্র অ্যাসিঙ্ক্রোনাসভাবে ত্রুটিটি আবিষ্কার করতে পারেন। এই নকশা ক্রস-প্রক্রিয়া যোগাযোগ বুদ্বুদ-মুক্ত রাখে এবং অ্যাপ্লিকেশনগুলিকে নির্ভরযোগ্য কর্মক্ষমতা দেয়।
শেডার গণনা করুন
কম্পিউট শেডার হল এমন প্রোগ্রাম যা সাধারণ-উদ্দেশ্য কম্পিউটেশন করতে GPU-তে চলে। এগুলি শুধুমাত্র WebGPU-তে উপলব্ধ, WebGL নয়৷
ভার্টেক্স এবং ফ্র্যাগমেন্ট শেডারের বিপরীতে, এগুলি গ্রাফিক্স প্রক্রিয়াকরণের মধ্যে সীমাবদ্ধ নয়, এবং মেশিন লার্নিং, পদার্থবিদ্যা সিমুলেশন এবং বৈজ্ঞানিক কম্পিউটিং এর মতো বিভিন্ন কাজের জন্য ব্যবহার করা যেতে পারে। কম্পিউট শেডারগুলি সমান্তরালভাবে শত শত বা হাজার হাজার থ্রেড দ্বারা কার্যকর করা হয়, যা তাদেরকে বড় ডেটাসেট প্রক্রিয়াকরণের জন্য অত্যন্ত দক্ষ করে তোলে। WebGPU সম্পর্কে এই বিস্তৃত নিবন্ধে GPU কম্পিউট এবং আরও বিশদ সম্পর্কে জানুন।
ভিডিও ফ্রেম প্রক্রিয়াকরণ
JavaScript এবং WebAssembly ব্যবহার করে ভিডিও ফ্রেম প্রক্রিয়াকরণের কিছু ত্রুটি রয়েছে: GPU মেমরি থেকে CPU মেমরিতে ডেটা অনুলিপি করার খরচ, এবং সীমিত সমান্তরালতা যা কর্মীদের এবং CPU থ্রেডগুলির সাথে অর্জন করা যেতে পারে। ওয়েবজিপিইউ-এর সেই সীমাবদ্ধতা নেই, এটি ওয়েবকোডেক্স API-এর সাথে শক্ত একীকরণের জন্য ভিডিও ফ্রেম প্রক্রিয়াকরণের জন্য এটিকে একটি দুর্দান্ত উপযুক্ত করে তুলেছে।
নিম্নলিখিত কোড স্নিপেট দেখায় কিভাবে WebGPU-তে একটি বাহ্যিক টেক্সচার হিসাবে একটি VideoFrame আমদানি করতে হয় এবং এটি প্রক্রিয়া করতে হয়। আপনি এই ডেমো চেষ্টা করে দেখতে পারেন.
// Init WebGPU device and pipeline...
// Configure canvas context...
// Feed camera stream to video...
(function render() {
const videoFrame = new VideoFrame(video);
applyFilter(videoFrame);
requestAnimationFrame(render);
})();
function applyFilter(videoFrame) {
const texture = device.importExternalTexture({ source: videoFrame });
const bindgroup = device.createBindGroup({
layout: pipeline.getBindGroupLayout(0),
entries: [{ binding: 0, resource: texture }],
});
// Finally, submit commands to GPU
}
ডিফল্টরূপে অ্যাপ্লিকেশন বহনযোগ্যতা
WebGPU আপনাকে limits
অনুরোধ করতে বাধ্য করে। ডিফল্টরূপে, requestDevice()
একটি GPUDevice ফেরত দেয় যা শারীরিক ডিভাইসের হার্ডওয়্যার ক্ষমতার সাথে মেলে না, বরং একটি যুক্তিসঙ্গত এবং সব GPU-এর সর্বনিম্ন সাধারণ ডিনোমিনেটর। ডেভেলপারদের ডিভাইস সীমার অনুরোধ করার জন্য, WebGPU নিশ্চিত করে যে অ্যাপ্লিকেশনগুলি যতটা সম্ভব ডিভাইসে চলবে।
ক্যানভাস হ্যান্ডলিং
আপনি একটি WebGL প্রসঙ্গ তৈরি করার পরে WebGL স্বয়ংক্রিয়ভাবে ক্যানভাস পরিচালনা করে এবং আলফা, অ্যান্টিলিয়াস, কালারস্পেস, গভীরতা, সংরক্ষণ ড্রয়িংবাফার বা স্টেনসিলের মতো প্রসঙ্গ বৈশিষ্ট্যগুলি সরবরাহ করে।
অন্যদিকে, WebGPU-এর জন্য আপনাকে ক্যানভাস নিজেই পরিচালনা করতে হবে। উদাহরণস্বরূপ, WebGPU-তে অ্যান্টিলিয়াসিং অর্জন করতে, আপনি একটি বহু নমুনা টেক্সচার তৈরি করবেন এবং এটিতে রেন্ডার করবেন। তারপর, আপনি একটি নিয়মিত টেক্সচারে মাল্টিস্যাম্পল টেক্সচার সমাধান করবেন এবং সেই টেক্সচারটিকে ক্যানভাসে আঁকবেন। এই ম্যানুয়াল ম্যানেজমেন্ট আপনাকে একটি একক GPUDevice অবজেক্ট থেকে যতগুলি চান ততগুলি ক্যানভাসে আউটপুট করতে দেয়। বিপরীতে, WebGL প্রতি ক্যানভাসে শুধুমাত্র একটি প্রসঙ্গ তৈরি করতে পারে।
WebGPU একাধিক ক্যানভাসেস ডেমো দেখুন।
একটি পার্শ্ব নোটে, ব্রাউজারগুলির বর্তমানে প্রতি পৃষ্ঠায় WebGL ক্যানভাসের সংখ্যার একটি সীমা রয়েছে৷ লেখার সময়, Chrome এবং Safari একসাথে 16টি পর্যন্ত WebGL ক্যানভাস ব্যবহার করতে পারে; Firefox তাদের মধ্যে 200টি পর্যন্ত তৈরি করতে পারে। অন্যদিকে, প্রতি পৃষ্ঠায় WebGPU ক্যানভাসের সংখ্যার কোনো সীমা নেই।

সহায়ক ত্রুটি বার্তা
WebGPU API থেকে ফেরত আসা প্রতিটি বার্তার জন্য একটি কল স্ট্যাক প্রদান করে। এর মানে হল যে আপনার কোডে কোথায় ত্রুটি ঘটেছে তা আপনি দ্রুত দেখতে পারবেন, যা ত্রুটিগুলি ডিবাগিং এবং ঠিক করার জন্য সহায়ক ৷
একটি কল স্ট্যাক প্রদানের পাশাপাশি, WebGPU ত্রুটি বার্তাগুলিও বোঝা সহজ এবং পদক্ষেপযোগ্য। ত্রুটির বার্তাগুলিতে সাধারণত ত্রুটির বিবরণ এবং ত্রুটিটি কীভাবে ঠিক করা যায় তার পরামর্শ অন্তর্ভুক্ত থাকে।
WebGPU আপনাকে প্রতিটি WebGPU অবজেক্টের জন্য একটি কাস্টম label
প্রদান করার অনুমতি দেয়। এই লেবেলটি ব্রাউজার দ্বারা GPUError বার্তা, কনসোল সতর্কতা এবং ব্রাউজার বিকাশকারী সরঞ্জামগুলিতে ব্যবহার করা হয়।
নাম থেকে সূচী পর্যন্ত
WebGL-এ, অনেক কিছু নাম দ্বারা সংযুক্ত থাকে। উদাহরণস্বরূপ, আপনি GLSL-এ myUniform
নামে একটি অভিন্ন পরিবর্তনশীল ঘোষণা করতে পারেন এবং gl.getUniformLocation(program, 'myUniform')
ব্যবহার করে এর অবস্থান পেতে পারেন। আপনি যদি ইউনিফর্ম ভেরিয়েবলের নাম ভুল টাইপ করেন তবে আপনি একটি ত্রুটি পেতে এটি কার্যকর হয়।
অন্যদিকে, WebGPU-তে, সবকিছু সম্পূর্ণরূপে বাইট অফসেট বা সূচক দ্বারা সংযুক্ত থাকে (প্রায়ই লোকেশন বলা হয়)। WGSL এবং JavaScript-এ কোডের অবস্থানগুলিকে সিঙ্কে রাখা আপনার দায়িত্ব৷
মিপম্যাপ প্রজন্ম
WebGL-এ, আপনি একটি টেক্সচারের স্তর 0 mip তৈরি করতে পারেন এবং তারপরে কল করতে পারেন gl.generateMipmap()
। WebGL তারপর আপনার জন্য অন্য সব মিপ লেভেল তৈরি করবে।
WebGPU-তে, আপনাকে অবশ্যই মিপম্যাপ তৈরি করতে হবে। এটি করার জন্য কোন বিল্ট-ইন ফাংশন নেই। সিদ্ধান্ত সম্পর্কে আরও জানতে বিশেষ আলোচনা দেখুন। আপনি সহজ লাইব্রেরি যেমন webgpu-utils ব্যবহার করতে পারেন মিপম্যাপ তৈরি করতে বা নিজে কীভাবে করবেন তা শিখতে পারেন।
স্টোরেজ বাফার এবং স্টোরেজ টেক্সচার
ইউনিফর্ম বাফারগুলি WebGL এবং WebGPU উভয় দ্বারা সমর্থিত এবং আপনাকে সীমিত আকারের ধ্রুবক পরামিতিগুলিকে শেডারের কাছে পাস করার অনুমতি দেয়। স্টোরেজ বাফার, যা দেখতে অনেকটা ইউনিফর্ম বাফারের মতো, শুধুমাত্র WebGPU দ্বারা সমর্থিত এবং ইউনিফর্ম বাফারের চেয়ে বেশি শক্তিশালী এবং নমনীয়।
শেডারের কাছে পাঠানো স্টোরেজ বাফার ডেটা ইউনিফর্ম বাফারের চেয়ে অনেক বড় হতে পারে। যদিও স্পেক বলছে ইউনিফর্ম বাফার বাইন্ডিং এর সাইজ 64KB পর্যন্ত হতে পারে (
maxUniformBufferBindingSize
দেখুন), একটি স্টোরেজ বাফার বাইন্ডিং এর সর্বোচ্চ সাইজ WebGPU তে কমপক্ষে 128MB (maxStorageBufferBindingSize
দেখুন)।স্টোরেজ বাফারগুলি লেখার যোগ্য, এবং কিছু পারমাণবিক ক্রিয়াকলাপ সমর্থন করে যখন ইউনিফর্ম বাফারগুলি কেবলমাত্র পঠনযোগ্য। এটি অ্যালগরিদমের নতুন ক্লাস বাস্তবায়নের অনুমতি দেয়।
স্টোরেজ বাফার বাইন্ডিংগুলি আরও নমনীয় অ্যালগরিদমের জন্য রানটাইম-আকারের অ্যারে সমর্থন করে, যখন ইউনিফর্ম বাফার অ্যারে আকারগুলি শেডারে সরবরাহ করতে হবে।
স্টোরেজ টেক্সচার শুধুমাত্র WebGPU-তে সমর্থিত, এবং ইউনিফর্ম বাফারের জন্য স্টোরেজ বাফারগুলি কী টেক্সচার করা হয়। এগুলি নিয়মিত টেক্সচারের চেয়ে বেশি নমনীয়, র্যান্ডম অ্যাক্সেস রাইটে সমর্থন করে (এবং ভবিষ্যতেও পড়া যায়)।
বাফার এবং টেক্সচার পরিবর্তন
WebGL-এ, আপনি একটি বাফার বা টেক্সচার তৈরি করতে পারেন এবং তারপরে উদাহরণের জন্য যথাক্রমে gl.bufferData()
এবং gl.texImage2D()
দিয়ে যে কোনো সময় এর আকার পরিবর্তন করতে পারেন।
WebGPU-তে, বাফার এবং টেক্সচার অপরিবর্তনীয়। এর মানে হল যে আপনি তাদের আকার, ব্যবহার বা বিন্যাস তৈরি করার পরে পরিবর্তন করতে পারবেন না। আপনি শুধুমাত্র তাদের বিষয়বস্তু পরিবর্তন করতে পারেন.
স্পেস কনভেনশন পার্থক্য
WebGL-এ, Z ক্লিপ স্পেস রেঞ্জ হল -1 থেকে 1। WebGPU-তে, Z ক্লিপ স্পেস রেঞ্জ হল 0 থেকে 1। এর মানে হল যে 0 এর az মান সহ বস্তুগুলি ক্যামেরার সবচেয়ে কাছের, যখন 1 এর az মান সহ বস্তুগুলি সবচেয়ে দূরে।
WebGL OpenGL কনভেনশন ব্যবহার করে, যেখানে Y অক্ষ উপরে থাকে এবং Z অক্ষ দর্শকের দিকে থাকে। WebGPU মেটাল কনভেনশন ব্যবহার করে, যেখানে Y অক্ষ নিচে থাকে এবং Z অক্ষ স্ক্রীনের বাইরে থাকে। মনে রাখবেন যে ফ্রেমবাফার কোঅর্ডিনেট, ভিউপোর্ট কোঅর্ডিনেট এবং ফ্র্যাগমেন্ট/পিক্সেল কোঅর্ডিনেটে Y অক্ষের দিক নিচে রয়েছে। ক্লিপ স্পেসে, Y অক্ষের দিক এখনও WebGL-এর মতোই উপরে রয়েছে।
স্বীকৃতি
এই নিবন্ধটি পর্যালোচনা করার জন্য Corentin Wallez, Gregg Tavares, Stephen White, Ken Russell, এবং Rachel Andrew কে ধন্যবাদ।
আমি WebGPU এবং WebGL-এর মধ্যে পার্থক্যগুলি গভীরভাবে দেখার জন্য WebGPUFundamentals.org সুপারিশ করছি৷
,একজন WebGL ডেভেলপার হিসেবে, আপনি WebGPU ব্যবহার শুরু করার জন্য ভয় ও উত্তেজিত হতে পারেন, WebGL-এর উত্তরসূরি যা ওয়েবে আধুনিক গ্রাফিক্স API-এর অগ্রগতি নিয়ে আসে।
এটা জেনে আশ্বস্ত হয় যে WebGL এবং WebGPU অনেকগুলি মূল ধারণা শেয়ার করে৷ উভয় APIই আপনাকে GPU-তে শেডার নামে ছোট প্রোগ্রাম চালানোর অনুমতি দেয়। WebGL ভার্টেক্স এবং ফ্র্যাগমেন্ট শেডার সমর্থন করে, WebGPU এছাড়াও কম্পিউট শেডার সমর্থন করে। WebGL ওপেনজিএল শেডিং ল্যাঙ্গুয়েজ (GLSL) ব্যবহার করে যখন WebGPU ব্যবহার করে WebGPU শেডিং ল্যাঙ্গুয়েজ (WGSL)। যদিও দুটি ভাষা ভিন্ন, অন্তর্নিহিত ধারণাগুলি বেশিরভাগই একই।
সেই কথা মাথায় রেখে, আপনাকে শুরু করতে সাহায্য করতে এই নিবন্ধটি WebGL এবং WebGPU-এর মধ্যে কিছু পার্থক্য তুলে ধরে।
বৈশ্বিক রাষ্ট্র
ওয়েবজিএল-এর প্রচুর গ্লোবাল স্টেট রয়েছে। কিছু সেটিংস সমস্ত রেন্ডারিং অপারেশনে প্রযোজ্য, যেমন কোন টেক্সচার এবং বাফারগুলি আবদ্ধ। আপনি বিভিন্ন API ফাংশন কল করে এই গ্লোবাল স্টেট সেট করেন এবং আপনি এটি পরিবর্তন না করা পর্যন্ত এটি কার্যকর থাকে। ওয়েবজিএল-এর গ্লোবাল স্টেট হল ত্রুটির একটি প্রধান উৎস , কারণ একটি গ্লোবাল সেটিং পরিবর্তন করতে ভুলে যাওয়া সহজ। উপরন্তু, গ্লোবাল স্টেট কোড শেয়ারিংকে কঠিন করে তোলে, কারণ ডেভেলপারদের সতর্কতা অবলম্বন করতে হবে যাতে ভুলবশত গ্লোবাল স্টেট এমনভাবে পরিবর্তন না হয় যা কোডের অন্যান্য অংশকে প্রভাবিত করে।
WebGPU একটি রাষ্ট্রহীন API, এবং এটি একটি বিশ্বব্যাপী অবস্থা বজায় রাখে না। পরিবর্তে, এটি একটি পাইপলাইনের ধারণা ব্যবহার করে সমস্ত রেন্ডারিং স্টেটকে এনক্যাপসুলেট করে যা WebGL-এ বিশ্বব্যাপী ছিল। একটি পাইপলাইনে কোন ব্লেন্ডিং, টপোলজি এবং অ্যাট্রিবিউটগুলি ব্যবহার করার মতো তথ্য থাকে৷ একটি পাইপলাইন অপরিবর্তনীয়। আপনি যদি কিছু সেটিংস পরিবর্তন করতে চান তবে আপনাকে আরেকটি পাইপলাইন তৈরি করতে হবে। WebGPU কমান্ড এনকোডারগুলিকে একত্রে ব্যাচ করতে এবং সেগুলি যে ক্রমে রেকর্ড করা হয়েছিল সেই ক্রমে চালায়। এটি শ্যাডো ম্যাপিং-এর ক্ষেত্রে উপযোগী, উদাহরণস্বরূপ, যেখানে, বস্তুর উপর একক পাসে, অ্যাপ্লিকেশন একাধিক কমান্ড স্ট্রিম রেকর্ড করতে পারে, প্রতিটি আলোর ছায়া মানচিত্রের জন্য একটি।
সংক্ষেপে বলতে গেলে, WebGL-এর গ্লোবাল স্টেট মডেল যেমন শক্তিশালী, কম্পোজেবল লাইব্রেরি এবং অ্যাপ্লিকেশনগুলিকে কঠিন এবং ভঙ্গুর করে তুলেছে, WebGPU উল্লেখযোগ্যভাবে সেই পরিমাণ হ্রাস করেছে যা ডেভেলপারদের GPU-তে কমান্ড পাঠানোর সময় ট্র্যাক রাখতে হবে।
আর সিঙ্ক করবেন না
GPU-তে, কমান্ড পাঠানো এবং সিঙ্ক্রোনাসভাবে তাদের জন্য অপেক্ষা করা সাধারণত অদক্ষ, কারণ এটি পাইপলাইন ফ্লাশ করতে পারে এবং বুদবুদ সৃষ্টি করতে পারে। এটি বিশেষ করে WebGPU এবং WebGL-এর ক্ষেত্রে সত্য, যেগুলি জাভাস্ক্রিপ্ট থেকে একটি পৃথক প্রক্রিয়ায় চলমান GPU ড্রাইভার সহ একটি মাল্টি-প্রসেস আর্কিটেকচার ব্যবহার করে।
WebGL-এ, উদাহরণস্বরূপ, gl.getError()
কল করার জন্য JavaScript প্রক্রিয়া থেকে GPU প্রক্রিয়া এবং পিছনে একটি সিঙ্ক্রোনাস আইপিসি প্রয়োজন। দুটি প্রক্রিয়া যোগাযোগের ফলে এটি CPU পাশে একটি বুদবুদ সৃষ্টি করতে পারে।
এই বুদবুদগুলি এড়াতে, WebGPU সম্পূর্ণরূপে অ্যাসিঙ্ক্রোনাস করার জন্য ডিজাইন করা হয়েছে৷ ত্রুটি মডেল এবং অন্যান্য সমস্ত অপারেশন অ্যাসিঙ্ক্রোনাসভাবে ঘটে। উদাহরণস্বরূপ, যখন আপনি একটি টেক্সচার তৈরি করেন, অপারেশনটি অবিলম্বে সফল হতে দেখা যায়, এমনকি টেক্সচারটি আসলে একটি ত্রুটি হলেও। আপনি শুধুমাত্র অ্যাসিঙ্ক্রোনাসভাবে ত্রুটিটি আবিষ্কার করতে পারেন। এই নকশা ক্রস-প্রক্রিয়া যোগাযোগ বুদ্বুদ-মুক্ত রাখে এবং অ্যাপ্লিকেশনগুলিকে নির্ভরযোগ্য কর্মক্ষমতা দেয়।
শেডার গণনা করুন
কম্পিউট শেডার হল এমন প্রোগ্রাম যা সাধারণ-উদ্দেশ্য কম্পিউটেশন করতে GPU-তে চলে। এগুলি শুধুমাত্র WebGPU-তে উপলব্ধ, WebGL নয়৷
ভার্টেক্স এবং ফ্র্যাগমেন্ট শেডারের বিপরীতে, এগুলি গ্রাফিক্স প্রক্রিয়াকরণের মধ্যে সীমাবদ্ধ নয়, এবং মেশিন লার্নিং, পদার্থবিদ্যা সিমুলেশন এবং বৈজ্ঞানিক কম্পিউটিং এর মতো বিভিন্ন কাজের জন্য ব্যবহার করা যেতে পারে। কম্পিউট শেডারগুলি সমান্তরালভাবে শত শত বা হাজার হাজার থ্রেড দ্বারা কার্যকর করা হয়, যা তাদেরকে বড় ডেটাসেট প্রক্রিয়াকরণের জন্য অত্যন্ত দক্ষ করে তোলে। WebGPU সম্পর্কে এই বিস্তৃত নিবন্ধে GPU কম্পিউট এবং আরও বিশদ সম্পর্কে জানুন।
ভিডিও ফ্রেম প্রক্রিয়াকরণ
JavaScript এবং WebAssembly ব্যবহার করে ভিডিও ফ্রেম প্রক্রিয়াকরণের কিছু ত্রুটি রয়েছে: GPU মেমরি থেকে CPU মেমরিতে ডেটা অনুলিপি করার খরচ, এবং সীমিত সমান্তরালতা যা কর্মীদের এবং CPU থ্রেডগুলির সাথে অর্জন করা যেতে পারে। ওয়েবজিপিইউ-এর সেই সীমাবদ্ধতা নেই, এটি ওয়েবকোডেক্স API-এর সাথে শক্ত একীকরণের জন্য ভিডিও ফ্রেম প্রক্রিয়াকরণের জন্য এটিকে একটি দুর্দান্ত উপযুক্ত করে তুলেছে।
নিম্নলিখিত কোড স্নিপেট দেখায় কিভাবে WebGPU-তে একটি বাহ্যিক টেক্সচার হিসাবে একটি VideoFrame আমদানি করতে হয় এবং এটি প্রক্রিয়া করতে হয়। আপনি এই ডেমো চেষ্টা করে দেখতে পারেন.
// Init WebGPU device and pipeline...
// Configure canvas context...
// Feed camera stream to video...
(function render() {
const videoFrame = new VideoFrame(video);
applyFilter(videoFrame);
requestAnimationFrame(render);
})();
function applyFilter(videoFrame) {
const texture = device.importExternalTexture({ source: videoFrame });
const bindgroup = device.createBindGroup({
layout: pipeline.getBindGroupLayout(0),
entries: [{ binding: 0, resource: texture }],
});
// Finally, submit commands to GPU
}
ডিফল্টরূপে অ্যাপ্লিকেশন বহনযোগ্যতা
WebGPU আপনাকে limits
অনুরোধ করতে বাধ্য করে। ডিফল্টরূপে, requestDevice()
একটি GPUDevice ফেরত দেয় যা শারীরিক ডিভাইসের হার্ডওয়্যার ক্ষমতার সাথে মেলে না, বরং একটি যুক্তিসঙ্গত এবং সব GPU-এর সর্বনিম্ন সাধারণ ডিনোমিনেটর। ডেভেলপারদের ডিভাইস সীমার অনুরোধ করার জন্য, WebGPU নিশ্চিত করে যে অ্যাপ্লিকেশনগুলি যতটা সম্ভব ডিভাইসে চলবে।
ক্যানভাস হ্যান্ডলিং
আপনি একটি WebGL প্রসঙ্গ তৈরি করার পরে WebGL স্বয়ংক্রিয়ভাবে ক্যানভাস পরিচালনা করে এবং আলফা, অ্যান্টিলিয়াস, কালারস্পেস, গভীরতা, সংরক্ষণ ড্রয়িংবাফার বা স্টেনসিলের মতো প্রসঙ্গ বৈশিষ্ট্যগুলি সরবরাহ করে।
অন্যদিকে, WebGPU-এর জন্য আপনাকে ক্যানভাস নিজেই পরিচালনা করতে হবে। উদাহরণস্বরূপ, WebGPU-তে অ্যান্টিলিয়াসিং অর্জন করতে, আপনি একটি বহু নমুনা টেক্সচার তৈরি করবেন এবং এটিতে রেন্ডার করবেন। তারপর, আপনি একটি নিয়মিত টেক্সচারে মাল্টিস্যাম্পল টেক্সচার সমাধান করবেন এবং সেই টেক্সচারটিকে ক্যানভাসে আঁকবেন। এই ম্যানুয়াল ম্যানেজমেন্ট আপনাকে একটি একক GPUDevice অবজেক্ট থেকে যতগুলি চান ততগুলি ক্যানভাসে আউটপুট করতে দেয়। বিপরীতে, WebGL প্রতি ক্যানভাসে শুধুমাত্র একটি প্রসঙ্গ তৈরি করতে পারে।
WebGPU একাধিক ক্যানভাসেস ডেমো দেখুন।
একটি পার্শ্ব নোটে, ব্রাউজারগুলির বর্তমানে প্রতি পৃষ্ঠায় WebGL ক্যানভাসের সংখ্যার একটি সীমা রয়েছে৷ লেখার সময়, Chrome এবং Safari একসাথে 16টি পর্যন্ত WebGL ক্যানভাস ব্যবহার করতে পারে; Firefox তাদের মধ্যে 200টি পর্যন্ত তৈরি করতে পারে। অন্যদিকে, প্রতি পৃষ্ঠায় WebGPU ক্যানভাসের সংখ্যার কোনো সীমা নেই।

সহায়ক ত্রুটি বার্তা
WebGPU API থেকে ফেরত আসা প্রতিটি বার্তার জন্য একটি কল স্ট্যাক প্রদান করে। এর মানে হল যে আপনার কোডে কোথায় ত্রুটি ঘটেছে তা আপনি দ্রুত দেখতে পারবেন, যা ত্রুটিগুলি ডিবাগিং এবং ঠিক করার জন্য সহায়ক ৷
একটি কল স্ট্যাক প্রদানের পাশাপাশি, WebGPU ত্রুটি বার্তাগুলিও বোঝা সহজ এবং পদক্ষেপযোগ্য। ত্রুটির বার্তাগুলিতে সাধারণত ত্রুটির বিবরণ এবং ত্রুটিটি কীভাবে ঠিক করা যায় তার পরামর্শ অন্তর্ভুক্ত থাকে।
WebGPU আপনাকে প্রতিটি WebGPU অবজেক্টের জন্য একটি কাস্টম label
প্রদান করার অনুমতি দেয়। এই লেবেলটি ব্রাউজার দ্বারা GPUError বার্তা, কনসোল সতর্কতা এবং ব্রাউজার বিকাশকারী সরঞ্জামগুলিতে ব্যবহার করা হয়।
নাম থেকে সূচী পর্যন্ত
WebGL-এ, অনেক কিছু নাম দ্বারা সংযুক্ত থাকে। উদাহরণস্বরূপ, আপনি GLSL-এ myUniform
নামে একটি অভিন্ন পরিবর্তনশীল ঘোষণা করতে পারেন এবং gl.getUniformLocation(program, 'myUniform')
ব্যবহার করে এর অবস্থান পেতে পারেন। আপনি যদি ইউনিফর্ম ভেরিয়েবলের নাম ভুল টাইপ করেন তবে আপনি একটি ত্রুটি পেতে এটি কার্যকর হয়।
অন্যদিকে, WebGPU-তে, সবকিছু সম্পূর্ণরূপে বাইট অফসেট বা সূচক দ্বারা সংযুক্ত থাকে (প্রায়ই লোকেশন বলা হয়)। WGSL এবং JavaScript-এ কোডের অবস্থানগুলিকে সিঙ্কে রাখা আপনার দায়িত্ব৷
মিপম্যাপ প্রজন্ম
WebGL-এ, আপনি একটি টেক্সচারের স্তর 0 mip তৈরি করতে পারেন এবং তারপরে কল করতে পারেন gl.generateMipmap()
। WebGL তারপর আপনার জন্য অন্য সব মিপ লেভেল তৈরি করবে।
WebGPU-তে, আপনাকে অবশ্যই মিপম্যাপ তৈরি করতে হবে। এটি করার জন্য কোন বিল্ট-ইন ফাংশন নেই। সিদ্ধান্ত সম্পর্কে আরও জানতে বিশেষ আলোচনা দেখুন। আপনি সহজ লাইব্রেরি যেমন webgpu-utils ব্যবহার করতে পারেন মিপম্যাপ তৈরি করতে বা নিজে কীভাবে করবেন তা শিখতে পারেন।
স্টোরেজ বাফার এবং স্টোরেজ টেক্সচার
ইউনিফর্ম বাফারগুলি WebGL এবং WebGPU উভয় দ্বারা সমর্থিত এবং আপনাকে সীমিত আকারের ধ্রুবক পরামিতিগুলিকে শেডারের কাছে পাস করার অনুমতি দেয়। স্টোরেজ বাফার, যা দেখতে অনেকটা ইউনিফর্ম বাফারের মতো, শুধুমাত্র WebGPU দ্বারা সমর্থিত এবং ইউনিফর্ম বাফারের চেয়ে বেশি শক্তিশালী এবং নমনীয়।
শেডারের কাছে পাঠানো স্টোরেজ বাফার ডেটা ইউনিফর্ম বাফারের চেয়ে অনেক বড় হতে পারে। যদিও স্পেক বলছে ইউনিফর্ম বাফার বাইন্ডিং এর সাইজ 64KB পর্যন্ত হতে পারে (
maxUniformBufferBindingSize
দেখুন), একটি স্টোরেজ বাফার বাইন্ডিং এর সর্বোচ্চ সাইজ WebGPU তে কমপক্ষে 128MB (maxStorageBufferBindingSize
দেখুন)।স্টোরেজ বাফারগুলি লেখার যোগ্য, এবং কিছু পারমাণবিক ক্রিয়াকলাপ সমর্থন করে যখন ইউনিফর্ম বাফারগুলি কেবলমাত্র পঠনযোগ্য। এটি অ্যালগরিদমের নতুন ক্লাস বাস্তবায়নের অনুমতি দেয়।
স্টোরেজ বাফার বাইন্ডিংগুলি আরও নমনীয় অ্যালগরিদমের জন্য রানটাইম-আকারের অ্যারে সমর্থন করে, যখন ইউনিফর্ম বাফার অ্যারে আকারগুলি শেডারে সরবরাহ করতে হবে।
স্টোরেজ টেক্সচার শুধুমাত্র WebGPU-তে সমর্থিত, এবং ইউনিফর্ম বাফারের জন্য স্টোরেজ বাফারগুলি কী টেক্সচার করা হয়। এগুলি নিয়মিত টেক্সচারের চেয়ে বেশি নমনীয়, র্যান্ডম অ্যাক্সেস রাইটে সমর্থন করে (এবং ভবিষ্যতেও পড়া যায়)।
বাফার এবং টেক্সচার পরিবর্তন
WebGL-এ, আপনি একটি বাফার বা টেক্সচার তৈরি করতে পারেন এবং তারপরে উদাহরণের জন্য যথাক্রমে gl.bufferData()
এবং gl.texImage2D()
দিয়ে যে কোনো সময় এর আকার পরিবর্তন করতে পারেন।
WebGPU-তে, বাফার এবং টেক্সচার অপরিবর্তনীয়। এর মানে হল যে আপনি তাদের আকার, ব্যবহার বা বিন্যাস তৈরি করার পরে পরিবর্তন করতে পারবেন না। আপনি শুধুমাত্র তাদের বিষয়বস্তু পরিবর্তন করতে পারেন.
স্পেস কনভেনশন পার্থক্য
WebGL-এ, Z ক্লিপ স্পেস রেঞ্জ হল -1 থেকে 1। WebGPU-তে, Z ক্লিপ স্পেস রেঞ্জ হল 0 থেকে 1। এর মানে হল যে 0 এর az মান সহ বস্তুগুলি ক্যামেরার সবচেয়ে কাছের, যখন 1 এর az মান সহ বস্তুগুলি সবচেয়ে দূরে।
WebGL OpenGL কনভেনশন ব্যবহার করে, যেখানে Y অক্ষ উপরে থাকে এবং Z অক্ষ দর্শকের দিকে থাকে। WebGPU মেটাল কনভেনশন ব্যবহার করে, যেখানে Y অক্ষ নিচে থাকে এবং Z অক্ষ স্ক্রীনের বাইরে থাকে। মনে রাখবেন যে ফ্রেমবাফার কোঅর্ডিনেট, ভিউপোর্ট কোঅর্ডিনেট এবং ফ্র্যাগমেন্ট/পিক্সেল কোঅর্ডিনেটে Y অক্ষের দিক নিচে রয়েছে। ক্লিপ স্পেসে, Y অক্ষের দিক এখনও WebGL-এর মতোই উপরে রয়েছে।
স্বীকৃতি
এই নিবন্ধটি পর্যালোচনা করার জন্য Corentin Wallez, Gregg Tavares, Stephen White, Ken Russell, এবং Rachel Andrew কে ধন্যবাদ।
আমি WebGPU এবং WebGL-এর মধ্যে পার্থক্যগুলি গভীরভাবে দেখার জন্য WebGPUFundamentals.org সুপারিশ করছি৷
,একজন WebGL ডেভেলপার হিসেবে, আপনি WebGPU ব্যবহার শুরু করার জন্য ভয় ও উত্তেজিত হতে পারেন, WebGL-এর উত্তরসূরি যা ওয়েবে আধুনিক গ্রাফিক্স API-এর অগ্রগতি নিয়ে আসে।
এটা জেনে আশ্বস্ত হয় যে WebGL এবং WebGPU অনেকগুলি মূল ধারণা শেয়ার করে৷ উভয় APIই আপনাকে GPU-তে শেডার নামে ছোট প্রোগ্রাম চালানোর অনুমতি দেয়। WebGL ভার্টেক্স এবং ফ্র্যাগমেন্ট শেডার সমর্থন করে, WebGPU এছাড়াও কম্পিউট শেডার সমর্থন করে। WebGL ওপেনজিএল শেডিং ল্যাঙ্গুয়েজ (GLSL) ব্যবহার করে যখন WebGPU ব্যবহার করে WebGPU শেডিং ল্যাঙ্গুয়েজ (WGSL)। যদিও দুটি ভাষা ভিন্ন, অন্তর্নিহিত ধারণাগুলি বেশিরভাগই একই।
সেই কথা মাথায় রেখে, আপনাকে শুরু করতে সাহায্য করতে এই নিবন্ধটি WebGL এবং WebGPU-এর মধ্যে কিছু পার্থক্য তুলে ধরে।
বৈশ্বিক রাষ্ট্র
ওয়েবজিএল-এর প্রচুর গ্লোবাল স্টেট রয়েছে। কিছু সেটিংস সমস্ত রেন্ডারিং অপারেশনে প্রযোজ্য, যেমন কোন টেক্সচার এবং বাফারগুলি আবদ্ধ। আপনি বিভিন্ন API ফাংশন কল করে এই গ্লোবাল স্টেট সেট করেন এবং আপনি এটি পরিবর্তন না করা পর্যন্ত এটি কার্যকর থাকে। ওয়েবজিএল-এর গ্লোবাল স্টেট হল ত্রুটির একটি প্রধান উৎস , কারণ একটি গ্লোবাল সেটিং পরিবর্তন করতে ভুলে যাওয়া সহজ। উপরন্তু, গ্লোবাল স্টেট কোড শেয়ারিংকে কঠিন করে তোলে, কারণ ডেভেলপারদের সতর্কতা অবলম্বন করতে হবে যাতে ভুলবশত গ্লোবাল স্টেট এমনভাবে পরিবর্তন না হয় যা কোডের অন্যান্য অংশকে প্রভাবিত করে।
WebGPU একটি রাষ্ট্রহীন API, এবং এটি একটি বিশ্বব্যাপী অবস্থা বজায় রাখে না। পরিবর্তে, এটি একটি পাইপলাইনের ধারণা ব্যবহার করে সমস্ত রেন্ডারিং স্টেটকে এনক্যাপসুলেট করে যা WebGL-এ বিশ্বব্যাপী ছিল। একটি পাইপলাইনে কোন ব্লেন্ডিং, টপোলজি এবং অ্যাট্রিবিউটগুলি ব্যবহার করার মতো তথ্য থাকে৷ একটি পাইপলাইন অপরিবর্তনীয়। আপনি যদি কিছু সেটিংস পরিবর্তন করতে চান তবে আপনাকে আরেকটি পাইপলাইন তৈরি করতে হবে। WebGPU কমান্ড এনকোডারগুলিকে একত্রে ব্যাচ করতে এবং সেগুলি যে ক্রমে রেকর্ড করা হয়েছিল সেই ক্রমে চালায়। এটি শ্যাডো ম্যাপিং-এর ক্ষেত্রে উপযোগী, উদাহরণস্বরূপ, যেখানে, বস্তুর উপর একক পাসে, অ্যাপ্লিকেশন একাধিক কমান্ড স্ট্রিম রেকর্ড করতে পারে, প্রতিটি আলোর ছায়া মানচিত্রের জন্য একটি।
সংক্ষেপে বলতে গেলে, WebGL-এর গ্লোবাল স্টেট মডেল যেমন শক্তিশালী, কম্পোজেবল লাইব্রেরি এবং অ্যাপ্লিকেশনগুলিকে কঠিন এবং ভঙ্গুর করে তুলেছে, WebGPU উল্লেখযোগ্যভাবে সেই পরিমাণ হ্রাস করেছে যা ডেভেলপারদের GPU-তে কমান্ড পাঠানোর সময় ট্র্যাক রাখতে হবে।
আর সিঙ্ক করবেন না
GPU-তে, কমান্ড পাঠানো এবং সিঙ্ক্রোনাসভাবে তাদের জন্য অপেক্ষা করা সাধারণত অদক্ষ, কারণ এটি পাইপলাইন ফ্লাশ করতে পারে এবং বুদবুদ সৃষ্টি করতে পারে। এটি বিশেষ করে WebGPU এবং WebGL-এর ক্ষেত্রে সত্য, যেগুলি জাভাস্ক্রিপ্ট থেকে একটি পৃথক প্রক্রিয়ায় চলমান GPU ড্রাইভার সহ একটি মাল্টি-প্রসেস আর্কিটেকচার ব্যবহার করে।
WebGL-এ, উদাহরণস্বরূপ, gl.getError()
কল করার জন্য JavaScript প্রক্রিয়া থেকে GPU প্রক্রিয়া এবং পিছনে একটি সিঙ্ক্রোনাস আইপিসি প্রয়োজন। দুটি প্রক্রিয়া যোগাযোগের ফলে এটি CPU পাশে একটি বুদবুদ সৃষ্টি করতে পারে।
এই বুদবুদগুলি এড়াতে, WebGPU সম্পূর্ণরূপে অ্যাসিঙ্ক্রোনাস করার জন্য ডিজাইন করা হয়েছে৷ ত্রুটি মডেল এবং অন্যান্য সমস্ত অপারেশন অ্যাসিঙ্ক্রোনাসভাবে ঘটে। উদাহরণস্বরূপ, যখন আপনি একটি টেক্সচার তৈরি করেন, অপারেশনটি অবিলম্বে সফল হতে দেখা যায়, এমনকি টেক্সচারটি আসলে একটি ত্রুটি হলেও। আপনি শুধুমাত্র অ্যাসিঙ্ক্রোনাসভাবে ত্রুটিটি আবিষ্কার করতে পারেন। এই নকশা ক্রস-প্রক্রিয়া যোগাযোগ বুদ্বুদ-মুক্ত রাখে এবং অ্যাপ্লিকেশনগুলিকে নির্ভরযোগ্য কর্মক্ষমতা দেয়।
শেডার গণনা করুন
কম্পিউট শেডার হল এমন প্রোগ্রাম যা সাধারণ-উদ্দেশ্য কম্পিউটেশন করতে GPU-তে চলে। এগুলি শুধুমাত্র WebGPU-তে উপলব্ধ, WebGL নয়৷
ভার্টেক্স এবং ফ্র্যাগমেন্ট শেডারের বিপরীতে, এগুলি গ্রাফিক্স প্রক্রিয়াকরণের মধ্যে সীমাবদ্ধ নয়, এবং মেশিন লার্নিং, পদার্থবিদ্যা সিমুলেশন এবং বৈজ্ঞানিক কম্পিউটিং এর মতো বিভিন্ন কাজের জন্য ব্যবহার করা যেতে পারে। কম্পিউট শেডারগুলি সমান্তরালভাবে শত শত বা হাজার হাজার থ্রেড দ্বারা কার্যকর করা হয়, যা তাদেরকে বড় ডেটাসেট প্রক্রিয়াকরণের জন্য অত্যন্ত দক্ষ করে তোলে। WebGPU সম্পর্কে এই বিস্তৃত নিবন্ধে GPU কম্পিউট এবং আরও বিশদ সম্পর্কে জানুন।
ভিডিও ফ্রেম প্রক্রিয়াকরণ
JavaScript এবং WebAssembly ব্যবহার করে ভিডিও ফ্রেম প্রক্রিয়াকরণের কিছু ত্রুটি রয়েছে: GPU মেমরি থেকে CPU মেমরিতে ডেটা অনুলিপি করার খরচ, এবং সীমিত সমান্তরালতা যা কর্মীদের এবং CPU থ্রেডগুলির সাথে অর্জন করা যেতে পারে। ওয়েবজিপিইউ-এর সেই সীমাবদ্ধতা নেই, এটি ওয়েবকোডেক্স API-এর সাথে শক্ত একীকরণের জন্য ভিডিও ফ্রেম প্রক্রিয়াকরণের জন্য এটিকে একটি দুর্দান্ত উপযুক্ত করে তুলেছে।
নিম্নলিখিত কোড স্নিপেট দেখায় কিভাবে WebGPU-তে একটি বাহ্যিক টেক্সচার হিসাবে একটি VideoFrame আমদানি করতে হয় এবং এটি প্রক্রিয়া করতে হয়। আপনি এই ডেমো চেষ্টা করে দেখতে পারেন.
// Init WebGPU device and pipeline...
// Configure canvas context...
// Feed camera stream to video...
(function render() {
const videoFrame = new VideoFrame(video);
applyFilter(videoFrame);
requestAnimationFrame(render);
})();
function applyFilter(videoFrame) {
const texture = device.importExternalTexture({ source: videoFrame });
const bindgroup = device.createBindGroup({
layout: pipeline.getBindGroupLayout(0),
entries: [{ binding: 0, resource: texture }],
});
// Finally, submit commands to GPU
}
ডিফল্টরূপে অ্যাপ্লিকেশন বহনযোগ্যতা
WebGPU আপনাকে limits
অনুরোধ করতে বাধ্য করে। ডিফল্টরূপে, requestDevice()
একটি GPUDevice ফেরত দেয় যা শারীরিক ডিভাইসের হার্ডওয়্যার ক্ষমতার সাথে মেলে না, বরং একটি যুক্তিসঙ্গত এবং সব GPU-এর সর্বনিম্ন সাধারণ ডিনোমিনেটর। ডেভেলপারদের ডিভাইস সীমার অনুরোধ করার জন্য, WebGPU নিশ্চিত করে যে অ্যাপ্লিকেশনগুলি যতটা সম্ভব ডিভাইসে চলবে।
ক্যানভাস হ্যান্ডলিং
আপনি একটি WebGL প্রসঙ্গ তৈরি করার পরে WebGL স্বয়ংক্রিয়ভাবে ক্যানভাস পরিচালনা করে এবং আলফা, অ্যান্টিলিয়াস, কালারস্পেস, গভীরতা, সংরক্ষণ ড্রয়িংবাফার বা স্টেনসিলের মতো প্রসঙ্গ বৈশিষ্ট্যগুলি সরবরাহ করে।
অন্যদিকে, WebGPU-এর জন্য আপনাকে ক্যানভাস নিজেই পরিচালনা করতে হবে। উদাহরণস্বরূপ, WebGPU-তে অ্যান্টিলিয়াসিং অর্জন করতে, আপনি একটি বহু নমুনা টেক্সচার তৈরি করবেন এবং এটিতে রেন্ডার করবেন। তারপর, আপনি একটি নিয়মিত টেক্সচারে বহু নমুনা টেক্সচার সমাধান করবেন এবং সেই টেক্সচারটিকে ক্যানভাসে আঁকবেন। এই ম্যানুয়াল ম্যানেজমেন্ট আপনাকে একটি একক GPUDevice অবজেক্ট থেকে যতগুলি চান ততগুলি ক্যানভাসে আউটপুট করতে দেয়। বিপরীতে, WebGL প্রতি ক্যানভাসে শুধুমাত্র একটি প্রসঙ্গ তৈরি করতে পারে।
WebGPU একাধিক ক্যানভাসেস ডেমো দেখুন।
একটি পার্শ্ব নোটে, ব্রাউজারগুলির বর্তমানে প্রতি পৃষ্ঠায় WebGL ক্যানভাসের সংখ্যার একটি সীমা রয়েছে৷ লেখার সময়, Chrome এবং Safari একসাথে 16টি পর্যন্ত WebGL ক্যানভাস ব্যবহার করতে পারে; Firefox তাদের মধ্যে 200টি পর্যন্ত তৈরি করতে পারে। অন্যদিকে, প্রতি পৃষ্ঠায় WebGPU ক্যানভাসের সংখ্যার কোনো সীমা নেই।

সহায়ক ত্রুটি বার্তা
WebGPU API থেকে ফেরত আসা প্রতিটি বার্তার জন্য একটি কল স্ট্যাক প্রদান করে। এর মানে হল যে আপনার কোডে কোথায় ত্রুটি ঘটেছে তা আপনি দ্রুত দেখতে পারবেন, যা ত্রুটিগুলি ডিবাগিং এবং ঠিক করার জন্য সহায়ক ৷
একটি কল স্ট্যাক প্রদানের পাশাপাশি, WebGPU ত্রুটি বার্তাগুলিও বোঝা সহজ এবং পদক্ষেপযোগ্য। ত্রুটির বার্তাগুলিতে সাধারণত ত্রুটির বিবরণ এবং ত্রুটিটি কীভাবে ঠিক করা যায় তার পরামর্শ অন্তর্ভুক্ত থাকে।
WebGPU আপনাকে প্রতিটি WebGPU অবজেক্টের জন্য একটি কাস্টম label
প্রদান করার অনুমতি দেয়। এই লেবেলটি ব্রাউজার দ্বারা GPUError বার্তা, কনসোল সতর্কতা এবং ব্রাউজার বিকাশকারী সরঞ্জামগুলিতে ব্যবহার করা হয়।
নাম থেকে সূচী পর্যন্ত
WebGL-এ, অনেক কিছু নাম দ্বারা সংযুক্ত থাকে। উদাহরণস্বরূপ, আপনি GLSL-এ myUniform
নামে একটি অভিন্ন পরিবর্তনশীল ঘোষণা করতে পারেন এবং gl.getUniformLocation(program, 'myUniform')
ব্যবহার করে এর অবস্থান পেতে পারেন। আপনি যদি ইউনিফর্ম ভেরিয়েবলের নাম ভুল টাইপ করেন তবে আপনি একটি ত্রুটি পেতে এটি কার্যকর হয়।
অন্যদিকে, WebGPU-তে, সবকিছু সম্পূর্ণরূপে বাইট অফসেট বা সূচক দ্বারা সংযুক্ত থাকে (প্রায়ই লোকেশন বলা হয়)। WGSL এবং JavaScript-এ কোডের অবস্থানগুলিকে সিঙ্কে রাখা আপনার দায়িত্ব৷
মিপম্যাপ প্রজন্ম
WebGL-এ, আপনি একটি টেক্সচারের স্তর 0 mip তৈরি করতে পারেন এবং তারপরে কল করতে পারেন gl.generateMipmap()
। WebGL তারপর আপনার জন্য অন্য সব মিপ লেভেল তৈরি করবে।
WebGPU-তে, আপনাকে অবশ্যই মিপম্যাপ তৈরি করতে হবে। এটি করার জন্য কোন বিল্ট-ইন ফাংশন নেই। সিদ্ধান্ত সম্পর্কে আরও জানতে বিশেষ আলোচনা দেখুন। আপনি সহজ লাইব্রেরি যেমন webgpu-utils ব্যবহার করতে পারেন মিপম্যাপ তৈরি করতে বা নিজে কীভাবে করবেন তা শিখতে পারেন।
স্টোরেজ বাফার এবং স্টোরেজ টেক্সচার
ইউনিফর্ম বাফারগুলি WebGL এবং WebGPU উভয় দ্বারা সমর্থিত এবং আপনাকে সীমিত আকারের ধ্রুবক পরামিতিগুলিকে শেডারের কাছে পাস করার অনুমতি দেয়। স্টোরেজ বাফার, যা দেখতে অনেকটা ইউনিফর্ম বাফারের মতো, শুধুমাত্র WebGPU দ্বারা সমর্থিত এবং ইউনিফর্ম বাফারের চেয়ে বেশি শক্তিশালী এবং নমনীয়।
শেডারের কাছে পাঠানো স্টোরেজ বাফার ডেটা ইউনিফর্ম বাফারের চেয়ে অনেক বড় হতে পারে। যদিও স্পেক বলছে ইউনিফর্ম বাফার বাইন্ডিং এর সাইজ 64KB পর্যন্ত হতে পারে (
maxUniformBufferBindingSize
দেখুন), একটি স্টোরেজ বাফার বাইন্ডিং এর সর্বোচ্চ সাইজ WebGPU তে কমপক্ষে 128MB (maxStorageBufferBindingSize
দেখুন)।স্টোরেজ বাফারগুলি লেখার যোগ্য, এবং কিছু পারমাণবিক ক্রিয়াকলাপ সমর্থন করে যখন ইউনিফর্ম বাফারগুলি কেবলমাত্র পঠনযোগ্য। এটি অ্যালগরিদমের নতুন ক্লাস বাস্তবায়নের অনুমতি দেয়।
স্টোরেজ বাফার বাইন্ডিংগুলি আরও নমনীয় অ্যালগরিদমের জন্য রানটাইম-আকারের অ্যারে সমর্থন করে, যখন ইউনিফর্ম বাফার অ্যারে আকারগুলি শেডারে সরবরাহ করতে হবে।
স্টোরেজ টেক্সচার শুধুমাত্র WebGPU-তে সমর্থিত, এবং ইউনিফর্ম বাফারের জন্য স্টোরেজ বাফারগুলি কী টেক্সচার করা হয়। এগুলি নিয়মিত টেক্সচারের চেয়ে বেশি নমনীয়, র্যান্ডম অ্যাক্সেস রাইটে সমর্থন করে (এবং ভবিষ্যতেও পড়া যায়)।
বাফার এবং টেক্সচার পরিবর্তন
WebGL-এ, আপনি একটি বাফার বা টেক্সচার তৈরি করতে পারেন এবং তারপরে উদাহরণের জন্য যথাক্রমে gl.bufferData()
এবং gl.texImage2D()
দিয়ে যে কোনো সময় এর আকার পরিবর্তন করতে পারেন।
WebGPU-তে, বাফার এবং টেক্সচার অপরিবর্তনীয়। এর মানে হল যে আপনি তাদের আকার, ব্যবহার বা বিন্যাস তৈরি করার পরে পরিবর্তন করতে পারবেন না। আপনি শুধুমাত্র তাদের বিষয়বস্তু পরিবর্তন করতে পারেন.
স্পেস কনভেনশন পার্থক্য
WebGL-এ, Z ক্লিপ স্পেস রেঞ্জ হল -1 থেকে 1। WebGPU-তে, Z ক্লিপ স্পেস রেঞ্জ হল 0 থেকে 1। এর মানে হল যে 0 এর az মান সহ বস্তুগুলি ক্যামেরার সবচেয়ে কাছের, যখন 1 এর az মান সহ বস্তুগুলি সবচেয়ে দূরে।
WebGL OpenGL কনভেনশন ব্যবহার করে, যেখানে Y অক্ষ উপরে থাকে এবং Z অক্ষ দর্শকের দিকে থাকে। WebGPU মেটাল কনভেনশন ব্যবহার করে, যেখানে Y অক্ষ নিচে থাকে এবং Z অক্ষ স্ক্রীনের বাইরে থাকে। মনে রাখবেন যে ফ্রেমবাফার কোঅর্ডিনেট, ভিউপোর্ট কোঅর্ডিনেট এবং ফ্র্যাগমেন্ট/পিক্সেল কোঅর্ডিনেটে Y অক্ষের দিক নিচে রয়েছে। ক্লিপ স্পেসে, Y অক্ষের দিক এখনও WebGL-এর মতোই উপরে রয়েছে।
স্বীকৃতি
এই নিবন্ধটি পর্যালোচনা করার জন্য Corentin Wallez, Gregg Tavares, Stephen White, Ken Russell, এবং Rachel Andrew কে ধন্যবাদ।
আমি WebGPU এবং WebGL-এর মধ্যে পার্থক্যগুলি গভীরভাবে দেখার জন্য WebGPUFundamentals.org সুপারিশ করছি৷
,একজন WebGL ডেভেলপার হিসেবে, আপনি WebGPU ব্যবহার শুরু করার জন্য ভয় ও উত্তেজিত হতে পারেন, WebGL-এর উত্তরসূরি যা ওয়েবে আধুনিক গ্রাফিক্স API-এর অগ্রগতি নিয়ে আসে।
এটা জেনে আশ্বস্ত হয় যে WebGL এবং WebGPU অনেকগুলি মূল ধারণা শেয়ার করে৷ উভয় APIই আপনাকে GPU-তে শেডার নামে ছোট প্রোগ্রাম চালানোর অনুমতি দেয়। WebGL ভার্টেক্স এবং ফ্র্যাগমেন্ট শেডার সমর্থন করে, WebGPU এছাড়াও কম্পিউট শেডার সমর্থন করে। WebGL ওপেনজিএল শেডিং ল্যাঙ্গুয়েজ (GLSL) ব্যবহার করে যখন WebGPU ব্যবহার করে WebGPU শেডিং ল্যাঙ্গুয়েজ (WGSL)। যদিও দুটি ভাষা ভিন্ন, অন্তর্নিহিত ধারণাগুলি বেশিরভাগই একই।
সেই কথা মাথায় রেখে, আপনাকে শুরু করতে সাহায্য করতে এই নিবন্ধটি WebGL এবং WebGPU-এর মধ্যে কিছু পার্থক্য তুলে ধরে।
বৈশ্বিক রাষ্ট্র
ওয়েবজিএল-এর প্রচুর গ্লোবাল স্টেট রয়েছে। কিছু সেটিংস সমস্ত রেন্ডারিং অপারেশনে প্রযোজ্য, যেমন কোন টেক্সচার এবং বাফারগুলি আবদ্ধ। আপনি বিভিন্ন API ফাংশন কল করে এই গ্লোবাল স্টেট সেট করেন এবং আপনি এটি পরিবর্তন না করা পর্যন্ত এটি কার্যকর থাকে। ওয়েবজিএল-এর গ্লোবাল স্টেট হল ত্রুটির একটি প্রধান উৎস , কারণ একটি গ্লোবাল সেটিং পরিবর্তন করতে ভুলে যাওয়া সহজ। উপরন্তু, গ্লোবাল স্টেট কোড শেয়ারিংকে কঠিন করে তোলে, কারণ ডেভেলপারদের সতর্কতা অবলম্বন করতে হবে যাতে ভুলবশত গ্লোবাল স্টেট এমনভাবে পরিবর্তন না হয় যা কোডের অন্যান্য অংশকে প্রভাবিত করে।
WebGPU একটি রাষ্ট্রহীন API, এবং এটি একটি বিশ্বব্যাপী অবস্থা বজায় রাখে না। পরিবর্তে, এটি একটি পাইপলাইনের ধারণা ব্যবহার করে সমস্ত রেন্ডারিং স্টেটকে এনক্যাপসুলেট করে যা WebGL-এ বিশ্বব্যাপী ছিল। একটি পাইপলাইনে কোন ব্লেন্ডিং, টপোলজি এবং অ্যাট্রিবিউটগুলি ব্যবহার করার মতো তথ্য থাকে৷ একটি পাইপলাইন অপরিবর্তনীয়। আপনি যদি কিছু সেটিংস পরিবর্তন করতে চান তবে আপনাকে আরেকটি পাইপলাইন তৈরি করতে হবে। WebGPU কমান্ড এনকোডারগুলিকে একত্রে ব্যাচ করতে এবং সেগুলি যে ক্রমে রেকর্ড করা হয়েছিল সেই ক্রমে চালায়। এটি শ্যাডো ম্যাপিং-এর ক্ষেত্রে উপযোগী, উদাহরণস্বরূপ, যেখানে, বস্তুর উপর একক পাসে, অ্যাপ্লিকেশন একাধিক কমান্ড স্ট্রিম রেকর্ড করতে পারে, প্রতিটি আলোর ছায়া মানচিত্রের জন্য একটি।
সংক্ষিপ্তসার হিসাবে, ওয়েবজিএলের গ্লোবাল স্টেট মডেল যেহেতু শক্তিশালী, কম্পোজেবল লাইব্রেরি এবং অ্যাপ্লিকেশনগুলি কঠিন এবং ভঙ্গুর তৈরি করে তুলেছে, ওয়েবজিপিইউ জিপিইউতে কমান্ড প্রেরণের সময় বিকাশকারীদের ট্র্যাক রাখতে প্রয়োজনীয় রাষ্ট্রের পরিমাণকে উল্লেখযোগ্যভাবে হ্রাস করেছে।
আর সিঙ্ক নেই
জিপিইউগুলিতে, কমান্ডগুলি প্রেরণ করা এবং তাদের জন্য সিঙ্ক্রোনালি অপেক্ষা করা সাধারণত অদক্ষ, কারণ এটি পাইপলাইনটি ফ্লাশ করতে পারে এবং বুদবুদগুলির কারণ হতে পারে। এটি বিশেষত ওয়েবজিপিইউ এবং ওয়েবজিএল-তে সত্য, যা জিপিইউ ড্রাইভারকে জাভাস্ক্রিপ্ট থেকে পৃথক প্রক্রিয়াতে চলমান একটি মাল্টি-প্রসেস আর্কিটেকচার ব্যবহার করে।
ওয়েবজিএল -তে, উদাহরণস্বরূপ, gl.getError()
কল করা জাভাস্ক্রিপ্ট প্রক্রিয়া থেকে জিপিইউ প্রক্রিয়া এবং পিছনে একটি সিঙ্ক্রোনাস আইপিসির প্রয়োজন। দুটি প্রক্রিয়া যোগাযোগের সাথে সাথে এটি সিপিইউ পাশের বুদ্বুদ হতে পারে।
এই বুদবুদগুলি এড়াতে, ওয়েবজিপিইউ সম্পূর্ণরূপে অ্যাসিনক্রোনাস হিসাবে ডিজাইন করা হয়েছে। ত্রুটি মডেল এবং অন্যান্য সমস্ত অপারেশনগুলি অসাধারণভাবে ঘটে। উদাহরণস্বরূপ, আপনি যখন কোনও টেক্সচার তৈরি করেন, তখন টেক্সচারটি আসলে একটি ত্রুটি হলেও অপারেশনটি তাত্ক্ষণিকভাবে সফল হতে দেখা যায়। আপনি কেবল ত্রুটিটি অসাধারণভাবে আবিষ্কার করতে পারেন। এই নকশাটি ক্রস-প্রক্রিয়া যোগাযোগকে বুদবুদ মুক্ত রাখে এবং অ্যাপ্লিকেশনগুলিকে নির্ভরযোগ্য পারফরম্যান্স দেয়।
শেডার গণনা করুন
গণনা শেডারগুলি এমন প্রোগ্রাম যা সাধারণ-উদ্দেশ্যমূলক গণনা সম্পাদনের জন্য জিপিইউতে চালিত হয়। এগুলি কেবল ওয়েবজিপিইউতে পাওয়া যায়, ওয়েবজিএল নয়।
ভার্টেক্স এবং খণ্ডের শেডারগুলির বিপরীতে, এগুলি গ্রাফিক্স প্রসেসিংয়ের মধ্যে সীমাবদ্ধ নয় এবং মেশিন লার্নিং, ফিজিক্স সিমুলেশন এবং বৈজ্ঞানিক কম্পিউটিংয়ের মতো বিভিন্ন ধরণের কাজের জন্য ব্যবহার করা যেতে পারে। গণনা শেডারগুলি কয়েকশো বা এমনকি হাজার হাজার থ্রেড দ্বারা সমান্তরালে কার্যকর করা হয়, যা তাদের বড় ডেটাসেটগুলি প্রক্রিয়াজাতকরণের জন্য খুব দক্ষ করে তোলে। ওয়েবজিপিইউ সম্পর্কে এই বিস্তৃত নিবন্ধে জিপিইউ গণনা এবং আরও বিশদ সম্পর্কে জানুন।
ভিডিও ফ্রেম প্রসেসিং
জাভাস্ক্রিপ্ট এবং ওয়েবসেম্ব্লিউজ ব্যবহার করে ভিডিও ফ্রেমগুলি প্রক্রিয়াজাতকরণ কিছু ত্রুটি রয়েছে: জিপিইউ মেমরি থেকে সিপিইউ মেমরিতে ডেটা অনুলিপি করার ব্যয় এবং শ্রমিক এবং সিপিইউ থ্রেডগুলির সাথে অর্জন করা যায় এমন সীমিত সমান্তরালতা। ওয়েবজিপিইউতে এই সীমাবদ্ধতাগুলি নেই, এটি ওয়েবকোডেকস এপিআইয়ের সাথে তার শক্ত সংহতকরণের জন্য ভিডিও ফ্রেমগুলি প্রক্রিয়াজাতকরণের জন্য দুর্দান্ত ফিট করে তোলে।
নিম্নলিখিত কোড স্নিপেটটি দেখায় যে কীভাবে ওয়েবজিপিইউতে একটি বাহ্যিক টেক্সচার হিসাবে একটি ভিডিওফ্রেম আমদানি করা যায় এবং এটি প্রক্রিয়া করে। আপনি এই ডেমোটি চেষ্টা করতে পারেন।
// Init WebGPU device and pipeline...
// Configure canvas context...
// Feed camera stream to video...
(function render() {
const videoFrame = new VideoFrame(video);
applyFilter(videoFrame);
requestAnimationFrame(render);
})();
function applyFilter(videoFrame) {
const texture = device.importExternalTexture({ source: videoFrame });
const bindgroup = device.createBindGroup({
layout: pipeline.getBindGroupLayout(0),
entries: [{ binding: 0, resource: texture }],
});
// Finally, submit commands to GPU
}
ডিফল্টরূপে অ্যাপ্লিকেশন বহনযোগ্যতা
ওয়েবজিপিইউ আপনাকে limits
জন্য অনুরোধ করতে বাধ্য করে। ডিফল্টরূপে, requestDevice()
এমন একটি জিপুডেভাইসকে ফেরত দেয় যা শারীরিক ডিভাইসের হার্ডওয়্যার সক্ষমতার সাথে মেলে না, বরং সমস্ত জিপিইউগুলির একটি যুক্তিসঙ্গত এবং সর্বনিম্ন সাধারণ ডিনোমিনেটর। বিকাশকারীদের ডিভাইসের সীমাবদ্ধতার জন্য অনুরোধ করার প্রয়োজনের মাধ্যমে, ওয়েবজিপিইউ নিশ্চিত করে যে অ্যাপ্লিকেশনগুলি যতটা সম্ভব ডিভাইস চালু হবে।
ক্যানভাস হ্যান্ডলিং
আপনি একটি ওয়েবজিএল প্রসঙ্গ তৈরি করার পরে ওয়েবজিএল স্বয়ংক্রিয়ভাবে ক্যানভাস পরিচালনা করে এবং আলফা, অ্যান্টিয়ালিয়াস, কালারস্পেস, গভীরতা, সংরক্ষণকারী বাফার বা স্টেনসিলের মতো সরবরাহের প্রসঙ্গের বৈশিষ্ট্যগুলি সরবরাহ করে।
অন্যদিকে, ওয়েবজিপিইউ আপনাকে ক্যানভাস নিজেই পরিচালনা করতে হবে। উদাহরণস্বরূপ, ওয়েবজিপিইউতে অ্যান্টিয়ালিয়াসিং অর্জনের জন্য, আপনি একটি মাল্টিস্যাম্পল টেক্সচার তৈরি করবেন এবং এটিতে রেন্ডার করবেন। তারপরে, আপনি একটি নিয়মিত টেক্সচারে মাল্টিস্যাম্পল টেক্সচারটি সমাধান করবেন এবং সেই টেক্সচারটি ক্যানভাসে আঁকবেন। এই ম্যানুয়াল ম্যানেজমেন্ট আপনাকে একক জিপুডেভাইস অবজেক্ট থেকে যতটা ক্যানভ্যাসে আউটপুট করতে দেয়। বিপরীতে, ওয়েবজিএল কেবল ক্যানভাসে একটি প্রসঙ্গ তৈরি করতে পারে।
ওয়েবজিপিইউ একাধিক ক্যানভাসেস ডেমো দেখুন।
পাশের নোটে, ব্রাউজারগুলির বর্তমানে প্রতি পৃষ্ঠায় ওয়েবজিএল ক্যানভ্যাসের সংখ্যার সীমা রয়েছে। লেখার সময়, ক্রোম এবং সাফারি কেবল একই সাথে 16 টি ওয়েবজিএল ক্যানভ্যাস ব্যবহার করতে পারে; ফায়ারফক্স তাদের মধ্যে 200 টি পর্যন্ত তৈরি করতে পারে। অন্যদিকে, প্রতি পৃষ্ঠায় ওয়েবজিপিইউ ক্যানভ্যাসের সংখ্যার কোনও সীমা নেই।

সহায়ক ত্রুটি বার্তা
ওয়েবজিপিইউ এপিআই থেকে ফিরে আসা প্রতিটি বার্তার জন্য একটি কল স্ট্যাক সরবরাহ করে। এর অর্থ হ'ল আপনি দ্রুত দেখতে পাচ্ছেন যে আপনার কোডে ত্রুটিটি কোথায় ঘটেছে, যা ডিবাগিং এবং ত্রুটিগুলি ঠিক করার জন্য সহায়ক ।
কল স্ট্যাক সরবরাহ করার পাশাপাশি, ওয়েবজিপিইউ ত্রুটি বার্তাগুলি বোঝা সহজ এবং কার্যক্ষম। ত্রুটি বার্তাগুলিতে সাধারণত ত্রুটিটির বর্ণনা এবং ত্রুটিটি কীভাবে ঠিক করা যায় তার পরামর্শ অন্তর্ভুক্ত থাকে।
ওয়েবজিপিইউ আপনাকে প্রতিটি ওয়েবজিপিইউ অবজেক্টের জন্য একটি কাস্টম label
সরবরাহ করতে দেয়। এই লেবেলটি তখন ব্রাউজারটি জিপিউরর বার্তা, কনসোল সতর্কতা এবং ব্রাউজার বিকাশকারী সরঞ্জামগুলিতে ব্যবহৃত হয়।
নাম থেকে সূচকগুলিতে
ওয়েবজিএল -তে অনেকগুলি জিনিস নাম দ্বারা সংযুক্ত থাকে। উদাহরণস্বরূপ, আপনি জিএলএসএলে myUniform
নামে একটি অভিন্ন পরিবর্তনশীল ঘোষণা করতে পারেন এবং gl.getUniformLocation(program, 'myUniform')
ব্যবহার করে এর অবস্থান পেতে পারেন। আপনি যদি ইউনিফর্ম ভেরিয়েবলের নামটি ভুল করে থাকেন তবে আপনি ত্রুটি পেয়ে যাওয়ার সাথে সাথে এটি কার্যকর হয়।
অন্যদিকে, ওয়েবজিপিইউতে, সমস্ত কিছু সম্পূর্ণরূপে বাইট অফসেট বা সূচক দ্বারা সংযুক্ত থাকে (প্রায়শই অবস্থান বলা হয়)। ডাব্লুজিএসএল এবং জাভাস্ক্রিপ্ট সিঙ্কে কোডের জন্য অবস্থানগুলি রাখা আপনার দায়িত্ব।
এমআইপিএমএপি জেনারেশন
ওয়েবজিএল -তে, আপনি একটি টেক্সচারের স্তর 0 এমআইপি তৈরি করতে পারেন এবং তারপরে gl.generateMipmap()
কল করতে পারেন। ওয়েবজিএল তারপরে আপনার জন্য অন্যান্য সমস্ত এমআইপি স্তর তৈরি করবে।
ওয়েবজিপিইউতে আপনাকে অবশ্যই মিপম্যাপগুলি তৈরি করতে হবে। এটি করার জন্য কোনও অন্তর্নির্মিত ফাংশন নেই। সিদ্ধান্ত সম্পর্কে আরও জানতে স্পেক আলোচনা দেখুন। আপনি MIPMAPS উত্পন্ন করতে বা কীভাবে এটি নিজে করতে হয় তা শিখতে আপনি ওয়েবজিপিইউ-ইউটিলের মতো সহজ গ্রন্থাগারগুলি ব্যবহার করতে পারেন।
স্টোরেজ বাফার এবং স্টোরেজ টেক্সচার
ইউনিফর্ম বাফারগুলি ওয়েবজিএল এবং ওয়েবজিপিইউ উভয় দ্বারা সমর্থিত এবং আপনাকে শেডারগুলিতে সীমিত আকারের ধ্রুবক পরামিতিগুলি পাস করার অনুমতি দেয়। স্টোরেজ বাফারগুলি, যা দেখতে অনেকটা অভিন্ন বাফারগুলির মতো দেখায়, কেবল ওয়েবজিপিইউ দ্বারা সমর্থিত এবং ইউনিফর্ম বাফারগুলির চেয়ে আরও শক্তিশালী এবং নমনীয়।
স্টোরেজ বাফার ডেটা শেডারে পাস করা ইউনিফর্ম বাফারগুলির চেয়ে অনেক বড় হতে পারে। স্পেসটি বলেছে যে ইউনিফর্ম বাফার বাইন্ডিংগুলি আকারে 64 কেবি পর্যন্ত হতে পারে (
maxUniformBufferBindingSize
দেখুন), ওয়েবজিপিইউতে স্টোরেজ বাফার বাইন্ডিংয়ের সর্বাধিক আকার কমপক্ষে 128MB (maxStorageBufferBindingSize
দেখুন)।স্টোরেজ বাফারগুলি লিখিত হয় এবং কিছু পারমাণবিক ক্রিয়াকলাপকে সমর্থন করে যখন ইউনিফর্ম বাফারগুলি কেবল পড়তে থাকে। এটি অ্যালগরিদমের নতুন ক্লাসগুলি প্রয়োগ করার অনুমতি দেয়।
স্টোরেজ বাফার বাইন্ডিংগুলি আরও নমনীয় অ্যালগরিদমের জন্য রানটাইম আকারের অ্যারেগুলিকে সমর্থন করে, অন্যদিকে ইউনিফর্ম বাফার অ্যারে আকারগুলি শেডারে সরবরাহ করতে হবে।
স্টোরেজ টেক্সচারগুলি কেবল ওয়েবজিপিইউতে সমর্থিত এবং স্টোরেজ বাফারগুলি ইউনিফর্ম বাফারগুলিতে কী তা টেক্সচারে। এগুলি নিয়মিত টেক্সচারের চেয়ে আরও নমনীয়, এলোমেলো অ্যাক্সেস লেখার পক্ষে সমর্থন করে (এবং ভবিষ্যতেও পড়েন)।
বাফার এবং টেক্সচার পরিবর্তন
ওয়েবজিএল -তে, আপনি একটি বাফার বা টেক্সচার তৈরি করতে পারেন এবং তারপরে উদাহরণস্বরূপ যথাক্রমে gl.bufferData()
এবং gl.texImage2D()
এর সাথে যে কোনও সময় এর আকার পরিবর্তন করতে পারেন।
ওয়েবজিপিইউতে, বাফার এবং টেক্সচার অপরিবর্তনীয়। এর অর্থ হ'ল আপনি তাদের আকার, ব্যবহার বা ফর্ম্যাট তৈরি করার পরে পরিবর্তন করতে পারবেন না। আপনি কেবল তাদের বিষয়বস্তু পরিবর্তন করতে পারেন।
স্পেস কনভেনশন পার্থক্য
ওয়েবজিএল -তে, জেড ক্লিপ স্পেস রেঞ্জটি -1 থেকে 1 পর্যন্ত। ওয়েবজিপিইউতে, জেড ক্লিপ স্পেস রেঞ্জ 0 থেকে 1 পর্যন্ত। এর অর্থ হ'ল 0 এর এজেড মান সহ অবজেক্টগুলি ক্যামেরার নিকটতম, অন্যদিকে এজেড মান সহ অবজেক্টগুলি আরও দূরে দূরে।
ওয়েবজিএল ওপেনজিএল কনভেনশন ব্যবহার করে, যেখানে ওয়াই অক্ষটি উপরে রয়েছে এবং জেড অক্ষটি দর্শকের দিকে রয়েছে। ওয়েবজিপিইউ ধাতব কনভেনশন ব্যবহার করে, যেখানে y অক্ষটি নীচে রয়েছে এবং জেড অক্ষটি পর্দার বাইরে রয়েছে। নোট করুন যে ওয়াই অক্ষের দিকটি ফ্রেমবফার সমন্বয়, ভিউপোর্ট সমন্বয় এবং খণ্ড/পিক্সেল স্থানাঙ্কে নিচে রয়েছে। ক্লিপ স্পেসে, ওয়াই অক্ষের দিকটি এখনও ওয়েবজিএল -তে রয়েছে।
স্বীকৃতি
এই নিবন্ধটি পর্যালোচনা করার জন্য কোরেন্টিন ওয়ালেজ, গ্রেগ টাভারেস, স্টিফেন হোয়াইট, কেন রাসেল এবং রাচেল অ্যান্ড্রুকে ধন্যবাদ।
আমি ওয়েবজিপিইউ এবং ওয়েবজিএল এর মধ্যে পার্থক্যের গভীর ডাইভের জন্য ওয়েবগিপুফান্ডামেন্টালস.অর্গ.অর্গও সুপারিশ করি।