Fragment Shader — grafik konveyerining dasturlashtiriladigan bosqichi bo'lib, tasvirning har bir fragmenti (piksell) yakuniy rangini aniqlaydi. Khronos Group, 2025 ma'lumotlariga ko'ra, fragment shaderi Vertex Shader-dan interpolyatsiya qilingan ma'lumotlarni oladi va yoritish, teksturlash va rang effektlarini hisoblashni amalga oshiradi. Fragment Shader har bir piksel uchun chaqiriladi, bu uni grafik konveyerining eng resurs talab qiluvchi bosqichiga aylantiradi.
Asosiy ma'lumotlar
Fragment Shader (fragment yoki piksel shaderi) — grafik konveyerining dasturlashtiriladigan bosqichi bo'lib, tasvirning har bir fragmentining yakuniy rangini hisoblaydi. Fragment — chuqurlik va trafaret testlaridan o'tgandan so'ng ekranda ko'rinadigan pikselga aylanadigan potensial pikseldir.
Fragment Shader rastrlashdan so'ng, uch o'lchamli primitivlar (uchburchaklar) allaqachon fragmentlar to'plamiga aylantirilganda bajariladi. Shader kirishda interpolyatsiya qilingan atributlarni — Vertex Shader-da uchburchakning uchlari uchun hisoblangan va uning ichidagi har bir piksel uchun chiziqli interpolyatsiya qilingan tekstur koordinatalari, normallar, ranglarni oladi.
Dasturlashtiriladigan shaderlar paydo bo'lishidan oldin (DirectX 8 / OpenGL 2.0 dan oldin) piksel rangini hisoblash cheklangan operatsiyalar to'plami bilan qattiq konveyer tomonidan amalga oshirilar edi. Dasturlashtiriladigan Fragment Shader 2001 yilda paydo bo'ldi va grafik imkoniyatlarini tubdan kengaytirdi: dasturchilar har bir piksel rangi ustidan to'liq nazoratga ega bo'lishdi, bu fotorealistik yoritish, murakkab materiallar va post-effektlarni amalga oshirishga imkon berdi.
Fragment Shader rastrlashtiruvchi tomonidan yaratilgan har bir fragment uchun GPU tomonidan ishga tushiriladi. Shaderning har bir chaqiruvi bitta fragmentni qayta ishlaydi, uning kirish ma'lumotlarini o'qiydi, foydalanuvchi kodini bajaradi va chiqish qiymatini — fragment rangini RGBA formatida yozadi.
Fragment Shaderning kirish ma'lumotlariga Vertex Shader-dan interpolyatsiya qilingan atributlar (tekstur koordinatalari, normallar, ranglar), uniform o'zgaruvchilar (yorug'lik manbalari, matritsalar) va tekstur samplerlari kiradi. Chiqish ma'lumotlari — rang vektori (OpenGL ES 2.0 da gl_FragColor yoki ES 3.0 da foydalanuvchi o'zgaruvchisi) rang buferiga yoziladi.
#version 300 es
precision mediump float;
in vec2 vTexCoord;
uniform sampler2D uTexture;
out vec4 fragColor;
void main() {
fragColor = texture(uTexture, vTexCoord);
}
Fragment Shader tasvirning vizual sifati uchun javobgardir. Foydalanuvchi ekranda ko'rgan barcha effektlar — rang, soyalar, aks ettirishlar, shaffoflik — aynan grafik konveyerining ushbu bosqichida hisoblanadi.
Eng keng tarqalgan operatsiya — interpolyatsiya qilingan UV koordinatalari bo'yicha teksturdan rang olish. Sampler2D va texture() funksiyasi tekstur atlasidan piksel rangini olish imkonini beradi. Filtrlash (bilinear, trilinear, anizotrop) sampler parametrlari orqali boshqariladi va turli ko'rish burchaklarida tasvir aniqligiga ta'sir qiladi.
Phong yoritish modeli (Phong shading) Fragment Shader-da har bir piksel uchun hisoblanadi, bu uch yoritishidan (Gouraud shading) silliqroq yaltirashlarni beradi. Phong lighting uch komponentni o'z ichiga oladi: ambient (fon), diffuse (tarqoq) va specular (ko'zgu).
// Phong yoritishi bilan fragment shaderi
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 post-ishlov berishni qo'llash imkonini beradi: LUT jadvallari orqali rang tuzatish, xiralashtirish (blur), porlash effekti (bloom) va HDR renderlash uchun tonemapping. Bu effektlarning barchasi piksel darajasida ishlaydi va real vaqtda bajariladi.
Fragment Shader ishlashi — zamonaviy mobil o'yinlarda FPSni cheklovchi asosiy omil. Shader har bir piksel uchun chaqirilganligi sababli, kod murakkabligining kichik o'sishi ham kadrlar chastotasining sezilarli pasayishiga olib kelishi mumkin.
Mobil GPUlar (Qualcomm Adreno, ARM Mali) uchun tavsiya etiladi: float o'zgaruvchilar uchun mediump precision dan foydalanish, tekstur tanlashlarni birlashtirish, shaderni bajarishdan oldin ko'rinmas fragmentlarni tashlash uchun early-z testlarini qo'llash.
| Usul | Tavsif | Foyda |
|---|---|---|
| Mediump precision | 32-bitli o'rniga 16-bitli aniqlik | 2x tezlikkacha |
| Early-Z | Shaderdan oldin chuqurlik testi | Chaqiruvlarni kamaytirish |
| Texture atlasing | Bir nechta o'rniga bitta tekstur | Kamroq o'tish |
Ikkala shader turi ham dasturchi tomonidan dasturlashtiriladi, lekin konveyerning turli bosqichlarida ishlaydi va turli vazifalarni hal qiladi. Fragment Shader chaqiruvlar soni tufayli sezilarli darajada ko'proq resurs talab qiladi.
| Parametr | Fragment Shader | Vertex Shader |
|---|---|---|
| Chaqiruvlar soni | Millionlab (ekran o'lchami) | Minglab (uchlar soni) |
| Kirish ma'lumotlari | Interpolyatsiya qilingan atributlar | Uch atributlari |
| Asosiy funksiya | Fragment rangini hisoblash | Geometriyani transformatsiya qilish |
| Teksturlarga kirish | To'liq (ko'p sampler) | Cheklangan |
| Ishlashga ta'siri | Yuqori (o'lchamga bog'liq) | O'rtacha (geometriyaga bog'liq) |
Fragment Shader oddiy (teksturdan tanlash) yoki murakkab (ko'p qatlamli yoritish) bo'lishi mumkin. Ikkita amaliy misolni ko'rib chiqamiz: asosiy teksturlash va vaqtdan foydalangan holda gradient effekti.
#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;
}
Tez-tez beriladigan savollar
Fragment Shader — GPUdagi kichik dastur bo'lib, ekrandagi har bir pikselning qanday rangda bo'lishini aniqlaydi. Agar Vertex Shader ob'ektning shaklini aniqlasa, Fragment Shader bu ob'ektning qanday ko'rinishini — tekstur, yoritish, rangni aniqlaydi.
Fragment Shader ekrandagi har bir piksel uchun chaqiriladi. 2532x1170 o'lchamli qurilmada (iPhone) bu kadr uchun deyarli 3 million chaqiruv demakdir. 60 FPS da shader sekundiga 180 million marta bajariladi, bu juda katta hisoblash quvvatini talab qiladi.
Fragment Shaderda amalga oshiriladi: teksturlash, yoritish (Phong, PBR), soyalar, aks ettirishlar, sinishlar, bloom, aniqlik chuqurligi, rang tuzatish, LUT filtrlari va protsedural tekstur generatsiyasi.
Float uchun mediump precision dan foydalaning, tekstur tanlashlar sonini kamaytiring, early-z tashlashni qo'llang, shader operatsiyalarini birlashtiring va shader ichida shartli o'tishlardan qoching.
Bu bir xil narsa. Fragment Shader atamasi OpenGL / Vulkanda, Pixel Shader esa Direct3D (Microsoft) terminologiyasida ishlatiladi. Funksional jihatdan bir xil: ikkalasi ham har bir fragment/piksel rangini hisoblaydi.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.