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 (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.
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 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.
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.
#version 300 es
precision mediump float;
in vec2 vTexCoord;
uniform sampler2D uTexture;
out vec4 fragColor;
void main() {
fragColor = texture(uTexture, vTexCoord);
}
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.
Ə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ı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ə).
// 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);
}
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ı — 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.
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.
| Metod | Təsvir | Qazanc |
|---|---|---|
| Mediump precision | 32-bit əvəzinə 16-bit dəqiqlik | 2x sürətə qədər |
| Early-Z | Şeyderdən əvvəl dərinlik testi | Çağırışların azaldılması |
| Texture atlasing | Bir neçə əvəzinə bir tekstur | Daha az keçid |
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.
| Parametr | Fragment Shader | Vertex Shader |
|---|---|---|
| Çağırış sayı | Milyonlarla (ekran təsvir ölçüsü) | Minlərlə (təpə nöqtələrinin sayı) |
| Giriş məlumatları | İnterpolyasiya olunmuş atributlar | Təpə atributları |
| Əsas funksiya | Frament rənginin hesablanması | Həndəsənin transformasiyası |
| Teksturlara giriş | Tam (çoxlu sampler) | Məhdud |
| Performansa təsir | Yüksək (təsvir ölçüsündən asılıdır) | Orta (həndəsədən asılıdır) |
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.
#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 verilən suallar
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.
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ə 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ı.
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.
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ə
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.
Həm də oxuyun