Vertex Shader: шта је то, задаци и принцип рада

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

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

Главне тачке

  • Vertex Shader — програмабилна фаза GPU-а која обрађује сваки врх 3D модела независно од других.
  • Трансформација координата из објектног простора у екрански — основни задатак вертекс шейдера.
  • OpenGL ES 3.0 и Metal Shading Language пружају стандардизоване API-је за писање вертекс шейдера.
  • Перформансе Vertex Shader-а зависе од броја врхова и сложености шейдер кода.
  • Скининг и морфинг врхова — типични задаци који се реализују у вертекс шейдеру на GPU-у.

Шта је Vertex Shader?

Vertex Shader је програмабилна фаза графичког цевовода (graphics pipeline) која обрађује сваки врх тродимензионалног модела појединачно. Врх (vertex) је тачка у тродимензионалном простору која садржи атрибуте: xyz координате, нормале, боју и UV текстурне координате.

За разлику од фиксног цевовода (fixed-function pipeline), где су се трансформације извршавале по чврсто задатом алгоритму, Vertex Shader даје програмеру потпуну контролу над трансформацијом врхова. То омогућава имплементацију процедуралне анимације, деформацију модела, скелетни скининг и било која математичка претварања на страни GPU-а.

Место Vertex Shader-а у графичком цевоводу

Графички цевовод OpenGL ES-а укључује секвенцу фаза од улазних података до финалне слике. Vertex Shader се налази после фазе састављања врхова (vertex assembly) и пре фазе растеризације. Сваки врх послат из CPU-а кроз бафер врхова пролази кроз Vertex Shader тачно једном, а резултат се преноси у следећу фазу за састављање примитива.

Фаза цевоводаНамена
Vertex SpecificationПренос података врхова и атрибута из VBO
Vertex ShaderОбрада сваког врха, трансформација координата
TessellationОпциона подела геометрије на подпримитиве
Geometry ShaderОпционо генерисање или уклањање примитива
RasterizationПретварање примитива у фрагменте за попуњавање

Како ради Vertex Shader?

Vertex Shader прима на улазу атрибуте врха из бафера врхова (VBO) преко показивача атрибута (vertex attribute pointers) подешених у CPU коду. Програмер пише шейдер код у GLSL (OpenGL Shading Language) или сличном језику, који компајлира GPU драјвер у машинске инструкције за одређени чип.

Процес обраде врха

За сваки врх Vertex Shader секвенцијално извршава три операције: читање улазних атрибута — примену трансформација дефинисаних од стране програмера — упис резултата у излазне променљиве. Минимални обавезни излаз је позиција врха у простору одсецања (gl_Position). Сви остали излазни подаци (боја, нормале, текстурне координате) се интерполирају и прослеђују следећој фази — Fragment Shader-у.

glsl
#version 300 es
in vec3 aPosition;
in vec2 aTexCoord;
uniform mat4 uMVP;
out vec2 vTexCoord;

void main() {
    gl_Position = uMVP * vec4(aPosition, 1.0);
    vTexCoord = aTexCoord;
}

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

Vertex Shader решава широк спектар задатака графичког цевовода везаних за трансформацију геометрије. Сваки задатак се реализује кроз математичке операције над векторима и матрицама, које се извршавају паралелно за хиљаде врхова истовремено.

Трансформација координата кроз MVP

Основни и најчешћи задатак је множење координата врхова са матрицама model, view и projection (MVP). MVP матрица трансформише врх из локалног простора модела у простор одсецања (clip space), који се затим нормализује и претвара у екранске координате у аутоматским фазама цевовода.

Скелетна анимација (Skinning)

За анимиране ликове Vertex Shader имплементира скелетну анимацију (skinning). Сваки врх је везан за неколико костију са одређеним тежинама. Vertex blending — пондерисани збир трансформација од везаних костију — омогућава глатку деформацију коже лика при покрету скелета.

Процедурална деформација геометрије

Vertex Shader може модификовати геометрију на основу времена или других uniform параметара без учешћа CPU-а. Wave deformation, шумна померања по Перлиновом шуму и ефекти таласа на води — сви ови ефекти се реализују у вертекс шейдеру без поновног учитавања геометрије из RAM меморије.

Vertex Shader vs Fragment Shader: разлике

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

КарактеристикаVertex ShaderFragment Shader
Улазни подациАтрибути врхова из VBOИнтерполирани подаци из VS
Број позиваБрој врховаБрој фрагмената
Основни задатакТрансформација геометријеИзрачунавање боје пиксела
Рачунско оптерећењеСложеност геометријеРезолуција екрана
Приступ текстурамаОграничен (кроз texture lookup)Пун приступ

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

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

Перформансе Vertex Shader-а су критичне за апликације у реалном времену, посебно у мобилном развоју са ограниченом потрошњом енергије. Главни фактори перформанси су број врхова, сложеност шейдер кода и пропусни опсег меморије GPU-а.

Фактори који утичу на перформансе

  • Vertex count — број врхова послатих на GPU по кадру. Модели са милионима полигона стварају високо оптерећење на вертекс шейдер.
  • Shader complexity — број инструкција у шейдеру. Угнежђене петље и условни скокови (divergence) смањују паралелне перформансе SIMD блокова.
  • Bandwidth — брзина читања података врхова из видео меморије. Формат атрибута (float32, float16, нормализовани цео број) директно утиче на пропусни опсег.

Методе оптимизације вертекс шейдера

За смањење оптерећења Vertex Shader-а примењују се следећи приступи. Level of Detail (LOD) — прелазак на упрошћене верзије модела при удаљавању камере од објекта. Instancing — вишеструко цртање исте геометрије са различитим трансформационим матрицама у једном позиву за цртање (draw call).

glsl
// Vertex Shader са подршком за инстанцирање
in vec3 aPosition;
in mat4 aInstanceMatrix;
uniform mat4 uViewProjection;

void main() {
    vec4 worldPos = aInstanceMatrix * vec4(aPosition, 1.0);
    gl_Position = uViewProjection * worldPos;
}

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

Vertex Shader на различитим графичким API-јима има сличну логику, али различиту синтаксу и конвенције именовања. Размотримо имплементацију основног вертекс шейдера у GLSL за OpenGL ES 3.0 и у Metal Shading Language за iOS и macOS.

Пример у GLSL за OpenGL ES 3.0

glsl
#version 300 es
in vec4 position;
in vec3 normal;
in vec2 texcoord;

uniform mat4 modelViewMatrix;
uniform mat4 projectionMatrix;
uniform mat3 normalMatrix;

out vec3 vNormal;
out vec2 vTexCoord;
out vec3 vPosition;

void main() {
    vec4 mvPosition = modelViewMatrix * position;
    vPosition = mvPosition.xyz;
    vNormal = normalMatrix * normal;
    vTexCoord = texcoord;
    gl_Position = projectionMatrix * mvPosition;
}

Пример у Metal Shading Language

cpp
#include <metal_stdlib>
using namespace metal;

struct VertexIn {
    float3 position [[attribute(0)]];
    float3 normal   [[attribute(1)]];
};

struct VertexOut {
    float4 position [[position]];
    float3 worldNormal;
};

vertex VertexOut
vertexMain(VertexIn in [[stage_in]],
           constant float4x4& mvp [[buffer(1)]]) {
    VertexOut out;
    out.position = mvp * float4(in.position, 1.0);
    out.worldNormal = in.normal;
    return out;
}

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

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

Vertex Shader је програм на GPU-у који обрађује сваки врх 3D модела и претвара његове координате у екранске координате. Замислите модел као мрежу тачака; вертекс шейдер помера ове тачке према задатим математичким правилима.

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

Vertex Shader обрађује врхове и одговоран је за геометрију, док Fragment Shader одређује боју сваког пиксела. Први се позива за сваки врх (хиљаде), други за сваки пиксел (милиони).

На којим језицима се пише Vertex Shader?

Vertex Shader се пише на језику који одговара графичком API-ју: GLSL за OpenGL ES, Metal Shading Language за Metal API на iOS/macOS, HLSL за Direct3D. Концептуално сви они извршавају исте операције над врховима.

Како Vertex Shader утиче на перформансе?

Сложеност вертекс шейдера директно утиче на FPS: више инструкција по врху = дужа обрада. Оптимизација укључује смањење броја врхова кроз LOD, коришћење инстансинга и минимизацију условних скокова у коду шейдера.

Које задатке решава Vertex Shader у играма?

Основни задаци у играма: трансформација координата кроз MVP матрице, скининг анимираних ликова, процедурална деформација одеће и косе, морфинг између израза лица и ефекти честица са анимацијом на GPU-у.

Резиме

  • Vertex Shader — програмабилна фаза графичког цевовода, обрађује сваки врх 3D модела независно.
  • Основни задатак — трансформација координата врхова из локалног простора у екрански кроз MVP матрице.
  • Vertex Shader се извршава паралелно на више језгри GPU-а, обезбеђујући високе перформансе при милионима врхова.
  • Скининг, морфинг и процедурална анимација се реализују у вертекс шейдеру без учешћа CPU-а.
  • Број позива Vertex Shader-а је једнак броју врхова — значајно мање од позива Fragment Shader-а.
  • Оптимизација укључује LOD моделе, инстансинг и минимизацију гранања у шейдер коду.
  • GLSL и Metal Shading Language — главни језици за вертекс шейдере у мобилном развоју.

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

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

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

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