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 एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें