Shader: bu nədir, shader növləri və onlar necə işləyir

Müəllif: IT Sectr Dərc olunub: 2026-06-11 Oxuma vaxtı: 8 dəq

Shader (şeyder) — qrafik məlumatları: təpələri, fraqmentləri və ya hesablama tapşırıqlarını emal etmək üçün GPU-da icra olunan proqramdır. CPU-da adi koddan fərqli olaraq, şeyder yüzlərlə nüvədə paralel işləyir, hər bir elementi müstəqil emal edir. Khronos Group (2025) məlumatlarına görə, şeyderlər müasir 3D tətbiqlərinin 100%-də istifadə olunur — mobil oyunlardan sistem tətbiqlərindəki UI effektlərinə qədər. Tərtibatçılar şeyderləri ixtisaslaşmış dillərdə yazır: GLSL, HLSL, Metal Shading Language və ya SPIR-V.

Əsas məqamlar

  • Shader — GPU üçün proqram, səhnənin hər bir elementi üçün yüzlərlə nüvədə paralel icra olunur.
  • Shader növləri: təpə, fraqment, compute, geometry, tessellation və mesh-şeyderlər.
  • Dillər: GLSL (OpenGL), HLSL (DirectX), MSL (Metal), SPIR-V (Vulkan) — hamısı GPU maşın koduna kompilyasiya olunur.
  • Mobil inkişafda şeyderlər effektlər, post-emal, işıqlandırma və hesablamalar üçün istifadə olunur.
  • Shader optimallaşdırılması: mediump dəqiqliyi, budaqlanmaların minimuma endirilməsi və mobil GPU üçün ATF (Adaptive Texture Fetch).

Shader nədir?

Shader — ixtisaslaşmış dildə yazılmış və GPU-da icra olunan kiçik proqramdır. Hər bir şeyder bir məlumat elementini — təpə, fraqment (piksel) və ya iş elementini — digərlərindən müstəqil emal edir. GPU paralelliyi eyni anda minlərlə şeyder nüsxəsini işə salmağa imkan verir.

Termin Pixar tərəfindən 1980-ci illərdə RenderMan-də səthlərin görünüşünü idarə edən proqramları təsvir etmək üçün təqdim edilmişdir. Real vaxt rejimində şeyderlər NVIDIA GeForce 3 (2001) — proqramlaşdırıla bilən konveyerə malik ilk video kartı ilə ortaya çıxdı. Şeyderlərdən əvvəl qrafik sabit parametrlər vasitəsilə konfiqurasiya olunurdu: rəng, tekstura, qarışdırma rejimi.

Unity Technologies (2025) məlumatlarına görə, orta mobil oyun 50–200 şeyderdən istifadə edir. Hər bir şeyder müxtəlif platformalar, keyfiyyət səviyyələri və işıqlandırma konfiqurasiyaları üçün variantlarla (variants) təmsil olunur. Variantların sayı layihə üzrə 10 000-ə çata bilər.

Shader arxitekturası giriş məlumatları (atributlar, uniform dəyişənlər, teksturalar), proqram koduçıxış məlumatları (rəng, mövqe) bölünür. Uniform dəyişənlər şeyder işə salınmazdan əvvəl CPU-dan təyin edilir və kadrın bütün elementləri üçün dəyişməz qalır. Atributlar element üzrə məlumatlardır (təpə koordinatları, normal, UV koordinatları).

SIMT icra modeli

SIMT (Single Instruction, Multiple Threads) — GPU-da şeyderlərin icra modeli. Bir təlimat bir dəfə yüklənir, lakin yüzlərlə mövzu tərəfindən müxtəlif məlumatlar üzərində icra olunur. Məsələn, 1000 piksel üçün Fragment Shader eyni kodla 1000 mövzu işə salır, lakin hər mövzu öz UV koordinatlarını və interpolyasiya olunmuş atributlarını alır.

SIMT-in mühüm nəticəsi: şeyderlərdə budaqlanmalar bahalıdır. if bloku daxilində mövzuların yarısı bir budağa, yarısı digərinə gedirsə, GPU hər iki budağı bütün mövzular üçün ardıcıl icra edir. Performans 50%-ə düşür. Şeyderlərdə dinamik budaqlanmalardan qaçın və ya onları CPU-da ilkin hesablamalar vasitəsilə minimuma endirin.

Shader növləri

Müasir GPU bir neçə növ şeyderi dəstəkləyir, hər biri qrafik və ya hesablama konveyerinin öz mərhələsi üçün. Əsas növləri nəzərdən keçirək: təpə, fraqment, compute və müasir mesh-şeyderlər.

Shader növüKonveyer mərhələsiEmal edirDil
Vertex ShaderTəpəHər təpəniGLSL, HLSL
Fragment ShaderFraqmentHər pikseliGLSL, HLSL
Compute ShaderHesablamaİxtiyari məlumatlarGLSL, HLSL
Geometry ShaderHəndəsiPrimitivlərGLSL, HLSL
Tessellation ShaderTesselasiyaParçalarGLSL, HLSL
Mesh ShaderMesh konveyeriTask + MeshHLSL, MSL

Vertex Shader

Vertex Shader həndəsənin hər təpəsini emal edir: koordinatları transformasiya edir, işıqlandırmanı hesablayır, məlumatları fraqment şeyderinə ötürür. Bu, qrafik konveyerinin məcburi mərhələsidir — onsuz təpələr ekrana düşməz. Vertex Shader hər kadrın hər təpəsi üçün çağırılır.

Fragment Shader

Fragment Shader (və ya Pixel Shader) — ən resurs tutumlu mərhələdir. O, teksturalar, işıqlandırma və materialdan istifadə edərək hər fraqmentin son rəngini hesablayır. Fragment Shader həndəsə ilə örtülmüş hər piksel üçün, bütün tətbiq olunmuş tekstura və effektlər nəzərə alınmaqla icra olunur. Bu şeyderin optimallaşdırılması ən böyük performans artımını verir.

Compute Shader

Compute Shader — GPU-da ixtiyari hesablamalar üçün universal şeyderdir. Qrafik şeyderlərdən fərqli olaraq, həndəsə və ya piksellərə bağlı deyil. Compute Shader iş qrupları vasitəsilə ixtiyari məlumat buferləri ilə işləyir. Fizika, hissəcik simulyasiyası, post-effektlər və neyron şəbəkələrin inferensiyası üçün istifadə olunur.

Mesh Shader

Mesh Shader — NVIDIA Turing (2018) və Metal 3-də ortaya çıxan ən yeni şeyder növüdür. Mesh Shader təpə, həndəsi və tesselasiya şeyderlərini bir mesh konveyeri ilə əvəz edir. Task Shader ilə birlikdə işləyir: Task Shader hansı mesh qruplarının render ediləcəyinə qərar verir, Mesh Shader həndəsəni uçuş zamanı yaradır.

Shader yazmaq üçün dillər

Şeyderlər GPU maşın koduna kompilyasiya olunan ixtisaslaşmış dillərdə yazılır. Dil seçimi platformadan və API-dən asılıdır. Əsas dilləri nəzərdən keçirək: GLSL, HLSL, Metal Shading Language və aralıq format SPIR-V.

GLSL (OpenGL Shading Language)

GLSL — OpenGL, OpenGL ES və WebGL üçün şeyder dilidir. Sintaksis vektor tipləri (vec2, vec4, mat4) və daxili funksiyalar (texture, normalize, reflect) əlavə edilmiş C dilinə əsaslanır. GLSL ES — məhdud dəqiqlikli (lowp, mediump, highp) mobil cihazlar üçün versiyadır. Khronos (2025) məlumatlarına görə, GLSL cross-platforma xüsusiyyəti sayəsində ən geniş yayılmış şeyder dili olaraq qalır.

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

Sadə fraqment şeyderi UV koordinatları üzrə teksturadan rəngi oxuyur. precision mediump GPU-ya float üçün yarım dəqiqlikdən istifadə etməyi əmr edir — mobil cihazlarda icranı 25–40% sürətləndirir.

HLSL (High-Level Shader Language)

HLSL — Microsoft-un DirectX üçün şeyder dilidir. Sintaksis siniflər, strukturlar və şablonlar dəstəyi ilə C++-a daha yaxındır. HLSL Windows tətbiqlərində istifadə olunur və Shader Model 6.7+ vasitəsilə Ray Tracing, Mesh Shaders və Sampler Feedback-i dəstəkləyir. Mobil inkişaf üçün HLSL birbaşa istifadə edilmir, lakin Vulkan üçün SPIR-V-yə kompilyasiya olunur.

Metal Shading Language

MSL (Metal Shading Language) — C++14-ə əsaslanan Apple şeyder dilidir. GLSL və HLSL-dən fərqli olaraq, MSL tətbiq ilə birlikdə kompilyasiya olunur ki, bu da cihazda JIT-kompilyasiyanı aradan qaldırır. MSL göstəriciləri, şablonları və C++ standart kitabxanasını dəstəkləyir. Bütün Apple cihazlarında istifadə olunur: 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 resursları bağlamaq üçün [[position]], [[stage_in]] və [[texture(N)]] atributlarından istifadə edir. Apple kompilyatoru registrlərin və keşin sayını nəzərə alaraq cari GPU üçün optimallaşdırılmış kod yaradır.

SPIR-V

SPIR-V — şeyderlərin aralıq ikili formatı, Vulkan üçün standartdır. Şeyderlər GLSL və ya HLSL-də yazılır, SPIR-V-yə kompilyasiya olunur və Vulkan tətbiqinə yüklənir. SPIR-V konkret dilə bağlı deyil — Rust, Python, OpenCL C-dən SPIR-V-yə kompilyatorlar mövcuddur.

Mobil inkişafda şeyderlər

Mobil platformalarda şeyderlər masaüstü ilə müqayisədə məhdudiyyətlərə malikdir: daha az registr, məhdud dəqiqlik və bəzi təlimatların dəstəklənməməsi. Android (Vulkan/OpenGL ES) və iOS (Metal) şeyderlərinin spesifikasını nəzərdən keçirək.

Android-də şeyderlər

Android OpenGL üçün GLSL ES, Vulkan üçün SPIR-V istifadə edir. OpenGL ES 3.2 şeyderləri defolt olaraq mediump dəqiqliyi ilə dəstəkləyir. Vulkan GLSL-nin glslangValidator vasitəsilə SPIR-V-yə açıq şəkildə kompilyasiyasını tələb edir. Android-də şeyderlər mətn resurslarından və ya kompilyasiya olunmuş SPIR-V fayllarından yüklənir.

Qualcomm Adreno GPU şeyderləri sürücü səviyyəsində optimallaşdırır. Tövsiyələr: rəng və UV üçün mediump, yalnız mövqelər üçün highp istifadə edin; təpə şeyderlərində tekstura nümunələrindən qaçın; hesablamaları vektorlarda qruplaşdırın (vec4 4x float əvəzinə). Qualcomm (2025) məlumatlarına görə, bu optimallaşdırmalar 30–50% artım verir.

iOS-da şeyderlər

iOS yalnız Metal Shading Language-dən istifadə edir. Şeyderlər Xcode vasitəsilə tətbiq ilə birlikdə maşın koduna kompilyasiya olunur. Metal şeyderlərin profilləşdirilməsi üçün Shader DebuggerGPU Capture təqdim edir. Apple GPU (TBDR) spesifik optimallaşdırmalara malikdir: early fragment test, memoryless render targets və proqramlaşdırıla bilən qarışdırma.

