Fragment Shader — bu nədir, vəzifələri və iş prinsipi

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

Fragment Shader — qrafik konveyerinin proqramlaşdırıla bilən mərhələsidir, təsvirin hər bir framentinin (pikselinin) son rəngini təyin edir. Khronos Group, 2025 məlumatına görə, frament şeyderi Vertex Shader-dən interpolyasiya olunmuş məlumatları alır və işıqlandırma, teksturlama və rəng effektlərinin hesablamalarını aparır. Fragment Shader hər bir piksel üçün çağırılır, bu da onu qrafik konveyerinin ən resurs tutumlu mərhələsi edir.

Əsas məqamlar

  • Fragment Shader — GPU-nun proqramlaşdırıla bilən mərhələsi, ekrandakı hər pikselin rəngini təyin edir.
  • Çağırış sayı ekranın təsvir ölçüsünə bərabərdir, bu da onu renderləmənin əsas hesablama yükü edir.
  • Teksturlama və Phong işıqlandırması — frament şeyderində həyata keçirilən tipik tapşırıqlar.
  • GLSL və Metal Shading Language Fragment Shader yazmaq üçün standart vasitələr təqdim edir.
  • Fragment Shader performansı mobil tətbiqlərdə 60 FPS-ə çatmaq üçün kritik əhəmiyyət daşıyır.

Fragment Shader nədir?

Fragment Shader (frament və ya piksel şeyderi) — qrafik konveyerinin proqramlaşdırıla bilən mərhələsidir, təsvirin hər bir framentinin son rəngini hesablayır. Frament — dərinlik və trafaret testlərindən keçdikdən sonra ekranda görünən pikselə çevrilən potensial pikseldir.

Fragment Shader rastrlaşdırmadan sonra, üçölçülü primitivlər (üçbucaqlar) artıq framentlər dəstinə çevrildikdə icra olunur. Şeyder girişdə interpolyasiya olunmuş atributları — Vertex Shader-də üçbucağın təpə nöqtələri üçün hesablanmış və onun daxilindəki hər piksel üçün xətti interpolyasiya olunmuş tekstur koordinatlarını, normalları, rəngləri alır.

Fragment Shader-in təkamül tarixi

Proqramlaşdırıla bilən şeyderlər meydana gəlməzdən əvvəl (DirectX 8 / OpenGL 2.0-dan əvvəl) piksel rənginin hesablanması məhdud əməliyyat dəsti ilə sabit konveyer tərəfindən həyata keçirilirdi. Proqramlaşdırıla bilən Fragment Shader 2001-ci ildə ortaya çıxdı və qrafika imkanlarını kökündən genişləndirdi: proqramçılar hər pikselin rəngi üzərində tam nəzarət əldə etdilər, bu da fotorealistik işıqlandırma, mürəkkəb materiallar və post-effektləri həyata keçirməyə imkan verdi.

Fragment Shader necə işləyir?

Fragment Shader rastrlaşdırıcı tərəfindən yaradılan hər frament üçün GPU tərəfindən işə salınır. Şeyderin hər çağırışı bir framenti emal edir, onun giriş məlumatlarını oxuyur, istifadəçi kodunu icra edir və çıxış dəyərini — framentin rəngini RGBA formatında yazır.

Giriş və çıxış məlumatları

Fragment Shader-in giriş məlumatlarına Vertex Shader-dən interpolyasiya olunmuş atributlar (tekstur koordinatları, normallar, rənglər), uniform dəyişənlər (işıq mənbələri, matrislər) və tekstur samplerləri daxildir. Çıxış məlumatları — rəng vektoru (OpenGL ES 2.0-da gl_FragColor və ya ES 3.0-da istifadəçi dəyişəni), rəng buferinə yazılır.

glsl
#version 300 es
precision mediump float;

in vec2 vTexCoord;
uniform sampler2D uTexture;
out vec4 fragColor;

void main() {
    fragColor = texture(uTexture, vTexCoord);
}

Fragment Shader-in əsas vəzifələri

Fragment Shader təsvirin vizual keyfiyyətinə cavabdehdir. İstifadəçinin ekranda gördüyü bütün effektlər — rəng, kölgələr, əks etdirmələr, şəffaflıq — məhz qrafik konveyerinin bu mərhələsində hesablanır.

Teksturlama

Ən çox yayılmış əməliyyat — interpolyasiya olunmuş UV koordinatları üzrə teksturdan rəng seçmək. Sampler2D və texture() funksiyası tekstur atlasından piksel rəngini əldə etməyə imkan verir. Filtrasiya (bilinear, trilinear, anizotrop) sampler parametrləri ilə idarə olunur və müxtəlif baxış bucaqlarında təsvirin aydınlığına təsir edir.

Phong işıqlandırması

Phong işıqlandırma modeli (Phong shading) Fragment Shader-də hər piksel üçün hesablanır ki, bu da təpə işıqlandırmasından (Gouraud shading) daha hamar parıltılar verir. Phong lighting üç komponentdən ibarətdir: ambient (fon), diffuse (yayılmış) və specular (güzgü əks etdirmə).

glsl
// Phong işıqlandırması ilə frament şeyderi
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);
}

Post-effektlər və blending

Fragment Shader post-emal tətbiq etməyə imkan verir: LUT cədvəlləri ilə rəng korreksiyası, bulanıqlıq (blur), parıltı effekti (bloom) və HDR renderləmə üçün tonemapping. Bütün bu effektlər piksel səviyyəsində işləyir və real vaxtda icra olunur.

Fragment Shader performansı və optimallaşdırma

Fragment Shader performansı — müasir mobil oyunlarda FPS-i məhdudlaşdıran əsas amildir. Şeyder hər piksel üçün çağırıldığından, kod mürəkkəbliyindəki hətta kiçik artım kadr tezliyində nəzərəçarpacaq azalmaya səbəb ola bilər.

Əsas performans problemləri

  • Overdraw — obyektlərin üst-üstə düşməsi səbəbindən eyni pikselin təkrar çəkilməsi. Xüsusilə yarımşəffaf obyektlər üçün kritikdir.
  • Şərti keçidlər — Fragment Shader-də budaqlanmalar SIMD icrasının səmərəliliyini azaldır, çünki GPU hər iki budağı icra etməli olur.
  • Tekstur seçmələri — hər tekstur seçməsi (texture lookup) onlarla GPU dövrü gecikməyə malikdir. Samplerlərin sayını minimuma endirmək şeyderi sürətləndirir.

Fragment Shader optimallaşdırma metodları

Mobil GPU-lar (Qualcomm Adreno, ARM Mali) üçün tövsiyə olunur: float dəyişənlər üçün mediump precision istifadə etmək, tekstur seçmələrini birləşdirmək, şeyderi icra etməzdən əvvəl görünməz framentləri atmaq üçün early-z testləri tətbiq etmək.

MetodTəsvirQazanc
Mediump precision32-bit əvəzinə 16-bit dəqiqlik2x sürətə qədər
Early-ZŞeyderdən əvvəl dərinlik testiÇağırışların azaldılması
Texture atlasingBir neçə əvəzinə bir teksturDaha az keçid

Fragment Shader vs Vertex Shader: müqayisə

Hər iki şeyder növü proqramçı tərəfindən proqramlaşdırılır, lakin konveyerin müxtəlif mərhələlərində işləyir və müxtəlif vəzifələri həll edir. Fragment Shader çağırışların sayına görə əhəmiyyətli dərəcədə daha çox resurs tutumludur.

ParametrFragment ShaderVertex Shader
Çağırış sayıMilyonlarla (ekran təsvir ölçüsü)Minlərlə (təpə nöqtələrinin sayı)
Giriş məlumatlarıİnterpolyasiya olunmuş atributlarTəpə atributları
Əsas funksiyaFrament rənginin hesablanmasıHəndəsənin transformasiyası
Teksturlara girişTam (çoxlu sampler)Məhdud
Performansa təsirYüksək (təsvir ölçüsündən asılıdır)Orta (həndəsədən asılıdır)

Fragment Shader kod nümunələri

Fragment Shader sadə (teksturdan seçmə) və ya mürəkkəb (çoxqatlı işıqlandırma) ola bilər. İki praktik nümunəyə baxaq: əsas teksturlama və vaxtdan istifadə edərək gradient effekti.

GLSL-də əsas teksturlama

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

Metal Shading Language nümunəsi

cpp
#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 verilən suallar

Fragment Shader sadə sözlərlə nədir?

Fragment Shader — GPU-da kiçik bir proqramdır, ekrandakı hər pikselin hansı rəngdə olacağını müəyyənləşdirir. Vertex Shader obyektin formasını təyin edirsə, Fragment Shader həmin obyektin necə göründüyünü — tekstur, işıqlandırma, rəng — təyin edir.

Niyə Fragment Shader bu qədər resurs tutumludur?

Fragment Shader ekrandakı hər piksel üçün çağırılır. 2532x1170 təsvir ölçüsü olan cihazda (iPhone) bu, kadr başına təxminən 3 milyon çağırış deməkdir. 60 FPS-də şeyder saniyədə 180 milyon dəfə icra olunur ki, bu da böyük hesablama gücü tələb edir.

Fragment Shader-də hansı effektlər etmək olar?

Fragment Shader-də həyata keçirilir: teksturlama, işıqlandırma (Phong, PBR), kölgələr, əks etdirmələr, sınmalar, bloom, kəskinlik dərinliyi, rəng korreksiyası, LUT filtrləri və prosedural tekstur generasiyası.

Mobil cihazlarda Fragment Shader-i necə optimallaşdırmaq olar?

Float üçün mediump precision istifadə edin, tekstur seçmələrinin sayını azaldın, early-z atma tətbiq edin, şeyder əməliyyatlarını birləşdirin və şeyder daxilində şərti keçidlərdən qaçının.

Fragment Shader Pixel Shader-dən nə ilə fərqlənir?

Bu eyni şeydir. Fragment Shader termini OpenGL / Vulkan-da, Pixel Shader isə Direct3D (Microsoft) terminologiyasında istifadə olunur. Funksional olaraq eynidir: hər ikisi hər framentin/pikselin rəngini hesablayır.

Nəticə

  • Fragment Shader — GPU-nun proqramlaşdırıla bilən mərhələsi, təsvirin hər pikselinin rəngini hesablayır.
  • Çağırış sayı ekranın təsvir ölçüsünə bərabərdir, bu da onu renderləmənin ən resurs tutumlu mərhələsi edir.
  • Teksturlama, Phong işıqlandırması və post-effektlər — frament şeyderinin əsas vəzifələri.
  • Performans birbaşa tekstur seçmələrinin sayından və highp precision istifadəsindən asılıdır.
  • Mediump precision və early-z testləri — mobil GPU-lar üçün əsas optimallaşdırma üsulları.
  • OpenGL ES Fragment Shader terminindən, Direct3D — Pixel Shader-dən istifadə edir, mahiyyət eynidir.
  • GLSL və Metal Shading Language — mobil inkişafda Fragment Shader yazmaq üçün əsas dillər.

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