Shader (sheyder) — bu grafik ma'lumotlarni: uchlar, fragmentlar yoki hisoblash vazifalarini qayta ishlash uchun GPUda bajariladigan dastur. CPUdagi oddiy koddan farqli o'laroq, sheyder yuzlab yadrolarda parallel ishlaydi, har bir elementni mustaqil qayta ishlaydi. Khronos Group (2025) ma'lumotlariga ko'ra, sheyderlar zamonaviy 3D ilovalarning 100 foizida qo'llaniladi — mobil o'yinlardan tortib tizim ilovalaridagi UI effektlarigacha. Ishlab chiquvchilar sheyderlarni ixtisoslashgan tillarda yozadi: GLSL, HLSL, Metal Shading Language yoki SPIR-V.
Asosiy
Shader — bu ixtisoslashgan tilda yozilgan va GPUda bajariladigan kichik dastur. Har bir sheyder bitta ma'lumot elementini — uchni, fragmentni (piksel) yoki ish elementini — boshqalardan mustaqil qayta ishlaydi. GPU parallelligi bir vaqtning o'zida minglab sheyder nusxalarini ishga tushirishga imkon beradi.
Termin Pixar tomonidan 1980-yillarda RenderMan-dagi sirtlarning ko'rinishini boshqaruvchi dasturlarni tavsiflash uchun kiritilgan. Real vaqtda sheyderlar NVIDIA GeForce 3 (2001) — dasturlashtiriladigan konveyerli birinchi video karta bilan paydo bo'ldi. Sheyderlardan oldin grafika qat'iy parametrlar orqali sozlanardi: rang, tekstura, aralashtirish rejimi.
Unity Technologies (2025) ma'lumotlariga ko'ra, o'rtacha mobil o'yin 50–200 sheyderdan foydalanadi. Har bir sheyder turli platformalar, sifat darajalari va yoritish konfiguratsiyalari uchun variantlar (variants) bilan taqdim etiladi. Variantlar soni loyiha bo'yicha 10 000 ga yetishi mumkin.
Sheyder arxitekturasi kirish ma'lumotlari (atributlar, uniform o'zgaruvchilar, teksturalar), dastur kodi va chiqish ma'lumotlari (rang, joylashuv) ga bo'linadi. Uniform o'zgaruvchilar sheyder ishga tushirilishidan oldin CPUdan o'rnatiladi va kadrning barcha elementlari uchun o'zgarmas bo'ladi. Atributlar — element bo'yicha ma'lumotlar (uch koordinatalari, normal, UV koordinatalari).
SIMT (Single Instruction, Multiple Threads) — GPUda sheyderlarni bajarish modeli. Bitta ko'rsatma bir marta yuklanadi, lekin yuzlab oqimlar tomonidan turli ma'lumotlar ustida bajariladi. Masalan, 1000 piksel uchun Fragment Shader bir xil kod bilan 1000 oqimni ishga tushiradi, lekin har bir oqim o'z UV koordinatalari va interpolyatsiya qilingan atributlarini oladi.
SIMTning muhim natijasi: sheyderlarda tarmoqlanishlar qimmat. Agar if bloki ichida oqimlarning yarmi bir tarmoqqa, yarmi ikkinchisiga ketsa, GPU ikkala tarmoqni barcha oqimlar uchun ketma-ket bajaradi. Samaradorlik 50% gacha tushadi. Sheyderlarda dinamik tarmoqlanishlardan qoching yoki ularni CPUda oldindan hisoblashlar orqali minimallashtiring.
Zamonaviy GPU bir necha turdagi sheyderlarni qo'llab-quvvatlaydi, har biri grafik yoki hisoblash konveyerining o'z bosqichi uchun. Asosiy turlarni ko'rib chiqamiz: uch, fragment, compute va zamonaviy mesh-sheyderlar.
| Sheyder turi | Konveyer bosqichi | Qayta ishlaydi | Til |
|---|---|---|---|
| Vertex Shader | Uch | Har bir uchni | GLSL, HLSL |
| Fragment Shader | Fragment | Har bir pikselni | GLSL, HLSL |
| Compute Shader | Hisoblash | Ixtiyoriy ma'lumotlar | GLSL, HLSL |
| Geometry Shader | Geometrik | Primitivlar | GLSL, HLSL |
| Tessellation Shader | Tesselyatsiya | Yamoqlar | GLSL, HLSL |
| Mesh Shader | Mesh konveyeri | Task + Mesh | HLSL, MSL |
Vertex Shader geometriyaning har bir uchini qayta ishlaydi: koordinatalarni o'zgartiradi, yoritishni hisoblaydi, ma'lumotlarni fragment sheyderiga uzatadi. Bu grafik konveyerining majburiy bosqichi — usiz uchlar ekranga tushmaydi. Vertex Shader har bir kadrning har bir uchi uchun chaqiriladi.
Fragment Shader (yoki Pixel Shader) — eng resurs talab qiladigan bosqich. U teksturalar, yoritish va materialdan foydalanib har bir fragmentning yakuniy rangini hisoblaydi. Fragment Shader geometriya bilan qoplangan har bir piksel uchun, barcha qo'llanilgan tekstura va effektlarni hisobga olgan holda bajariladi. Ushbu sheyderni optimallashtirish eng katta samaradorlik o'sishini beradi.
Compute Shader — GPUda ixtiyoriy hisoblashlar uchun universal sheyder. Grafik sheyderlardan farqli o'laroq, geometriya yoki piksellarga bog'liq emas. Compute Shader ish guruhlari orqali ixtiyoriy ma'lumot buferlari bilan ishlaydi. Fizika, zarrachalar simulyatsiyasi, post-effektlar va neyron tarmoqlarni inferensiya qilish uchun ishlatiladi.
Mesh Shader — NVIDIA Turing (2018) va Metal 3 da paydo bo'lgan eng yangi sheyder turi. Mesh Shader uch, geometrik va tesselyatsiya sheyderlarini bitta mesh konveyeri bilan almashtiradi. Task Shader bilan birga ishlaydi: Task Shader qaysi mesh guruhlarini render qilishni hal qiladi, Mesh Shader geometriyani uchish vaqtida yaratadi.
Sheyderlar GPU mashina kodiga kompilyatsiya qilinadigan ixtisoslashgan tillarda yoziladi. Til tanlash platforma va APIga bog'liq. Asosiy tillarni ko'rib chiqamiz: GLSL, HLSL, Metal Shading Language va oraliq format SPIR-V.
GLSL — OpenGL, OpenGL ES va WebGL uchun sheyder tili. Sintaksis vektor turlari (vec2, vec4, mat4) va o'rnatilgan funksiyalar (texture, normalize, reflect) qo'shilgan C tiliga asoslangan. GLSL ES — cheklangan aniqlikdagi (lowp, mediump, highp) mobil qurilmalar uchun versiya. Khronos (2025) ma'lumotlariga ko'ra, GLSL cross-platforma xususiyati tufayli eng keng tarqalgan sheyder tili bo'lib qolmoqda.
#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);
}
Oddiy fragment sheyderi UV koordinatalari bo'yicha teksturadan rangni o'qiydi. precision mediump GPUga float uchun yarim aniqlikdan foydalanishni buyuradi — mobil qurilmalarda bajarilishni 25–40% tezlashtiradi.
HLSL — Microsoftning DirectX uchun sheyder tili. Sintaksis sinflar, strukturalar va shablonlarni qo'llab-quvvatlash bilan C++ ga yaqinroq. HLSL Windows ilovalarida ishlatiladi va Shader Model 6.7+ orqali Ray Tracing, Mesh Shaders va Sampler Feedbackni qo'llab-quvvatlaydi. Mobil ishlab chiqish uchun HLSL to'g'ridan-to'g'ri ishlatilmaydi, lekin Vulkan uchun SPIR-V ga kompilyatsiya qilinadi.
MSL (Metal Shading Language) — C++14 ga asoslangan Apple sheyder tili. GLSL va HLSL dan farqli o'laroq, MSL ilova bilan birga kompilyatsiya qilinadi, bu qurilmada JIT kompilyatsiyani yo'q qiladi. MSL ko'rsatkichlar, shablonlar va C++ standart kutubxonasini qo'llab-quvvatlaydi. Barcha Apple qurilmalarida ishlatiladi: 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 resurslarni bog'lash uchun [[position]], [[stage_in]] va [[texture(N)]] atributlaridan foydalanadi. Apple kompilyatori registrlar va keshlar sonini hisobga olgan holda joriy GPU uchun optimallashtirilgan kod yaratadi.
SPIR-V — sheyderlarning oraliq ikkilik formati, Vulkan uchun standart. Sheyderlar GLSL yoki HLSL da yoziladi, SPIR-V ga kompilyatsiya qilinadi va Vulkan ilovasiga yuklanadi. SPIR-V aniq bir tilga bog'liq emas — Rust, Python, OpenCL C dan SPIR-V ga kompilyatorlar mavjud.
Mobil platformalarda sheyderlar ish stoli bilan solishtirganda cheklovlarga ega: kamroq registrlar, cheklangan aniqlik va ba'zi ko'rsatmalarning qo'llab-quvvatlanmasligi. Android (Vulkan/OpenGL ES) va iOS (Metal) sheyderlarining o'ziga xosligini ko'rib chiqamiz.
Android OpenGL uchun GLSL ES, Vulkan uchun SPIR-V ishlatadi. OpenGL ES 3.2 sheyderlarni standart mediump aniqligi bilan qo'llab-quvvatlaydi. Vulkan GLSLni glslangValidator orqali SPIR-V ga aniq kompilyatsiya qilishni talab qiladi. Androidda sheyderlar matn resurslaridan yoki kompilyatsiya qilingan SPIR-V fayllaridan yuklanadi.
Qualcomm Adreno GPU sheyderlarni drayver darajasida optimallashtiradi. Tavsiyalar: rang va UV uchun mediump, faqat pozitsiyalar uchun highp ishlating; uch sheyderlarida tekstura namunalaridan qoching; hisoblashlarni vektorlarda guruhlang (vec4 4x float o'rniga). Qualcomm (2025) ma'lumotlariga ko'ra, bu optimallashtirishlar 30–50% o'sish beradi.
iOS faqat Metal Shading Language dan foydalanadi. Sheyderlar Xcode orqali ilova bilan birga mashina kodiga kompilyatsiya qilinadi. Metal sheyderlarni profillash uchun Shader Debugger va GPU Capture ni taqdim etadi. Apple GPU (TBDR) o'ziga xos optimallashtirishlarga ega: early fragment test, memoryless render targets va dasturlashtiriladigan aralashtirish.
Apple WWDC 2024 ma'lumotlariga ko'ra, iOS sheyderlari uchun float o'rniga half ishlatish, registr bosimini cheklash (maks 64 registr) va bog'liq tekstura namunalaridan qochish juda muhim. iOS sheyderlari ixcham bo'lishi kerak — optimal o'lcham 50–100 ALU ko'rsatmasi.
Unity va Unreal Engine o'yin dvigatellari vizual sheyder muharrirlari (Shader Graph, Material Editor) va mavhum tillar (ShaderLab, USF) ni taqdim etadi. Ishlab chiquvchi yuqori darajadagi tilda sheyder yozadi, dvigatel esa uni maqsadli platforma uchun kompilyatsiya qiladi. Unity oraliq til sifatida HLSL, Unreal esa USF (Unreal Shader Format) dan foydalanadi.
Sheyderlarni optimallashtirish — mobil qurilmalar uchun grafik ishlab chiqishning asosiy bosqichi. Yomon yozilgan sheyder FPSni 60 dan 20 gacha tushirishi mumkin. Asosiy qoidalar va texnikalarni ko'rib chiqamiz.
Minimal yetarli aniqlikdan foydalaning: rang va UV uchun lowp, normallar va yoritish uchun mediump, faqat pozitsiyalar va matritsalar uchun highp. ARM (2025) ma'lumotlariga ko'ra, mediump operatsiyalari Mali GPUda highp dan 2 marta tezroq. GLSL ES da bu precision-kvalifikatorlari orqali o'rnatiladi.
Tekstura namunalari — sheyderdagi eng qimmat operatsiya (ALU ko'rsatmasi uchun 1–2 o'rniga 10–30 sikl). Namunalar sonini kamaytiring: teksturalarni atlaslarda birlashtiring, teksturalar o'rniga uniform massivlarida saqlashdan foydalaning, qo'shni piksellarning natijalarini hosila ko'rsatmalari orqali keshlang.
Dinamik tarmoqlanishlar (uniform o'zgaruvchili if) SIMT konveyerining samaradorligini pasaytiradi. Tarmoqlanishlarni matematik funksiyalar bilan almashtiring: mix(), step(), smoothstep() va clamp(). Bu funksiyalar 1–2 ko'rsatma ichida bajariladi, tarmoqlanish esa oqim divergensiyasi tufayli 8–16 ko'rsatmaga tushishi mumkin.
// Yomon: sheyderda dinamik tarmoqlanish
if (u_enableLight) {
color *= computeLighting(normal);
}
// Yaxshi: tarmoqlanishni matematik almashtirish
color *= mix(1.0, computeLighting(normal),
float(u_enableLight));
mix() ikki qiymat o'rtasida chiziqli interpolyatsiyani amalga oshiradi. u_enableLight=0 bo'lganda, 1.0 qaytariladi — rang o'zgarmaydi. u_enableLight=1 bo'lganda, yoritish natijasi qaytariladi. Tarmoqlanish yo'q — barcha oqimlar bir xil kodni bajaradi.
Mobil ishlab chiqish uchun sheyderlarning amaliy misollarini ko'rib chiqamiz — oddiy soyadan tortib protsessual tekstura yaratishgacha. Har bir misol aniq texnikani namoyish etadi.
Phong modeli — diffuz va spekulyar komponentli klassik yoritish modeli. Vertex Shader har bir uch uchun yoritishni hisoblaydi, Fragment Shader faqat natijani interpolyatsiya qiladi (Gouraud shading). Kam xarajati tufayli mobil qurilmalar uchun mos keladi.
#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;
}
Sheyder diffuse yoritishni hisoblaydi: normal va yorug'lik yo'nalishining skalyar ko'paytmasi. Natija ambient (0.3) va diffuse (0.7) komponentlari bilan aralashtiriladi. Har bir uch uchun 10–15 ALU ko'rsatmasi bajaradi — mobil GPUda 60 FPS da 100 000 poligon uchun maqbul.
Protsessual teksturalar fayldan yuklanmasdan Fragment Shaderda yaratiladi. Video xotirani tejaydi va animatsiyani soddalashtiradi. Misol — o'zgaruvchan hujayra o'lchamli shaxmat taxtasi. Bir necha ALU ko'rsatmasi — GPUda minimal yuk.
#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 ko'rsatmasi — mobil qurilmalar uchun ideal sheyder. u_cells o'q bo'yicha hujayralar sonini belgilaydi. floor va mod — barcha mobil GPU larda 1 siklda bajariladigan arzon operatsiyalar.
Ko'p beriladigan savollar
Shader GPUda SIMT rejimida bajariladi — yuzlab oqimlar uchun bitta ko'rsatma. Oddiy C++ dasturi — CPUda MIMD rejimida. Sheyder fayl tizimiga, kirish/chiqishga va dinamik xotiraga kirish imkoniyatiga ega emas. U ma'lumotlarni buferlar va teksturalar orqali oladi va joylashuv yoki rangni qaytaradi.
GLSL — OpenGL ES va WebGL uchun, cross-platforma. Metal Shading Language — iOS uchun. HLSL — Unity va Unreal Engine uchun asos. GLSL dan boshlang — asoslarni tushunish istalgan sheyder tiliga o'tadi.
Asosiy sabablar: yuqori aniqlik (mediump o'rniga highp), haddan tashqari tekstura namunalari, dinamik tarmoqlanishlar va registr limitidan oshib ketish. Sheyderlarni tahlil qilish uchun RenderDoc yoki Xcode GPU Frame Debugger dan foydalaning.
Compute Shader — GPUda ixtiyoriy hisoblashlar uchun sheyder: zarrachalar fizikasi, tasvirni qayta ishlash, mato simulyatsiyasi. Fragment Shader dan farqli o'laroq, piksellarga bog'liq emas va ixtiyoriy buferlarga yozishi mumkin.
Ha, vizual muharrirlar orqali: Unity da Shader Graph, Unreal Engine da Material Editor yoki Metal Shader Converter. Ular tugun sxemasi asosida sheyder kodini yaratadi. Chuqur optimallashtirish uchun sheyder tilini tushunish talab qilinadi.
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.