Fragment Shader হল গ্রাফিক্স পাইপলাইনের একটি প্রোগ্রামেবল স্তর যা ছবির প্রতিটি ফ্র্যাগমেন্ট (পিক্সেল) এর চূড়ান্ত রঙ নির্ধারণ করে। Khronos Group, 2025 অনুসারে, ফ্র্যাগমেন্ট শেডার Vertex Shader থেকে ইন্টারপোলেটেড ডেটা গ্রহণ করে এবং আলোক গণনা, টেক্সচারিং এবং রঙের প্রভাব সম্পাদন করে। Fragment Shader প্রতিটি পিক্সেলের জন্য কল করা হয়, যা এটিকে গ্রাফিক্স পাইপলাইনের সবচেয়ে সম্পদ-নিবিড় স্তরে পরিণত করে।
মূল বিষয়
Fragment Shader (ফ্র্যাগমেন্ট বা পিক্সেল শেডার) হল গ্রাফিক্স পাইপলাইনের একটি প্রোগ্রামেবল স্তর যা ছবির প্রতিটি ফ্র্যাগমেন্টের চূড়ান্ত রঙ গণনা করে। ফ্র্যাগমেন্ট হল একটি সম্ভাব্য পিক্সেল যা গভীরতা এবং স্টেনসিল পরীক্ষা পাস করার পরে স্ক্রিনে দৃশ্যমান পিক্সেলে পরিণত হয়।
Fragment Shader র্যাস্টারাইজেশনের পরে কার্যকর হয়, যখন 3D প্রিমিটিভ (ত্রিভুজ) ইতিমধ্যেই ফ্র্যাগমেন্টের সেটে রূপান্তরিত হয়েছে। শেডার ইন্টারপোলেটেড অ্যাট্রিবিউট গ্রহণ করে — টেক্সচার স্থানাঙ্ক, নর্মাল, রঙ যা Vertex Shader-এ ত্রিভুজের শীর্ষবিন্দুর জন্য গণনা করা হয়েছিল এবং ত্রিভুজের ভিতরে প্রতিটি পিক্সেলের জন্য রৈখিকভাবে ইন্টারপোলেটেড।
প্রোগ্রামেবল শেডারের আবির্ভাবের আগে (DirectX 8 / OpenGL 2.0-এর আগে), পিক্সেলের রঙ গণনা সীমিত অপারেশন সহ একটি নির্দিষ্ট পাইপলাইন দ্বারা সম্পাদিত হত। প্রোগ্রামেবল Fragment Shader 2001 সালে আবির্ভূত হয় এবং গ্রাফিক্স সক্ষমতাকে আমূলভাবে প্রসারিত করে: ডেভেলপাররা প্রতিটি পিক্সেলের রঙের উপর পূর্ণ নিয়ন্ত্রণ লাভ করে, যা ফটোরিয়ালিস্টিক আলোক, জটিল উপকরণ এবং পোস্ট-প্রভাব বাস্তবায়ন সম্ভব করে।
Fragment Shader র্যাস্টারাইজার দ্বারা উত্পন্ন প্রতিটি ফ্র্যাগমেন্টের জন্য GPU দ্বারা চালু করা হয়। প্রতিটি শেডার কল একটি ফ্র্যাগমেন্ট প্রক্রিয়া করে, তার ইনপুট ডেটা পড়ে, ব্যবহারকারীর কোড কার্যকর করে এবং আউটপুট মান — RGBA ফর্ম্যাটে ফ্র্যাগমেন্টের রঙ লেখে।
Fragment Shader-এর ইনপুট ডেটাতে Vertex Shader থেকে ইন্টারপোলেটেড অ্যাট্রিবিউট (টেক্সচার স্থানাঙ্ক, নর্মাল, রঙ), ইউনিফর্ম ভেরিয়েবল (আলোর উৎস, ম্যাট্রিক্স) এবং টেক্সচার স্যাম্পলার অন্তর্ভুক্ত। আউটপুট ডেটা হল রঙ ভেক্টর (OpenGL ES 2.0-এ gl_FragColor বা ES 3.0-এ ব্যবহারকারী-সংজ্ঞায়িত ভেরিয়েবল), যা কালার বাফারে লেখা হয়।
#version 300 es
precision mediump float;
in vec2 vTexCoord;
uniform sampler2D uTexture;
out vec4 fragColor;
void main() {
fragColor = texture(uTexture, vTexCoord);
}
Fragment Shader ছবির ভিজুয়াল গুণমানের জন্য দায়ী। ব্যবহারকারী স্ক্রিনে যে সমস্ত প্রভাব দেখেন — রঙ, ছায়া, প্রতিফলন, স্বচ্ছতা — গ্রাফিক্স পাইপলাইনের এই স্তরেই গণনা করা হয়।
সবচেয়ে সাধারণ অপারেশন হল ইন্টারপোলেটেড UV স্থানাঙ্ক ব্যবহার করে টেক্সচার থেকে রঙের নমুনা নেওয়া। Sampler2D এবং texture() ফাংশন টেক্সচার অ্যাটলাস থেকে পিক্সেলের রঙ পাওয়ার অনুমতি দেয়। ফিল্টারিং (bilinear, trilinear, anisotropic) স্যাম্পলার প্যারামিটারের মাধ্যমে নিয়ন্ত্রিত হয় এবং বিভিন্ন দেখার কোণে ছবির তীক্ষ্ণতাকে প্রভাবিত করে।
Phong শেডিং মডেলটি Fragment Shader-এ প্রতি পিক্সেলে গণনা করা হয়, যা ভার্টেক্স আলোক (Gouraud শেডিং) এর তুলনায় মসৃণ হাইলাইট দেয়। Phong আলোক তিনটি উপাদান অন্তর্ভুক্ত করে: পরিবেষ্টিত (ambient), বিচ্ছুরিত (diffuse) এবং স্পেকুলার (specular) প্রতিফলন।
// Fragment shader with Phong lighting
in vec3 vNormal;
in vec3 vPosition;
uniform vec3 uLightDir;
uniform vec3 uLightColor;
void main() {
vec3 norm = normalize(vNormal);
float diff = max(dot(norm, uLightDir), 0.0);
fragColor = vec4(uLightColor * diff, 1.0);
}
Fragment Shader পোস্ট-প্রসেসিং প্রয়োগের অনুমতি দেয়: লুকআপ টেবিল (LUT) এর মাধ্যমে রঙ সংশোধন, অস্পষ্টতা (blur), আভা প্রভাব (bloom) এবং HDR রেন্ডারিংয়ের জন্য tonemapping। এই সমস্ত প্রভাব পিক্সেল স্তরে কাজ করে এবং রিয়েল টাইমে কার্যকর হয়।
Fragment Shader-এর কর্মক্ষমতা আধুনিক মোবাইল গেমে FPS সীমিত করার প্রধান কারণ। যেহেতু শেডার প্রতিটি পিক্সেলের জন্য কল করা হয়, কোড জটিলতার সামান্য বৃদ্ধিও ফ্রেম হারে লক্ষণীয় পতন ঘটাতে পারে।
মোবাইল GPU (Qualcomm Adreno, ARM Mali) এর জন্য সুপারিশ করা হয়: float ভেরিয়েবলের জন্য mediump precision ব্যবহার করুন, টেক্সচার নমুনা একত্রিত করুন, শেডার কার্যকর করার আগে অদৃশ্য ফ্র্যাগমেন্ট বাতিল করতে early-z পরীক্ষা প্রয়োগ করুন।
| পদ্ধতি | বিবরণ | লাভ |
|---|---|---|
| Mediump precision | 32-বিটের পরিবর্তে 16-বিট নির্ভুলতা | 2x গতি পর্যন্ত |
| Early-Z | শেডারের আগে গভীরতা পরীক্ষা | কল হ্রাস |
| Texture atlasing | একাধিকের পরিবর্তে একটি টেক্সচার | কম সুইচ |
উভয় প্রকার শেডার ডেভেলপার দ্বারা প্রোগ্রামযোগ্য, তবে তারা পাইপলাইনের বিভিন্ন স্তরে কাজ করে এবং বিভিন্ন কাজ সমাধান করে। Fragment Shader কলের সংখ্যার কারণে উল্লেখযোগ্যভাবে বেশি সম্পদ-নিবিড়।
| প্যারামিটার | Fragment Shader | Vertex Shader |
|---|---|---|
| কলের সংখ্যা | লক্ষ (স্ক্রিন রেজোলিউশন) | হাজার (শীর্ষবিন্দুর সংখ্যা) |
| ইনপুট ডেটা | ইন্টারপোলেটেড অ্যাট্রিবিউট | শীর্ষবিন্দু অ্যাট্রিবিউট |
| প্রধান কাজ | ফ্র্যাগমেন্ট রঙ গণনা | জ্যামিতি রূপান্তর |
| টেক্সচার অ্যাক্সেস | সম্পূর্ণ (একাধিক স্যাম্পলার) | সীমিত |
| কর্মক্ষমতার উপর প্রভাব | উচ্চ (রেজোলিউশনের উপর নির্ভরশীল) | মধ্যম (জ্যামিতির উপর নির্ভরশীল) |
Fragment Shader সরল (টেক্সচার নমুনা) বা জটিল (মাল্টি-লেয়ার আলোক) হতে পারে। আসুন দুটি ব্যবহারিক উদাহরণ দেখি: মৌলিক টেক্সচারিং এবং সময় ব্যবহার করে গ্রেডিয়েন্ট প্রভাব।
#version 300 es
precision mediump float;
in vec2 vTexCoord;
in vec3 vColor;
uniform sampler2D uDiffuseMap;
out vec4 fragColor;
void main() {
vec4 texColor = texture(uDiffuseMap, vTexCoord);
fragColor = texColor * vec4(vColor, 1.0);
}
#include <metal_stdlib>
using namespace metal;
struct FragmentIn {
float2 texCoord;
float3 normal;
};
fragment float4
fragmentMain(FragmentIn in [[stage_in]],
texture2d<float> tex [[texture(0)]]) {
constexpr sampler s(filter = linear);
float4 color = tex.sample(s, in.texCoord);
return color;
}
সচরাচর জিজ্ঞাসিত প্রশ্ন
Fragment Shader হল GPU-তে একটি মিনি-প্রোগ্রাম যা নির্ধারণ করে স্ক্রিনের প্রতিটি পিক্সেল কী রঙের হবে। যদি Vertex Shader বস্তুর আকৃতি নির্ধারণ করে, তাহলে Fragment Shader নির্ধারণ করে সেই বস্তুটি কেমন দেখায় — টেক্সচার, আলোক, রঙ।
Fragment Shader স্ক্রিনের প্রতিটি পিক্সেলের জন্য কল করা হয়। 2532x1170 (iPhone) রেজোলিউশনের একটি ডিভাইসে এটি প্রতি ফ্রেমে প্রায় 3 মিলিয়ন কল। 60 FPS-এ শেডার প্রতি সেকেন্ডে 180 মিলিয়ন বার কার্যকর হয়, যার জন্য বিপুল গণনামূলক শক্তি প্রয়োজন।
Fragment Shader-এ বাস্তবায়িত হয়: টেক্সচারিং, আলোক (Phong, PBR), ছায়া, প্রতিফলন, প্রতিসরণ, bloom, ক্ষেত্রের গভীরতা, রঙ সংশোধন, LUT ফিল্টার এবং প্রক্রিয়াগত টেক্সচার জেনারেশন।
float-এর জন্য mediump precision ব্যবহার করুন, টেক্সচার নমুনার সংখ্যা হ্রাস করুন, early-z কুলিং প্রয়োগ করুন, শেডার অপারেশন একত্রিত করুন এবং শেডারের ভিতরে শর্তসাপেক্ষ শাখা এড়িয়ে চলুন।
এগুলি একই জিনিস। Fragment Shader শব্দটি OpenGL / Vulkan-এ ব্যবহৃত হয়, যেখানে Pixel Shader Direct3D (Microsoft) পরিভাষায় ব্যবহৃত হয়। কার্যকরীভাবে এগুলি অভিন্ন: উভয়ই প্রতিটি ফ্র্যাগমেন্ট/পিক্সেলের রঙ গণনা করে।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন