Fragment Shader — је програмабилна фаза графичког конвејера која одређује коначну боју сваког фрагмента (пиксела) слике. Према подацима Khronos Group, 2025, фрагментни шейдер добија интерполиране податке од Vertex Shader-а и обавља прорачуне осветљења, текстурисања и ефеката боја. Fragment Shader се позива за сваки пиксел, што га чини најзахтевнијом фазом графичког конвејера.
Главно
Fragment Shader (фрагментни или пикселски шейдер) — је програмабилна фаза графичког конвејера која израчунава коначну боју сваког фрагмента слике. Фрагмент је потенцијални пиксел који, након проласка тестова дубине и шаблона, постаје видљиви пиксел на екрану.
Fragment Shader се извршава након растерзације, када су тродимензионални примитиви (троуглови) већ претворени у скуп фрагмената. На улазу шейдер добија интерполиране атрибуте — текстурне координате, нормале, боје, које су израчунате у Vertex Shader-у за темена троугла и линеарно интерполиране за сваки пиксел унутар њега.
Пре појаве програмабилних шейдера (пре DirectX 8 / OpenGL 2.0) израчунавање боје пиксела обављао је фиксни конвејер са ограниченим скупом операција. Програмабилни Fragment Shader се појавио 2001. године и радикално је проширио могућности графике: програмери су добили потпуну контролу над бојом сваког пиксела, што је омогућило реализацију фотореалистичног осветљења, сложених материјала и пост-ефеката.
Fragment Shader покреће GPU за сваки фрагмент генерисан растерзатором. Сваки позив шейдера обрађује један фрагмент, чита његове улазне податке, извршава кориснички код и уписује излазну вредност — боју фрагмента у RGBA формату.
Улазни подаци Fragment Shader-а укључују интерполиране атрибуте од Vertex Shader-а (текстурне координате, нормале, боје), uniform променљиве (извори светлости, матрице) и текстурне семплере. Излазни подаци — вектор боје (gl_FragColor у OpenGL ES 2.0 или корисничка променљива у ES 3.0) који се уписује у бафер боје.
#version 300 es
precision mediump float;
in vec2 vTexCoord;
uniform sampler2D uTexture;
out vec4 fragColor;
void main() {
fragColor = texture(uTexture, vTexCoord);
}
Fragment Shader је одговоран за визуелни квалитет слике. Сви ефекти које корисник види на екрану — боја, сенке, рефлексије, провидност — израчунавају се управо у овој фази графичког конвејера.
Најчешћа операција — узимање боје из текстуре по интерполираним UV координатама. Sampler2D и функција texture() омогућавају добијање боје пиксела из текстурног атласа. Филтрација (билинеарна, трилинеарна, анизотропна) контролише се кроз параметре семплера и утиче на оштрину слике при различитим угловима гледања.
Модел осветљења Фонга (Phong shading) израчунава се у Fragment Shader-у за сваки пиксел, што даје глаткије одсјаје од вертексног осветљења (Gouraud shading). Phong lighting укључује три компоненте: ambient (позадинско), diffuse (дифузно) и specular (спекуларно).
// Fragment shader sa Phong osvetljenjem
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 омогућава наношење пост-обраде: корекцију боја кроз LUT табеле, замућење (blur), ефекат сјаја (bloom) и tonemapping за HDR рендеровање. Сви ови ефекти раде на нивоу пиксела и извршавају се у реалном времену.
Перформансе Fragment Shader-а — главни фактор који ограничава FPS у модерним мобилним игрицама. Пошто се шейдер позива за сваки пиксел, чак и мало повећање сложености кода може довести до приметног пада броја кадрова.
За мобилне GPU (Qualcomm Adreno, ARM Mali) препоручује се: коришћење mediump precision за float променљиве, комбиновање узимања текстура, примена early-z тестова за одбацивање невидљивих фрагмената пре извршења шейдера.
| Метод | Опис | Добит |
|---|---|---|
| Mediump precision | 16-битна прецизност уместо 32-битне | До 2x брзине |
| Early-Z | Тест дубине пре шейдера | Смањење позива |
| Texture atlasing | Једна текстура уместо неколико | Мање прекида |
Оба типа шейдера програмира програмер, али раде у различитим фазама конвејера и решавају различите задатке. Fragment Shader је значајно захтевнији због броја позива.
| Параметар | Fragment Shader | Vertex Shader |
|---|---|---|
| Број позива | Милиони (резолуција екрана) | Хиљаде (број темена) |
| Улазни подаци | Интерполирани атрибути | Атрибути темена |
| Главна функција | Израчунавање боје фрагмента | Трансформација геометрије |
| Приступ текстурама | Потпун (више семплера) | Ограничен |
| Утицај на перформансе | Висок (зависи од резолуције) | Умерен (зависи од геометрије) |
Fragment Shader може бити једноставан (узимање из текстуре) или сложен (вишеслојно осветљење). Размотримо два практична примера: основно текстурисање и ефекат градијента коришћењем времена.
#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;
}
Често постављана питања
Fragment Shader — је мини-програм на GPU-у који одређује које боје ће бити сваки пиксел на екрану. Ако Vertex Shader одређује облик објекта, онда Fragment Shader одређује како тај објекат изгледа — текстура, осветљење, боја.
Fragment Shader се позива за сваки пиксел на екрану. На уређају са резолуцијом 2532x1170 (iPhone) то је скоро 3 милиона позива по кадру. При 60 FPS, шейдер се извршава 180 милиона пута у секунди, што захтева огромну рачунарску снагу.
У Fragment Shader-у се реализују: текстурисање, осветљење (Phong, PBR), сенке, рефлексије, преламања, bloom, дубина оштрине, корекција боја, LUT филтери и процедурална генерација текстура.
Користите mediump precision за float, смањите број узимања текстура, примењујте early-z одбацивање, комбинујте шейдер операције и избегавајте условне прелазе унутар шейдера.
То је исто. Термин Fragment Shader се користи у OpenGL / Vulkan, а Pixel Shader — у терминологији Direct3D (Microsoft). Функционално су идентични: оба израчунавају боју сваког фрагмента/пиксела.
Резиме
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође