Shader — एक प्रोग्राम है जो GPU पर ग्राफिकॉ डेटा को प्रोसेस करने के लिए चलता है: वर्टिसेज़, फ्रैगमेंट या कंप्यूटेशनल कार्य। CPU पर सामान्य कोड के विपरीत, शेडर सैंकड़ों कोर पर समान्तर चलता है, प्रत्येक एलिमेंट को स्वतंत्र रूप से प्रोसेस करता है। Khronos Group (2025) के अनुसार, शेडर्स का उपयोग 100% आधुनिक 3D एप्लिकेशन्स में होता है — मोबाइल गेम्स से लेकर सिस्टम एप्लिकेशन्स में 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 सीमित सटीकता (lowp, 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 मोड में चलता है। शेडर की फ़ाइल सिस्टम, I/O या डायनेमिक मेमरी तक पहुँच नहीं है। यह बईफर्स और टेक्सचर्स के माध्यम से डेटा प्राप्त करता है और एक स्थिति या रंग लौटाता है।
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 एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें