Fragment Shader — шта је то, задаци и принцип рада

Аутор: IT Sectr Објављено: 2026-06-11 Време читања: 10 мин

Fragment Shader — је програмабилна фаза графичког конвејера која одређује коначну боју сваког фрагмента (пиксела) слике. Према подацима Khronos Group, 2025, фрагментни шейдер добија интерполиране податке од Vertex Shader-а и обавља прорачуне осветљења, текстурисања и ефеката боја. Fragment Shader се позива за сваки пиксел, што га чини најзахтевнијом фазом графичког конвејера.

Главно

  • Fragment Shader — програмабилна фаза GPU-а која одређује боју сваког пиксела на екрану.
  • Број позива је једнак резолуцији екрана, што га чини главним рачунским оптерећењем рендеровања.
  • Текстурисање и осветљење по Фонгу — типични задаци реализовани у фрагментном шейдеру.
  • GLSL и Metal Shading Language пружају стандардна средства за писање Fragment Shader-а.
  • Перформансе Fragment Shader-а су критичне за постизање 60 FPS у мобилним апликацијама.

Шта је Fragment Shader?

Fragment Shader (фрагментни или пикселски шейдер) — је програмабилна фаза графичког конвејера која израчунава коначну боју сваког фрагмента слике. Фрагмент је потенцијални пиксел који, након проласка тестова дубине и шаблона, постаје видљиви пиксел на екрану.

Fragment Shader се извршава након растерзације, када су тродимензионални примитиви (троуглови) већ претворени у скуп фрагмената. На улазу шейдер добија интерполиране атрибуте — текстурне координате, нормале, боје, које су израчунате у Vertex Shader-у за темена троугла и линеарно интерполиране за сваки пиксел унутар њега.

Историја еволуције Fragment Shader-а

Пре појаве програмабилних шейдера (пре DirectX 8 / OpenGL 2.0) израчунавање боје пиксела обављао је фиксни конвејер са ограниченим скупом операција. Програмабилни Fragment Shader се појавио 2001. године и радикално је проширио могућности графике: програмери су добили потпуну контролу над бојом сваког пиксела, што је омогућило реализацију фотореалистичног осветљења, сложених материјала и пост-ефеката.

Како ради Fragment Shader?

Fragment Shader покреће GPU за сваки фрагмент генерисан растерзатором. Сваки позив шейдера обрађује један фрагмент, чита његове улазне податке, извршава кориснички код и уписује излазну вредност — боју фрагмента у RGBA формату.

Улазни и излазни подаци

Улазни подаци Fragment Shader-а укључују интерполиране атрибуте од Vertex Shader-а (текстурне координате, нормале, боје), uniform променљиве (извори светлости, матрице) и текстурне семплере. Излазни подаци — вектор боје (gl_FragColor у OpenGL ES 2.0 или корисничка променљива у ES 3.0) који се уписује у бафер боје.

glsl
#version 300 es
precision mediump float;

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

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

Основни задаци Fragment Shader-а

Fragment Shader је одговоран за визуелни квалитет слике. Сви ефекти које корисник види на екрану — боја, сенке, рефлексије, провидност — израчунавају се управо у овој фази графичког конвејера.

Текстурисање

Најчешћа операција — узимање боје из текстуре по интерполираним UV координатама. Sampler2D и функција texture() омогућавају добијање боје пиксела из текстурног атласа. Филтрација (билинеарна, трилинеарна, анизотропна) контролише се кроз параметре семплера и утиче на оштрину слике при различитим угловима гледања.

Осветљење по Фонгу

Модел осветљења Фонга (Phong shading) израчунава се у Fragment Shader-у за сваки пиксел, што даје глаткије одсјаје од вертексног осветљења (Gouraud shading). Phong lighting укључује три компоненте: ambient (позадинско), diffuse (дифузно) и specular (спекуларно).

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

Пост-ефекти и blending

Fragment Shader омогућава наношење пост-обраде: корекцију боја кроз LUT табеле, замућење (blur), ефекат сјаја (bloom) и tonemapping за HDR рендеровање. Сви ови ефекти раде на нивоу пиксела и извршавају се у реалном времену.

Перформансе Fragment Shader-а и оптимизација

