Shader — একটি প্রোগ্রাম যা GPU-তে গ্রাফিক্স ডেটা প্রক্রিয়ার করে: ভার্টিক্স, ফ্র্যাগমেন্ট বা কম্পিউটেশনাল কাজ। CPU-তে সাধারণ কোডের বিপরীতে, শেডার শতাধিক কোরে সমান্তরালে চলে, প্রতিটি উপাদান স্বতন্ত্রভাবে প্রক্রিয়া করে। Khronos Group (2025) অনুযায়ী, আধুনিক 3D অ্যাপ্লিকেশনের 100% শেডার ব্যবহৃত হয় — মোবাইল গেম থেকে সিস্টেম অ্যাপ্লিকেশনে UI ইফেক্ট পর্যন্ত। ডেভেলপাররা বিশেষায়িত ভাষায় শেডার লেখেন: GLSL, HLSL, Metal Shading Language বা SPIR-V।
মূল বিষয়
Shader — একটি ছোট প্রোগ্রাম যা একটি বিশেষায়িত ভাষায় লেখা এবং GPU-তে চলানো হয়। প্রতিটি শেডার একটি ডেটা উপাদান প্রক্রিয়া করে — একটি ভার্টিক্স, ফ্র্যাগমেন্ট (পিক্সেল) বা কাজের আইটেম — অন্যদের থেকে স্বতন্ত্রভাবে। GPU সমান্তরালতা একসাথে হাজার শেডার ইনস্টেন্স চলানোর অনুমতি দেয়।
শব্দটি Pixar 1980-এর দশকে RenderMan-এ পৃষ্ঠের চাহিদি নিয়ন্ত্রণকারী প্রোগ্রাম বর্ণনার জন্য প্রবর্তন করেছিল। রিয়াল-টাইম শেডার NVIDIA GeForce 3 (2001) এর সাথে আবির্ভুত হয় — প্রথম প্রোগ্রামেবল পাইপলাইন সহ গ্রাফিক্স কার্ড। শেডারের পূর্বে, গ্রাফিক্স নির্দিষ্ট প্যারামিটারের মাধ্যমে কনফিগার করা হত: রঙ, টেক্সচার, ব্লেন্ডিং মোড।
Unity Technologies (2025) অনুযায়ী, গড় মোবাইল গেম 50–200 শেডার ব্যবহার করে। প্রতিটি শেডারে বিভিন্ন প্লেটফর্ম, গুণমান স্তর এবং আলো কনফিগারেশনের জন্য ভেরিয়েন্ট থাকে। ভেরিয়েন্টের সংখ্যা প্রতি প্রজেক্টে 10 000 পর্যন্ত পৌঁছতে পারে।
শেডার আর্কিটেকচারে বিভক্ত: ইনপুট ডেটা (অ্যাট্রিবিউট, uniform ভেরিয়েবল, টেক্সচার), প্রোগ্রাম কোড এবং আউটপুট ডেটা (রঙ, অবস্থান)। uniform ভেরিয়েবল শেডার চলানোর পূর্বে CPU থেকে সেট করা হয় এবং ফ্রেমের সকল উপাদানের জন্য স্থির থাকে। অ্যাট্রিবিউট হল প্রতি উপাদান ডেটা (ভার্টিক্স স্থানাঙ্ক, নর্মাল, UV স্থানাঙ্ক)।
SIMT (সিংগল ইনস্ট্রাকশন, মাল্টিপল থ্রেড) — GPU-তে শেডারের চলানো মডেল। একটি নির্দেশ একবার লোড করা হয় এবং বিভিন্ন ডেটায় শতাধিক থ্রেড দ্বারা চলানো হয়। উদাহরণস্বরূপ, 1000 পিক্সেলের জন্য একটি Fragment Shader একই কোড সহ 1000 থ্রেড লৌচ করে, কিন্তু প্রতিটি থ্রেড নিজের UV স্থানাঙ্ক এবং ইন্টারপোলেটেড অ্যাট্রিবিউট পায়।
SIMT-এর একটি গুরুত্বপূর্ণ পরিণাম: শেডারে ব্র্যাঞ্চিং ব্যয়বহুল। যদি if ব্লকের মধ্যে অর্ধ থ্রেড এক পথে এবং অর্ধ অন্য পথে যায়, GPU উভয় শাখা সকল থ্রেডের জন্য পরিপর চালায়। কার্যদক্ষতা 50% এ নেমে যায়। শেডারে ডায়নেমিক ব্র্যাঞ্চিং এড়িয়ে চলুন বা CPU-তে পূর্ব-গণনার মাধ্যমে এটি হ্রাস করুন।
আধুনিক GPU বেশ কয়েকধরন শেডার সমর্থন করে, প্রতিটি গ্রাফিক্স বা কম্পিউট পাইপলাইনের নিজস্ব পর্যায়ের জন্য। আসুন মূল প্রকারগুলি পর্যালোচনা করি: ভার্টিক্স, ফ্র্যাগমেন্ট, compute এবং আধুনিক mesh শেডার।
| শেডারের ধরন | পাইপলাইন পর্যায় | প্রক্রিয়া করে | ভাষা |
|---|---|---|---|
| Vertex Shader | ভার্টিক্স | প্রতিটি ভার্টিক্স | GLSL, HLSL |
| Fragment Shader | ফ্র্যাগমেন্ট | প্রতিটি পিক্সেল | GLSL, HLSL |
| Compute Shader | কম্পিউট | ইচ্ছামতো ডেটা | GLSL, HLSL |
| Geometry Shader | জ্যামিতিক | প্রাইমিটিভ | GLSL, HLSL |
| Tessellation Shader | টেসেলেশন | প্যাচ | GLSL, HLSL |
| Mesh Shader | Mesh পাইপলাইন | Task + Mesh | HLSL, MSL |
Vertex Shader জ্যামিতির প্রতিটি ভার্টিক্স প্রক্রিয়া করে: স্থানাঙ্ক রূপান্তর করে, আলো গণনা করে, ফ্র্যাগমেন্ট শেডারে ডেটা প্রেরণ করে। এটি গ্রাফিক্স পাইপলাইনের একটি বাধ্যবাহ্যিক পর্যায় — এটি ছাড়া, ভার্টিক্স স্ক্রিনে পৌঁছবে না। Vertex Shader প্রতিটি ফ্রেমের প্রতিটি ভার্টিক্সের জন্য চলে।
Fragment Shader (বা Pixel Shader) — সবচেয়ে সংশ্লিষ্ট পর্যায়। এটি টেক্সচার, আলো এবং মেটেরিয়াল ব্যবহার করে প্রতিটি ফ্র্যাগমেন্টের চুড়ান্ত রঙ নির্ধারণ করে। Fragment Shader জ্যামিতি দ্বারা আচ্ছাদিত প্রতিটি পিক্সেলের জন্য চলে, সকল আরোপিত টেক্সচার এবং ইফেক্ট বিবেচনা করে। এই শেডারটি অপ্টিমাইজ করা সবচেয়ে বেশি কার্যদক্ষতা লাভ আনে।
Compute Shader — GPU-তে ইচ্ছামতো গণনার জন্য একটি সার্বজনীন শেডার। গ্রাফিক্স শেডারের বিপরীতে, এটি জ্যামিতি বা পিক্সেলের সাথে আবদ্ধ নয়। Compute Shader কাজের গ্রুপের মাধ্যমে ইচ্ছামতো ডেটা বাফারের সাথে কাজ করে। এটি পদার্থবিজ্ঞান, কণা সিমুলেশন, পোস্ট-ইফেক্ট এবং নিউরাল নেটওয়ার্ক ইনফারেন্সের জন্য ব্যবহৃত হয়।
Mesh Shader — সবচেয়ে নতুন ধরনের শেডার, যা NVIDIA Turing (2018) এবং Metal 3 এর সাথে আবির্ভুত হয়েছে। Mesh Shader ভার্টিক্স, জ্যামিতি এবং টেসেলেশন শেডারকে একটি একক mesh পাইপলাইনে প্রতিস্থাপন করে। এটি Task Shader এর সাথে যুগ্ম করে কাজ করে: Task Shader সিদ্ধান্ত নেয় কোন mesh গ্রুপ রেন্ডার করতে হবে, এবং Mesh Shader চলমান জ্যামিতি তৈরী করে।
শেডার বিশেষায়িত ভাষায় লেখা হয় যা GPU মেশিন কোডে কম্পাইল হয়। ভাষার পছন্দ প্লেটফর্ম এবং API-এর উপর নির্ভর করে। মূল ভাষাগুলি পর্যালোচনা করি: GLSL, HLSL, Metal Shading Language এবং মধ্যবর্তী ফরম্যাট SPIR-V।
GLSL — OpenGL, OpenGL ES এবং WebGL-এর জন্য শেডার ভাষা। এর সিনট্যাক্স C এর উপর ভিত্তি করে ভেক্টর ধরন (vec2, vec4, mat4) এবং অন্তর্নির্মিত ফাংশন (texture, normalize, reflect) যুক্ত করে। GLSL ES হল সীমিত সটিকতা (লোপ, mediump, highp) সহ মোবাইল ডিভাইসের জন্য সংস্করণ। Khronos (2025) অনুযায়ী, ক্রাস-প্লেটফর্ম সমর্থনের কারণে GLSL সবচেয়ে ব্যাপক শেডার ভাষা হিসেবে রয়েছে।
#version 300 es
precision mediump float;
in vec2 v_texCoord;
uniform sampler2D u_texture;
out vec4 fragColor;
void main() {
fragColor = texture(u_texture, v_texCoord);
}
একটি সহজ ফ্র্যাগমেন্ট শেডার UV স্থানাঙ্কের মাধ্যমে টেক্সচার থেকে রঙ পড়ে। precision mediump GPU-কে float-এর জন্য অর্ধ সটিকতা ব্যবহার করতে নির্দেশ দেয় — মোবাইল ডিভাইসে চলানো 25–40% তেজ় করে।
HLSL — DirectX-এর জন্য মাইক্রোসফটের শেডার ভাষা। এর সিনট্যাক্স ক্লাস, স্ট্রাকচার এবং টেমপ্লেট সমর্থন সহ C++ এর কাছাকাছি। HLSL Windows অ্যাপ্লিকেশনে ব্যবহৃত হয় এবং Shader Model 6.7+ এর মাধ্যমে Ray Tracing, Mesh Shaders এবং Sampler Feedback সমর্থন করে। মোবাইল ডেভেলপমেন্টের জন্য, HLSL সরাসরি ব্যবহৃত হয় না কিন্তু Vulkan-এর জন্য SPIR-V এ কম্পাইল হয়।
MSL (Metal Shading Language) — Apple-এর শেডার ভাষা যা C++14 এর উপর ভিত্তি করে। GLSL এবং HLSL এর বিপরীতে, MSL অ্যাপ্লিকেশনের সাথে কম্পাইল হয়, যা ডিভাইসে JIT কম্পাইলেশন দূর করে। MSL পয়েন্টার, টেমপ্লেট এবং C++ স্ট্যান্ডার্ড লাইব্রেরি সমর্থন করে। এটি সকল Apple ডিভাইসে ব্যবহৃত হয়: iPhone, iPad, Mac, Apple TV।
#include <metal_stdlib>
using namespace metal;
struct VertexOut {
float4 position [[position]];
float2 texCoord;
};
fragment float4
myFragment(VertexOut in [[stage_in]],
texture2d<float> tex [[texture(0)]]) {
constexpr sampler s = sampler(filter::linear);
return tex.sample(s, in.texCoord);
}
MSL সম্পদ বাঁধতে [[position]], [[stage_in]] এবং [[texture(N)]] অ্যাট্রিবিউট ব্যবহার করে। Apple-এর কম্পাইলার রজিস্টার এবং ক্যাশের সংখ্যা বিবেচনা করে বর্তমান GPU-এর জন্য অপ্টিমাইজড কোড তৈরী করে।
SPIR-V — শেডারের জন্য একটি মধ্যবর্তী বাইনারি ফরম্যাট, Vulkan-এর মানক। শেডার GLSL বা HLSL এ লেখা হয়, SPIR-V এ কম্পাইল হয় এবং Vulkan অ্যাপ্লিকেশনে লোড করা হয়। SPIR-V কোনো নির্দিষ্ট ভাষার সাথে আবদ্ধ নয় — Rust, Python, OpenCL C থেকে SPIR-V এ কম্পাইলার উপলব্ধ।
মোবাইল প্লেটফর্মে শেডার এর ডিজ়টপের তুলনায় সীমাবদ্ধতা রয়েছে: কম রজিস্টার, সীমিত সটিকতা এবং কিছু নির্দেশের জন্য সমর্থনের অভাব। আসুন Android (Vulkan/OpenGL ES) এবং iOS (Metal) এ শেডারের বিশেষতা পর্যালোচনা করি।
Android OpenGL-এর জন্য GLSL ES এবং Vulkan-এর জন্য SPIR-V ব্যবহার করে। OpenGL ES 3.2 ডিফল্টভাবে mediump সহ শেডার সমর্থন করে। Vulkan-এ glslangValidator এর মাধ্যমে GLSL কে SPIR-V এ স্পষ্ট কম্পাইলেশন প্রয়োজন। Android এ, শেডার স্ট্রিং রিসোর্স বা কম্পাইলকৃত SPIR-V ফাইল থেকে লোড করা হয়।
Qualcomm Adreno GPU ড্রাইভার স্তরে শেডার অপ্টিমাইজ করে। সুপারিশ: রঙ এবং UV-এর জন্য mediump ব্যবহার করুন, শুধুমাত্র অবস্থানের জন্য highp; ভার্টিক্স শেডারে টেক্সচার লুকআপ এড়িয়ে চলুন; গণনা ভেক্টরে সমূহবদ্ধ করুন (4x float-এর পরিবর্তে vec4)। Qualcomm (2025) অনুযায়ী, এই অপ্টিমাইজেশন 30–50% উন্নতি দেয়।
iOS শুধুমাত্র Metal Shading Language ব্যবহার করে। শেডার Xcode এর মাধ্যমে অ্যাপ্লিকেশনের সাথে মেশিন কোডে কম্পাইল হয়। Metal শেডার প্রোফাইলিংয়ের জন্য Shader Debugger এবং GPU Capture প্রদান করে। Apple GPU (TBDR) এর বিশেষ অপ্টিমাইজেশন রয়েছে: অরলি ফ্র্যাগমেন্ট টেস্ট, মেমরিলেস রেন্ডার টার্গেট এবং প্রোগ্রামেবল ব্লেন্ডিং।
Apple WWDC 2024 অনুযায়ী, iOS শেডারের জন্য float-এর পরিবর্তে half ব্যবহার করা, রজিস্টার চাপ সীমাবদ্ধ (সর্বাধিক 64 রজিস্টার) এবং নির্ভর টেক্সচার লুকআপ এড়ানো গুরুত্বপূর্ণ। iOS শেডার সংক্ষিপ্ত হতে হবে — ইচ্ছাপূর্ণ আকার 50–100 ALU নির্দেশ।
গেম ইঞ্জিন Unity এবং Unreal Engine ভিজুয়াল শেডার সম্পাদক (Shader Graph, Material Editor) এবং অ্যাবস্ট্র্যাক্ট ভাষা (ShaderLab, USF) প্রদান করে। ডেভেলপার একটি উচ্চ-স্তরীয় ভাষায় শেডার লেখে, এবং ইঞ্জিন লক্ষ্য প্লেটফর্মের জন্য কম্পাইল করে। Unity একটি মধ্যবর্তী ভাষা হিসাবে HLSL ব্যবহার করে, Unreal USF (অনরিয়াল শেডার ফরম্যাট) ব্যবহার করে।
শেডার অপ্টিমাইজেশন — মোবাইল ডিভাইসের জন্য গ্রাফিক্স ডেভেলপমেন্টের একটি গুরুত্বপূর্ণ পর্যায়। একটি খারাপ লেখা শেডার FPS 60 থেকে 20 এ নামিয়ে দিতে পারে। আসুন মূল নিয়ম এবং অপ্টিমাইজেশন কৌশল পর্যালোচনা করি।
সর্বনিম্ন পর্যাপ্ত সটিকতা ব্যবহার করুন: রঙ এবং UV-এর জন্য lowp, নর্মাল এবং আলোর জন্য mediump, শুধুমাত্র অবস্থান এবং ম্যাট্রিক্সের জন্য highp। ARM (2025) অনুযায়ী, Mali GPU-তে mediump কাজ highp-এর চেয়ে 2 গুণ দ্রুত। GLSL ES এ, এটি প্রেসিজন কোয়ালিফায়ারের মাধ্যমে নির্দিষ্ট করা হয়।
টেক্সচার লুকআপ — শেডারের সবচেয়ে ব্যয়বহুল কাজ (ALU নির্দেশের জন্য 1–2-এর বিপরীতে 10–30 চক্র)। লুকআপের সংখ্যা কম করুন: টেক্সচার একত্রিত করুন, টেক্সচারের পরিবর্তে uniform অ্যারেতে ডেটা সংরক্ষণ করুন, ডেরিভেটিভ নির্দেশের মাধ্যমে পরস্পর পিক্সেল ফলাফল ক্যাশ করুন।
ডায়নেমিক ব্র্যাঞ্চিং (uniform ভেরিয়েবল সহ if) SIMT পাইপলাইনের কার্যদক্ষতা হ্রাস করে। ব্র্যাঞ্চিংকে গাণিতিক ফাংশন দিয়ে প্রতিস্থাপন করুন: mix(), step(), smoothstep() এবং clamp()। এই ফাংশন 1–2 নির্দেশে চলে, যেখানে থ্রেড ডাইভার্জেন্সের কারণে ব্র্যাঞ্চিং 8–16 নির্দেশ ব্যয় হতে পারে।
// Bad: dynamic branching in shader
if (u_enableLight) {
color *= computeLighting(normal);
}
// Good: mathematical branch replacement
color *= mix(1.0, computeLighting(normal),
float(u_enableLight));
mix() দুটি মানের মধ্যে রৈখিক ইন্টারপোলেশন করে। যখন u_enableLight=0, এটি 1.0 ফেরত — রঙ পরিবর্তন করে না। যখন u_enableLight=1, এটি আলোর ফলাফল ফেরত। কোনো ব্র্যাঞ্চিং নেই — সকল থ্রেড একই কোড চালায়।
আসুন মোবাইল ডেভেলপমেন্টের জন্য ব্যবহারিক শেডার উদাহরণ দেখি — সাধারণ শেডিং থেকে প্রোসেডুরল টেক্সচার জেনারেশন পর্যন্ত। প্রতিটি উদাহরণ একটি নির্দিষ্ট কৌশল প্রদর্শন করে।
ফং মডেল — ডিফিউজ এবং স্পেক্যুলার উপাদান সহ একটি ক্লাসিক আলো মডেল। Vertex Shader প্রতিটি ভার্টিক্সের জন্য আলো গণনা করে, Fragment Shader শুধুমাত্র ফলাফল ইন্টারপোলেট করে (Gouraud শেডিং)। কম ব্যয়ের কারণে মোবাইল ডিভাইসের জন্য উপযুক্ত।
#version 300 es
layout(location = 0) in vec4 a_position;
layout(location = 1) in vec3 a_normal;
uniform mat4 u_mvp;
uniform mat4 u_modelView;
out vec3 v_color;
void main() {
vec3 normal = normalize(mat3(u_modelView) * a_normal);
vec3 lightDir = normalize(vec3(0.0, 1.0, 1.0));
float diff = max(dot(normal, lightDir), 0.0);
v_color = vec3(0.8, 0.2, 0.2) * (0.3 + diff * 0.7);
gl_Position = u_mvp * a_position;
}
শেডারটি ডিফিউজ আলো গণনা করে: নর্মাল এবং আলোর দিকের ডট গুণফল। ফলাফল অ্যাম্বিয়েন্ট (0.3) এবং ডিফিউজ (0.7) উপাদানের সাথে মিশ্রিত হয়। এটি প্রতি ভার্টিক্স 10–15 ALU নির্দেশ চালায় — একটি মোবাইল GPU-তে 60 FPS-এ 100 000 পলিগনের জন্য গ্রহণযোগ্য।
প্রোসেডুরল টেক্সচার ফাইল থেকে লোড ছাড়াই Fragment Shader-এ উৎপন্ন হয়। এটি ভিডিও মেমরি বাঁচায় এবং অ্যানিমেশন সহজ করে। উদাহরণ — সমায়োজ্য কোষ আকার সহ একটি দাবাবাটি বোর্ড। মাত্র কয়েকটি ALU নির্দেশ — GPU-তে সর্বনিম্ন ভার।
#version 300 es
precision mediump float;
in vec2 v_uv;
uniform float u_cells;
out vec4 fragColor;
void main() {
vec2 cell = floor(v_uv * u_cells);
float isWhite = mod(cell.x + cell.y, 2.0);
fragColor = mix(vec4(0.1, 0.1, 0.1, 1.0),
vec4(0.9, 0.9, 0.9, 1.0),
isWhite);
}
8 ALU নির্দেশ — মোবাইল ডিভাইসের জন্য একটি আদর্শ শেডার। u_cells প্রতি অক্ষ কোষের সংখ্যা নির্ধারণ করে। floor এবং mod সস্তা কাজ, সকল মোবাইল GPU-তে 1 চক্রে চলানো হয়।
সামান্য প্রশ্নাবলী
শেডার GPU-তে SIMT মোডে চলে — শতাধিক থ্রেডের জন্য একটি নির্দেশ। একটি সাধারণ C++ প্রোগ্রাম CPU-তে MIMD মোডে চলে। শেডারের ফাইল সিস্টেম, ইনপুট/আউটপুট বা ডায়নেমিক মেমরিতে প্রবেশাধিকার নেই। এটি বাফার এবং টেক্সচারের মাধ্যমে ডেটা পেয়ে এবং একটি অবস্থান বা রঙ ফেরত।
GLSL — OpenGL ES এবং WebGL-এর জন্য, ক্রাস-প্লেটফর্ম। Metal Shading Language — iOS-এর জন্য। HLSL — Unity এবং Unreal Engine-এর ভিত্তি। GLSL দিয়ে শুরু করুন — মৌলিক বোঝা গেলে যে কোনো শেডার ভাষায় প্রয়োগ করা যায়।
মূল কারণ: উচ্চ সটিকতা (mediump-এর পরিবর্তে highp), অতিরিক্ত টেক্সচার লুকআপ, ডায়নেমিক ব্র্যাঞ্চিং এবং রজিস্টার সীমা অতিক্রম। শেডার বিশ্লেষণের জন্য RenderDoc বা Xcode GPU Frame Debugger ব্যবহার করুন।
Compute Shader — GPU-তে ইচ্ছামতো গণনার জন্য একটি শেডার: কণা পদার্থবিজ্ঞান, ছবি প্রক্রিয়াকরণ, কাপড় সিমুলেশন। Fragment Shader-এর বিপরীতে, এটি পিক্সেলের সাথে আবদ্ধ নয় এবং ইচ্ছামতো বাফারে লিখতে পারে।
হ্যাঁ, ভিজুয়াল সম্পাদক এর মাধ্যমে: Unity-তে Shader Graph, Unreal Engine-এ Material Editor বা Metal Shader Converter। এরা একটি নোড গ্রাফের উপর ভিত্তি করে শেডার কোড জেনারেট করে। গভীর অপ্টিমাইজেশনের জন্য শেডার ভাষার বোঝার প্রয়োজন হবে।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন