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 رینڈرنگ کے لیے ٹون میپنگ۔ یہ تمام اثرات پکسل سطح پر کام کرتے ہیں اور ریئل ٹائم میں عمل میں آتے ہیں۔
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 فلٹرز اور Procedural ٹیکسچر جنریشن۔
float کے لیے mediump precision استعمال کریں، ٹیکسچر کے نمونوں کی تعداد کم کریں، early-z culling لگائیں، شیڈر آپریشنز کو یکجا کریں اور شیڈر کے اندر مشروط شاخوں سے بچیں۔
یہ ایک ہی چیز ہے۔ Fragment Shader کی اصطلاح OpenGL / Vulkan میں استعمال ہوتی ہے، جبکہ Pixel Shader Direct3D (Microsoft) کی اصطلاحات میں استعمال ہوتی ہے۔ عملی طور پر یہ ایک جیسے ہیں: دونوں ہر فریگمنٹ/پکسل کا رنگ حساب کرتے ہیں۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں