Shader کیا ہے، shader کی اقسام اور وہ کیسے کام کرتے ہیں

مصنف: IT Sectr اشاعت: 2026-06-11 مطالعے کا وقت: 8 منٹ

Shader ایک پروگرام ہے جو GPU پر عملدرآمد کرتا ہے گرافک ڈیٹا پر کارروائی کرنے کے لیے: عمودی پوائنٹس، ٹکڑے یا کمپیوٹیشنل کام۔ CPU پر عام کوڈ کے برعکس، shader سینکڑوں کوروں پر متوازی طور پر کام کرتا ہے، ہر عنصر کو آزادانہ طور پر پروسیس کرتا ہے۔ Khronos Group (2025) کے مطابق، shader جدید 3D ایپلی کیشنز کے 100% میں استعمال ہوتے ہیں — موبائل گیمز سے لے کر سسٹم ایپلی کیشنز میں UI اثرات تک۔ ڈویلپرز shader کو مخصوص زبانوں میں لکھتے ہیں: GLSL، HLSL، Metal Shading Language یا SPIR-V۔

اہم نکات

  • Shader GPU کے لیے ایک پروگرام ہے جو منظر کے ہر عنصر کے لیے سینکڑوں کوروں پر متوازی طور پر چلتا ہے۔
  • Shader کی اقسام: vertex، fragment، compute، geometry، tessellation اور mesh shader۔
  • زبانیں: GLSL (OpenGL)، HLSL (DirectX)، MSL (Metal)، SPIR-V (Vulkan) — سب GPU مشین کوڈ میں مرتب ہوتی ہیں۔
  • موبائل ڈویلپمنٹ میں shader اثرات، پوسٹ پروسیسنگ، روشنی اور حسابات کے لیے استعمال ہوتے ہیں۔
  • Shader کی اصلاح: mediump درستگی، برانچنگ کو کم سے کم کرنا اور موبائل GPU کے لیے ATF (Adaptive Texture Fetch)۔

Shader کیا ہے؟

Shader ایک چھوٹا پروگرام ہے جو ایک مخصوص زبان میں لکھا جاتا ہے اور GPU پر چلتا ہے۔ ہر shader ڈیٹا کے ایک عنصر — عمودی پوائنٹ، ٹکڑا (پکسل) یا کام کا عنصر — کو دوسروں سے آزادانہ طور پر پروسیس کرتا ہے۔ GPU کی متوازی صلاحیت ہزاروں shader مثالوں کو بیک وقت چلانے کی اجازت دیتی ہے۔

یہ اصطلاح 1980 کی دہائی میں Pixar نے RenderMan میں سطحوں کی ظاہری شکل کو کنٹرول کرنے والے پروگراموں کو بیان کرنے کے لیے متعارف کروائی تھی۔ ریئل ٹائم shader NVIDIA GeForce 3 (2001) — پہلے پروگرام ایبل پائپ لائن والے گرافکس کارڈ کے ساتھ نمودار ہوئے۔ Shader سے پہلے، گرافکس کو مقررہ پیرامیٹرز سے ترتیب دیا جاتا تھا: رنگ، ساخت، ملاوٹ کا طریقہ۔

Unity Technologies (2025) کے مطابق، اوسط موبائل گیم 50–200 shader استعمال کرتی ہے۔ ہر shader کے مختلف پلیٹ فارمز، معیار کی سطحوں اور روشنی کی ترتیبات کے لیے مختلف قسمیں ہوتی ہیں۔ اقسام کی تعداد 10,000 فی پروجیکٹ تک پہنچ سکتی ہے۔

Shader کا فن تعمیر ان پٹ ڈیٹا (خصوصیات، uniform متغیرات، ساخت)، پروگرام کوڈ اور آؤٹ پٹ ڈیٹا (رنگ، مقام) میں تقسیم ہوتا ہے۔ Uniform متغیرات shader پر عملدرآمد سے پہلے CPU کے ذریعے سیٹ کیے جاتے ہیں اور فریم کے تمام عناصر کے لیے تبدیل نہیں ہوتے۔ خصوصیات فی عنصر ڈیٹا ہیں (عمودی پوائنٹ کوآرڈینیٹ، نارمل، UV کوآرڈینیٹ)۔

SIMT عملدرآمد ماڈل

SIMT (Single Instruction, Multiple Threads) GPU پر shader کے عملدرآمد کا ماڈل ہے۔ ایک ہدایت ایک بار لوڈ ہوتی ہے اور سینکڑوں تھریڈز مختلف ڈیٹا پر اسے چلاتے ہیں۔ مثال کے طور پر، 1000 پکسلز کے لیے Fragment Shader ایک ہی کوڈ کے ساتھ 1000 تھریڈز چلاتا ہے، لیکن ہر تھریڈ اپنے UV کوآرڈینیٹ اور انٹرپولیٹڈ خصوصیات حاصل کرتا ہے۔

SIMT کا ایک اہم نتیجہ: shader میں برانچنگ مہنگی ہے۔ اگر if بلاک کے اندر آدھے تھریڈز ایک شاخ پر جائیں اور باقی آدھے دوسری شاخ پر، GPU تمام تھریڈز کے لیے دونوں شاخوں کو ترتیب وار چلاتا ہے۔ کارکردگی 50% تک گر جاتی ہے۔ Shader میں متحرک برانچنگ سے بچیں یا CPU پر پیشگی حسابات کے ذریعے انہیں کم سے کم کریں۔

Shader کی اقسام

جدید GPU کئی اقسام کے shader کو سپورٹ کرتے ہیں، ہر ایک گرافک یا کمپیوٹیشنل پائپ لائن کے اپنے مرحلے کے لیے۔ اہم اقسام دیکھتے ہیں: vertex، fragment، compute اور جدید mesh shader۔

Shader کی قسمپائپ لائن کا مرحلہپروسیس کرتا ہےزبان
Vertex Shaderعمودیہر عمودی پوائنٹGLSL, HLSL
Fragment Shaderٹکڑاہر پکسلGLSL, HLSL
Compute Shaderکمپیوٹیشنلصوابدیدی ڈیٹاGLSL, HLSL
Geometry ShaderجیومیٹریپریمیٹیوGLSL, HLSL
Tessellation ShaderٹیسیلیشنپیچGLSL, HLSL
Mesh ShaderMesh پائپ لائنTask + MeshHLSL, MSL

Vertex Shader

Vertex Shader ہندسے کے ہر عمودی پوائنٹ کو پروسیس کرتا ہے: کوآرڈینیٹ تبدیل کرتا ہے، روشنی کا حساب لگاتا ہے، fragment shader کو ڈیٹا بھیجتا ہے۔ یہ گرافک پائپ لائن کا لازمی مرحلہ ہے — اس کے بغیر عمودی پوائنٹس اسکرین تک نہیں پہنچتے۔ Vertex Shader ہر فریم کے ہر عمودی پوائنٹ کے لیے بلایا جاتا ہے۔

Fragment Shader

Fragment Shader (یا Pixel Shader) سب سے زیادہ وسائل استعمال کرنے والا مرحلہ ہے۔ یہ ساخت، روشنی اور مواد کا استعمال کرتے ہوئے ہر ٹکڑے کا حتمی رنگ شمار کرتا ہے۔ Fragment Shader ہر پکسل کے لیے چلتا ہے جو ہندسے سے ڈھکا ہوتا ہے، لاگو کردہ تمام ساختوں اور اثرات کو مدنظر رکھتے ہوئے۔ اس shader کی اصلاح سب سے بڑی کارکردگی میں بہتری لاتی ہے۔

Compute Shader

Compute Shader GPU پر صوابدیدی حسابات کے لیے ایک عالمگیر shader ہے۔ گرافک shader کے برعکس، یہ ہندسے یا پکسلز سے منسلک نہیں ہے۔ Compute Shader کام کے گروپوں کے ذریعے صوابدیدی ڈیٹا بفرز کے ساتھ کام کرتا ہے۔ یہ فزکس، پارٹیکل سمولیشن، پوسٹ ایفیکٹس اور نیورل نیٹ ورک انفرنس کے لیے استعمال ہوتا ہے۔

Mesh Shader

Mesh Shader سب سے نیا shader ہے، جو NVIDIA Turing (2018) اور Metal 3 کے ساتھ آیا۔ Mesh Shader vertex، geometry اور tessellation shader کو ایک ہی mesh پائپ لائن سے بدل دیتا ہے۔ یہ Task Shader کے ساتھ مل کر کام کرتا ہے: Task Shader فیصلہ کرتا ہے کہ کون سے mesh گروپ رینڈر کرنے ہیں، اور Mesh Shader فوری طور پر ہندسہ پیدا کرتا ہے۔

Shader لکھنے کی زبانیں

Shader مخصوص زبانوں میں لکھے جاتے ہیں جو GPU مشین کوڈ میں مرتب ہوتی ہیں۔ زبان کا انتخاب پلیٹ فارم اور API پر منحصر ہے۔ اہم زبانیں دیکھتے ہیں: GLSL، HLSL، Metal Shading Language اور درمیانی فارمیٹ SPIR-V۔

GLSL (OpenGL Shading Language)

GLSL OpenGL، OpenGL ES اور WebGL کے لیے shader زبان ہے۔ نحو C پر مبنی ہے جس میں ویکٹر کی اقسام (vec2، vec4، mat4) اور بلٹ ان فنکشنز (texture، normalize، reflect) شامل ہیں۔ GLSL ES محدود درستگی والے موبائل آلات کے لیے ورژن ہے (lowp، mediump، highp)۔ Khronos (2025) کے مطابق، GLSL اپنی کراس پلیٹ فارم نوعیت کی وجہ سے سب سے عام shader زبان ہے۔

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);
}

ایک سادہ fragment shader UV کوآرڈینیٹس سے ساخت کا رنگ پڑھتا ہے۔ precision mediump GPU کو float کے لیے آدھی درستگی استعمال کرنے کا کہتا ہے — موبائل آلات پر عملدرآمد کو 25–40% تیز کرتا ہے۔

HLSL (High-Level Shader Language)

HLSL Microsoft کی DirectX کے لیے shader زبان ہے۔ نحو C++ کے قریب ہے اور کلاسز، سٹرکچرز اور ٹیمپلیٹس کو سپورٹ کرتا ہے۔ HLSL ونڈوز ایپلی کیشنز میں استعمال ہوتا ہے اور Shader Model 6.7+ کے ذریعے Ray Tracing، Mesh Shaders اور Sampler Feedback کو سپورٹ کرتا ہے۔ موبائل ڈویلپمنٹ کے لیے HLSL براہ راست استعمال نہیں ہوتا لیکن Vulkan کے لیے SPIR-V میں مرتب کیا جاتا ہے۔

Metal Shading Language

MSL (Metal Shading Language) Apple کی shader زبان ہے، جو C++14 پر مبنی ہے۔ GLSL اور HLSL کے برعکس، MSL ایپلی کیشن کے ساتھ مرتب ہوتا ہے، جس سے ڈیوائس پر JIT تالیف ختم ہو جاتی ہے۔ MSL پوائنٹرز، ٹیمپلیٹس اور C++ معیاری لائبریری کو سپورٹ کرتا ہے۔ یہ تمام Apple آلات پر استعمال ہوتا ہے: iPhone، iPad، Mac، Apple TV۔

cpp
#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

SPIR-V Vulkan کے لیے معیاری درمیانی بائنری shader فارمیٹ ہے۔ Shader GLSL یا HLSL میں لکھے جاتے ہیں، SPIR-V میں مرتب ہوتے ہیں اور Vulkan ایپلی کیشن میں لوڈ ہوتے ہیں۔ SPIR-V کسی مخصوص زبان سے منسلک نہیں ہے — Rust، Python، OpenCL C سے SPIR-V تک مرتب کرنے والے موجود ہیں۔

موبائل ڈویلپمنٹ میں shader

موبائل پلیٹ فارمز پر shader کی ڈیسک ٹاپ کے مقابلے میں حدود ہیں: کم رجسٹر، محدود درستگی اور کچھ ہدایات کے لیے سپورٹ کی کمی۔ Android (Vulkan/OpenGL ES) اور iOS (Metal) میں shader کی خصوصیات دیکھتے ہیں۔

Android پر shader

Android OpenGL کے لیے GLSL ES اور Vulkan کے لیے SPIR-V استعمال کرتا ہے۔ OpenGL ES 3.2 ڈیفالٹ طور پر mediump کے ساتھ shader کو سپورٹ کرتا ہے۔ Vulkan کو glslangValidator کے ذریعے GLSL سے SPIR-V میں واضح تالیف کی ضرورت ہے۔ Android پر، shader سٹرنگ وسائل یا مرتب شدہ SPIR-V فائلوں سے لوڈ ہوتے ہیں۔

Qualcomm Adreno GPU ڈرائیور کی سطح پر shader کو بہتر بناتا ہے۔ سفارشات: رنگ اور UV کے لیے mediump استعمال کریں، highp صرف مقامات کے لیے؛ vertex shader میں ساخت کے نمونے لینے سے بچیں؛ حسابات کو ویکٹر میں گروپ کریں (4x float کے بجائے vec4)۔ Qualcomm (2025) کے مطابق، یہ اصلاحات 30–50% بہتری لاتی ہیں۔

iOS پر shader

iOS صرف Metal Shading Language استعمال کرتا ہے۔ Shader Xcode کے ذریعے ایپلی کیشن کے ساتھ مشین کوڈ میں مرتب ہوتے ہیں۔ Metal shader کی پروفائلنگ کے لیے Shader Debugger اور GPU Capture فراہم کرتا ہے۔ Apple GPU (TBDR) میں مخصوص اصلاحات ہیں: early fragment test، memoryless render targets اور programmable blending۔

Apple WWDC 2024 کے مطابق، iOS shader کے لیے float کے بجائے half استعمال کرنا، رجسٹر دباؤ کو محدود کرنا (زیادہ سے زیادہ 64 رجسٹر) اور منحصر ساخت کے نمونے لینے سے بچنا ضروری ہے۔ iOS shader کمپیکٹ ہونے چاہئیں — مثالی سائز 50–100 ALU ہدایات۔

Unity اور Unreal Engine میں shader

گیم انجن Unity اور Unreal Engine، بصری shader ایڈیٹرز (Shader Graph، Material Editor) اور تجریدی زبانیں (ShaderLab، USF) فراہم کرتے ہیں۔ ڈویلپر shader کو اعلیٰ سطحی زبان میں لکھتا ہے اور انجن ہدف پلیٹ فارم کے لیے مرتب کرتا ہے۔ Unity درمیانی زبان کے طور پر HLSL استعمال کرتا ہے، Unreal USF (Unreal Shader Format) استعمال کرتا ہے۔

Shader کی اصلاح

Shader کی اصلاح موبائل آلات کے لیے گرافکس ڈویلپمنٹ میں ایک اہم مرحلہ ہے۔ ناقص لکھا ہوا shader FPS کو 60 سے 20 تک گرا سکتا ہے۔ اہم اصلاح کے اصولوں اور تکنیکوں کو دیکھتے ہیں۔

حساب کی درستگی

کم سے کم کافی درستگی استعمال کریں: رنگ اور UV کے لیے lowp، نارملز اور روشنی کے لیے mediump، صرف مقامات اور میٹرکس کے لیے highp۔ ARM (2025) کے مطابق، Mali GPU پر mediump آپریشنز highp سے 2 گنا تیز ہیں۔ GLSL ES میں، یہ درستگی کے تعین کنندگان کے ذریعے طے کیا جاتا ہے۔

ساخت کے نمونے لینے کو کم سے کم کرنا

ساخت کا نمونہ لینا shader میں سب سے مہنگا عمل ہے (ALU ہدایت کے 1–2 سائیکل کے مقابلے میں 10–30 سائیکل)۔ نمونے لینے کی تعداد کم کریں: ساختوں کو اٹلس میں یکجا کریں، ساخت کے بجائے uniform صفوں میں ڈیٹا محفوظ کریں، مشتق ہدایات کے ذریعے پڑوسی پکسلز کے نتائج کو کیش کریں۔

برانچنگ سے بچیں

متحرک برانچنگ (uniform متغیر کے ساتھ if) SIMT پائپ لائن کی کارکردگی کو کم کرتی ہے۔ برانچنگ کو ریاضیاتی افعال سے بدلیں: mix()، step()، smoothstep() اور clamp()۔ یہ افعال 1–2 ہدایات میں چلتے ہیں، جبکہ برانچنگ تھریڈ ڈائیورجنسی کی وجہ سے 8–16 ہدایات خرچ کر سکتی ہے۔

glsl
// برا: shader میں متحرک برانچنگ
if (u_enableLight) {
    color *= computeLighting(normal);
}

// اچھا: ریاضیاتی برانچ متبادل
color *= mix(1.0, computeLighting(normal),
              float(u_enableLight));

mix() دو اقدار کے درمیان لکیری انٹرپولیشن کرتا ہے۔ جب u_enableLight=0 ہو، تو 1.0 واپس کرتا ہے — رنگ تبدیل نہیں ہوتا۔ جب u_enableLight=1 ہو، تو روشنی کا نتیجہ واپس کرتا ہے۔ کوئی برانچنگ نہیں — تمام تھریڈز ایک ہی کوڈ چلاتے ہیں۔

Shader کی مثالیں

موبائل ڈویلپمنٹ کے لیے عملی shader مثالیں دیکھتے ہیں — سادہ شیڈنگ سے لے کر پروسیجرل ساخت کی تخلیق تک۔ ہر مثال ایک مخصوص تکنیک کو ظاہر کرتی ہے۔

Phong شیڈنگ (vertex shader)

Phong ماڈل بازی اور عکاسی کے اجزاء کے ساتھ کلاسک روشنی کا ماڈل ہے۔ Vertex Shader ہر عمودی پوائنٹ کے لیے روشنی کا حساب لگاتا ہے، Fragment Shader صرف نتیجہ کو انٹرپولیٹ کرتا ہے (Gouraud شیڈنگ)۔ کم قیمت کی وجہ سے موبائل آلات کے لیے موزوں ہے۔

glsl
#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;
}

Shader بازی روشنی کا حساب لگاتا ہے: نارمل اور روشنی کی سمت کا ڈاٹ پروڈکٹ۔ نتیجہ محیطی (0.3) اور بازی (0.7) اجزاء کے ساتھ ملایا جاتا ہے۔ فی عمودی پوائنٹ 10–15 ALU ہدایات چلاتا ہے — موبائل GPU پر 60 FPS پر 100,000 پولی گون کے لیے قابل قبول۔

پروسیجرل ساخت (fragment shader)

پروسیجرل ساختیں فائل سے لوڈ کیے بغیر Fragment Shader میں تیار کی جاتی ہیں۔ ویڈیو میموری بچاتی ہیں اور اینیمیشن کو آسان بناتی ہیں۔ مثال — قابل ایڈجسٹ سیل سائز کے ساتھ شطرنج کی بساط۔ صرف چند ALU ہدایات — GPU پر کم سے کم بوجھ۔