Apple WWDC 2024 məlumatlarına görə, iOS şeyderləri üçün float əvəzinə half istifadə etmək, registr təzyiqini məhdudlaşdırmaq (maks 64 registr) və asılı tekstura nümunələrindən qaçmaq kritikdir. iOS şeyderləri yığcam olmalıdır — optimal ölçü 50–100 ALU təlimatıdır.

Unity və Unreal Engine-də şeyderlər

Unity və Unreal Engine oyun mühərrikləri vizual şeyder redaktorları (Shader Graph, Material Editor) və abstrakt dillər (ShaderLab, USF) təqdim edir. Tərtibatçı yüksək səviyyəli dildə şeyder yazır, mühərrik isə hədəf platforma üçün kompilyasiya edir. Unity aralıq dil olaraq HLSL, Unreal isə USF (Unreal Shader Format) istifadə edir.

Shader optimallaşdırılması

Shader optimallaşdırılması — mobil cihazlar üçün qrafik inkişafının əsas mərhələsidir. Pis yazılmış şeyder FPS-i 60-dan 20-yə endirə bilər. Əsas qayda və texnikaları nəzərdən keçirək.

Hesablama dəqiqliyi

Minimal kifayət dəqiqlikdən istifadə edin: rəng və UV üçün lowp, normallar və işıqlandırma üçün mediump, yalnız mövqelər və matrislər üçün highp. ARM (2025) məlumatlarına görə, mediump əməliyyatları Mali GPU-da highp-dən 2 dəfə sürətlidir. GLSL ES-də bu, precision-kvalifikatorları vasitəsilə təyin edilir.

Tekstura nümunələrinin minimuma endirilməsi

Tekstura nümunələri — şeyderdə ən bahalı əməliyyat (ALU təlimatı üçün 1–2 əvəzinə 10–30 dövr). Nümunələrin sayını azaldın: teksturaları atlaslarda birləşdirin, teksturalar əvəzinə uniform massivlərində məlumat saxlama istifadə edin, qonşu piksellərin nəticələrini törəmə təlimatları vasitəsilə keşləyin.

Budaqlanmalardan qaçın

Dinamik budaqlanmalar (uniform dəyişənli if) SIMT konveyerinin performansını aşağı salır. Budaqlanmaları riyazi funksiyalarla əvəz edin: mix(), step(), smoothstep()clamp(). Bu funksiyalar 1–2 təlimatda icra olunur, halbuki budaqlanma mövzu divergensiyası səbəbindən 8–16 təlimata başa gələ bilər.

glsl
// Pis: şeyderdə dinamik budaqlanma
if (u_enableLight) {
    color *= computeLighting(normal);
}

// Yaxşı: riyazi budaqlanma əvəzlənməsi
color *= mix(1.0, computeLighting(normal),
              float(u_enableLight));

mix() iki dəyər arasında xətti interpolyasiya yerinə yetirir. u_enableLight=0 olduqda, 1.0 qaytarılır — rəng dəyişmir. u_enableLight=1 olduqda, işıqlandırma nəticəsi qaytarılır. Budaqlanma yoxdur — bütün mövzular eyni kodu icra edir.

Shader nümunələri

Mobil inkişaf üçün şeyderlərin praktik nümunələrini nəzərdən keçirək — sadə rəngləmədən prosedur tekstura yaratmaya qədər. Hər nümunə konkret bir texnikanı nümayiş etdirir.

Phong rəngləmə (vertex shader)

Phong modeli — diffuz və spekulyar komponentləri olan klassik işıqlandırma modelidir. Vertex Shader hər təpə üçün işıqlandırmanı hesablayır, Fragment Shader yalnız nəticəni interpolyasiya edir (Gouraud shading). Aşağı qiymətinə görə mobil cihazlar üçün uyğundur.

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 diffuse işıqlandırmanı hesablayır: normal və işıq istiqamətinin skalyar hasili. Nəticə ambient (0.3) və diffuse (0.7) komponentləri ilə qarışdırılır. Hər təpə üçün 10–15 ALU təlimatı icra edir — mobil GPU-da 60 FPS-də 100 000 poliqon üçün məqbuldur.

Prosedur tekstura (fragment shader)

Prosedur teksturalar fayldan yükləmədən Fragment Shader-də yaradılır. Video yaddaşa qənaət edir və animasiyanı sadələşdirir. Nümunə — dəyişən hücrə ölçüsü olan şahmat taxtası. Cəmi bir neçə ALU təlimatı — GPU-da minimal yük.

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 təlimatı — mobil cihazlar üçün ideal şeyder. u_cells ox üzrə hücrələrin sayını təyin edir. floormod — bütün mobil GPU-larda 1 dövrədə icra olunan ucuz əməliyyatlar.

Tez-tez verilən suallar

Shader adi C++ proqramından nə ilə fərqlənir?

Shader GPU-da SIMT rejimində icra olunur — yüzlərlə mövzu üçün bir təlimat. Adi C++ proqramı — CPU-da MIMD rejimində. Shader fayl sisteminə, giriş/çıxışa və dinamik yaddaşa çıxışı yoxdur. O, məlumatları buferlər və teksturalar vasitəsilə alır və mövqe və ya rəng qaytarır.

Mobil inkişaf üçün hansı şeyder dilini öyrənməliyəm?

GLSL — OpenGL ES və WebGL üçün, cross-platforma. Metal Shading Language — iOS üçün. HLSL — Unity və Unreal Engine üçün əsas. GLSL-dən başlayın — əsasları başa düşmək istənilən şeyder dilinə keçir.

Niyə şeyderlər mobil cihazlarda yavaş işləyir?

Əsas səbəblər: yüksək dəqiqlik (mediump əvəzinə highp), həddindən artıq tekstura nümunələri, dinamik budaqlanmalar və registr limitinin aşılması. Şeyderləri təhlil etmək üçün RenderDoc və ya Xcode GPU Frame Debugger istifadə edin.

Compute shader nədir və nə üçün lazımdır?

Compute Shader — GPU-da ixtiyari hesablamalar üçün şeyder: hissəcik fizikası, təsvir emalı, parça simulyasiyası. Fragment Shader-dən fərqli olaraq, piksellərə bağlı deyil və ixtiyari buferlərə yaza bilər.

Proqramlaşdırma dillərini bilmədən şeyder yazmaq mümkündürmü?

Bəli, vizual redaktorlar vasitəsilə: Unity-də Shader Graph, Unreal Engine-də Material Editor və ya Metal Shader Converter. Onlar qovşaq sxemi əsasında şeyder kodu yaradır. Dərin optimallaşdırma üçün şeyder dilini başa düşmək tələb olunur.

Nəticə

  • Shader — GPU üçün paralel proqram, təpələri, fraqmentləri və ya ixtiyari məlumatları kütləvi emal edir.
  • Shader növləri: Vertex, Fragment, Compute, Geometry, Tessellation və Mesh — hər biri konveyerin öz mərhələsinə cavabdehdir.
  • Dillər: GLSL (OpenGL), HLSL (DirectX), MSL (Metal), SPIR-V (Vulkan) — GPU maşın koduna kompilyasiya olunur.
  • Mobil spesifikasiya: mediump dəqiqliyi, minimum tekstura nümunələri, dinamik budaqlanmaların olmaması.
  • Optimallaşdırma: if əvəzinə mix(), half dəqiqliyi, ATF, teksturaların atlaslarda birləşdirilməsi və CPU-da ilkin hesablamalar.
  • Tətbiq: Phong işıqlandırması, prosedur teksturalar, post-effektlər, hissəcik fizikası və UI effektləri.
  • Alətlər: RenderDoc, Xcode GPU Debugger, Qualcomm Adreno Profiler və Mali Offline Compiler şeyder təhlili üçün.

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun