Fragment Shader — bu nima, vazifalari va ishlash prinsipi

Muallif: IT Sectr Nashr etilgan: 2026-06-11 O'qish vaqti: 10 daq

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 — GPUning dasturlashtiriladigan bosqichi, ekrandagi har bir piksel rangini aniqlaydi.
  • Chaqiruvlar soni ekran o'lchamiga teng, bu uni renderlashning asosiy hisoblash yukiga aylantiradi.
  • Teksturlash va Phong yoritishi — fragment shaderida amalga oshiriladigan odatiy vazifalar.
  • GLSL va Metal Shading Language Fragment Shader yozish uchun standart vositalarni taqdim etadi.
  • Fragment Shader ishlashi mobil ilovalarda 60 FPS ga erishish uchun juda muhimdir.

Fragment Shader nima?

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.

Fragment Shader evolyutsiyasi tarixi

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 qanday ishlaydi?

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.

Kirish va chiqish ma'lumotlari

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.

glsl
#version 300 es
precision mediump float;

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

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

Fragment Shaderning asosiy vazifalari

Fragment Shader tasvirning vizual sifati uchun javobgardir. Foydalanuvchi ekranda ko'rgan barcha effektlar — rang, soyalar, aks ettirishlar, shaffoflik — aynan grafik konveyerining ushbu bosqichida hisoblanadi.

Teksturlash

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 yoritishi

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).

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

Post-effektlar va blending

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 va optimallashtirish

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.

Asosiy ishlash muammolari

  • Overdraw — ob'ektlarning bir-birini yopishi tufayli bir pikselning qayta chizilishi. Yarim shaffof ob'ektlar uchun ayniqsa muhim.
  • Shartli o'tishlar — Fragment Shader-da tarmoqlanish SIMD bajarilishi samaradorligini pasaytiradi, chunki GPU ikkala tarmoqni ham bajarishi kerak.
  • Teksturdan tanlash — har bir tekstur tanlash (texture lookup) o'nlab GPU siklida kechikishga ega. Samplerlar sonini minimallashtirish shaderni tezlashtiradi.

Fragment Shaderni optimallashtirish usullari

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.

UsulTavsifFoyda
Mediump precision32-bitli o'rniga 16-bitli aniqlik2x tezlikkacha
Early-ZShaderdan oldin chuqurlik testiChaqiruvlarni kamaytirish
Texture atlasingBir nechta o'rniga bitta teksturKamroq o'tish

Fragment Shader vs Vertex Shader: taqqoslash

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.

ParametrFragment ShaderVertex Shader
Chaqiruvlar soniMillionlab (ekran o'lchami)Minglab (uchlar soni)
Kirish ma'lumotlariInterpolyatsiya qilingan atributlarUch atributlari
Asosiy funksiyaFragment rangini hisoblashGeometriyani transformatsiya qilish
Teksturlarga kirishTo'liq (ko'p sampler)Cheklangan
Ishlashga ta'siriYuqori (o'lchamga bog'liq)O'rtacha (geometriyaga bog'liq)

Fragment Shader kod misollari

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.

GLSLda asosiy teksturlash

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 misoli

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 beriladigan savollar

Fragment Shader oddiy so'zlar bilan nima?

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.

Nega Fragment Shader shunchalik resurs talab qiladi?

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 qanday effektlarni yaratish mumkin?

Fragment Shaderda amalga oshiriladi: teksturlash, yoritish (Phong, PBR), soyalar, aks ettirishlar, sinishlar, bloom, aniqlik chuqurligi, rang tuzatish, LUT filtrlari va protsedural tekstur generatsiyasi.

Mobil qurilmalarda Fragment Shaderni qanday optimallashtirish mumkin?

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.

Fragment Shader Pixel Shaderdan qanday farq qiladi?

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

  • Fragment Shader — GPUning dasturlashtiriladigan bosqichi, tasvirning har bir piksel rangini hisoblaydi.
  • Chaqiruvlar soni ekran o'lchamiga teng, bu uni renderlashning eng resurs talab qiluvchi bosqichiga aylantiradi.
  • Teksturlash, Phong yoritishi va post-effektlar — fragment shaderining asosiy vazifalari.
  • Ishlash bevosita tekstur tanlashlar soni va highp precision dan foydalanishga bog'liq.
  • Mediump precision va early-z testlari — mobil GPUlar uchun asosiy optimallashtirish usullari.
  • OpenGL ES Fragment Shader atamasini, Direct3D — Pixel Shader atamasini ishlatadi, mohiyati bir xil.
  • GLSL va Metal Shading Language — mobil ishlab chiqishda Fragment Shader yozish uchun asosiy tillar.

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.

Loyihani muhokama qilish

Shuningdek o'qing