glsl
#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 ہدایات — موبائل آلات کے لیے مثالی shader۔ u_cells فی محور سیلز کی تعداد بتاتا ہے۔ floor اور mod سستے آپریشن ہیں جو تمام موبائل GPU پر 1 سائیکل میں چلتے ہیں۔

اکثر پوچھے گئے سوالات

Shader عام C++ پروگرام سے کیسے مختلف ہے؟

Shader GPU پر SIMT موڈ میں چلتا ہے — سینکڑوں تھریڈز کے لیے ایک ہدایت۔ عام C++ پروگرام CPU پر MIMD موڈ میں چلتا ہے۔ Shader کو فائل سسٹم، I/O یا متحرک میموری تک رسائی نہیں ہے۔ یہ بفرز اور ساخت کے ذریعے ڈیٹا حاصل کرتا ہے اور مقام یا رنگ واپس کرتا ہے۔

موبائل ڈویلپمنٹ کے لیے کونسی shader زبان سیکھنی چاہیے؟

GLSL — OpenGL ES اور WebGL کے لیے، کراس پلیٹ فارم۔ Metal Shading Language — iOS کے لیے۔ HLSL — Unity اور Unreal Engine کی بنیاد۔ GLSL سے شروع کریں — بنیادی باتوں کی سمجھ کسی بھی shader زبان پر لاگو ہوتی ہے۔

موبائل آلات پر shader سست کیوں ہوتے ہیں؟

بنیادی وجوہات: اعلی درستگی (mediump کے بجائے highp)، ضرورت سے زیادہ ساخت کے نمونے لینا، متحرک برانچنگ اور رجسٹر کی حد سے تجاوز۔ Shader تجزیہ کے لیے RenderDoc یا Xcode GPU Frame Debugger استعمال کریں۔

Compute shader کیا ہے اور اس کی کیا ضرورت ہے؟

Compute Shader GPU پر صوابدیدی حسابات کے لیے shader ہے: پارٹیکل فزکس، تصویری پروسیسنگ، کپڑے کی سمولیشن۔ Fragment Shader کے برعکس یہ پکسلز سے منسلک نہیں ہے اور صوابدیدی بفرز میں لکھ سکتا ہے۔

کیا پروگرامنگ زبان جانے بغیر shader لکھے جا سکتے ہیں؟

ہاں، بصری ایڈیٹرز کے ذریعے: Unity میں Shader Graph، Unreal Engine میں Material Editor یا Metal Shader Converter۔ یہ نوڈ پر مبنی اسکیما سے shader کوڈ تیار کرتے ہیں۔ گہری اصلاح کے لیے shader زبان کی سمجھ درکار ہے۔

خلاصہ

  • Shader GPU کے لیے ایک متوازی پروگرام ہے جو عمودی پوائنٹس، ٹکڑوں یا صوابدیدی ڈیٹا کو بڑی تعداد میں پروسیس کرتا ہے۔
  • Shader کی اقسام: Vertex، Fragment، Compute، Geometry، Tessellation اور Mesh — ہر ایک پائپ لائن کے اپنے مرحلے کے لیے ذمہ دار۔
  • زبانیں: GLSL (OpenGL)، HLSL (DirectX)، MSL (Metal)، SPIR-V (Vulkan) — GPU مشین کوڈ میں مرتب ہوتی ہیں۔
  • موبائل خصوصیات: mediump درستگی، کم سے کم ساخت کے نمونے لینا، متحرک برانچنگ نہیں۔
  • اصلاح: if کے بجائے mix()، half درستگی، ATF، ساخت کو اٹلس میں یکجا کرنا اور CPU پر پیشگی حساب۔
  • استعمال: Phong روشنی، پروسیجرل ساختیں، پوسٹ ایفیکٹس، پارٹیکل فزکس اور UI اثرات۔
  • آلات: RenderDoc، Xcode GPU Debugger، Qualcomm Adreno Profiler اور Mali Offline Compiler۔

ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے

IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔

پروجیکٹ پر بحث کریں

مزید پڑھیں