Перформансе Fragment Shader-а — главни фактор који ограничава FPS у модерним мобилним игрицама. Пошто се шейдер позива за сваки пиксел, чак и мало повећање сложености кода може довести до приметног пада броја кадрова.

Главни проблеми перформанси

  • Overdraw — поновно цртање истог пиксела због преклапања објеката. Посебно критичан за полупровидне објекте.
  • Условни прелази — гранање у Fragment Shader-у смањује ефикасност SIMD извршења, јер GPU мора да изврши обе гране.
  • Узимање из текстура — свако узимање текстуре (texture lookup) има кашњење од десетина циклуса GPU-а. Минимизација броја семплера убрзава шейдер.

Методе оптимизације Fragment Shader-а

За мобилне GPU (Qualcomm Adreno, ARM Mali) препоручује се: коришћење mediump precision за float променљиве, комбиновање узимања текстура, примена early-z тестова за одбацивање невидљивих фрагмената пре извршења шейдера.

МетодОписДобит
Mediump precision16-битна прецизност уместо 32-битнеДо 2x брзине
Early-ZТест дубине пре шейдераСмањење позива
Texture atlasingЈедна текстура уместо неколикоМање прекида

Fragment Shader vs Vertex Shader: поређење

Оба типа шейдера програмира програмер, али раде у различитим фазама конвејера и решавају различите задатке. Fragment Shader је значајно захтевнији због броја позива.

ПараметарFragment ShaderVertex Shader
Број позиваМилиони (резолуција екрана)Хиљаде (број темена)
Улазни подациИнтерполирани атрибутиАтрибути темена
Главна функцијаИзрачунавање боје фрагментаТрансформација геометрије
Приступ текстурамаПотпун (више семплера)Ограничен
Утицај на перформансеВисок (зависи од резолуције)Умерен (зависи од геометрије)

Примери кода Fragment Shader-а

Fragment Shader може бити једноставан (узимање из текстуре) или сложен (вишеслојно осветљење). Размотримо два практична примера: основно текстурисање и ефекат градијента коришћењем времена.

Основно текстурисање у GLSL-у

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-у

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

Често постављана питања

Шта је Fragment Shader једноставним речима?

Fragment Shader — је мини-програм на GPU-у који одређује које боје ће бити сваки пиксел на екрану. Ако Vertex Shader одређује облик објекта, онда Fragment Shader одређује како тај објекат изгледа — текстура, осветљење, боја.

Зашто је Fragment Shader толико захтеван?

Fragment Shader се позива за сваки пиксел на екрану. На уређају са резолуцијом 2532x1170 (iPhone) то је скоро 3 милиона позива по кадру. При 60 FPS, шейдер се извршава 180 милиона пута у секунди, што захтева огромну рачунарску снагу.

Који ефекти се могу направити у Fragment Shader-у?

У Fragment Shader-у се реализују: текстурисање, осветљење (Phong, PBR), сенке, рефлексије, преламања, bloom, дубина оштрине, корекција боја, LUT филтери и процедурална генерација текстура.

Како оптимизовати Fragment Shader на мобилним уређајима?

Користите mediump precision за float, смањите број узимања текстура, примењујте early-z одбацивање, комбинујте шейдер операције и избегавајте условне прелазе унутар шейдера.

По чему се Fragment Shader разликује од Pixel Shader-а?

То је исто. Термин Fragment Shader се користи у OpenGL / Vulkan, а Pixel Shader — у терминологији Direct3D (Microsoft). Функционално су идентични: оба израчунавају боју сваког фрагмента/пиксела.

Резиме

  • Fragment Shader — програмабилна фаза GPU-а која израчунава боју сваког пиксела слике.
  • Број позива је једнак резолуцији екрана, што га чини најзахтевнијом фазом рендеровања.
  • Текстурисање, осветљење по Фонгу и пост-ефекти — главни задаци фрагментног шейдера.
  • Перформансе директно зависе од броја узимања текстура и коришћења highp прецизности.
  • Mediump precision и early-z тестови — кључне технике оптимизације за мобилне GPU.
  • OpenGL ES користи термин Fragment Shader, Direct3D — Pixel Shader, суштина је иста.
  • GLSL и Metal Shading Language — главни језици за писање Fragment Shader-а у мобилном развоју.

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође