Vertex Shader је програмабилна фаза графичког цевовода (graphics pipeline) која обрађује сваки врх тродимензионалног модела. Према подацима Khronos Group, 2025, вертекс шейдер прима на улазу атрибуте врхова — координате, нормале, боју и текстурне координате — и трансформише их према задатој логици. Vertex Shader се извршава за сваки врх независно, што омогућава ефикасно паралелизовање прорачуна на хиљадама језгри GPU-а.
Главне тачке
Vertex Shader је програмабилна фаза графичког цевовода (graphics pipeline) која обрађује сваки врх тродимензионалног модела појединачно. Врх (vertex) је тачка у тродимензионалном простору која садржи атрибуте: xyz координате, нормале, боју и UV текстурне координате.
За разлику од фиксног цевовода (fixed-function pipeline), где су се трансформације извршавале по чврсто задатом алгоритму, Vertex Shader даје програмеру потпуну контролу над трансформацијом врхова. То омогућава имплементацију процедуралне анимације, деформацију модела, скелетни скининг и било која математичка претварања на страни GPU-а.
Графички цевовод OpenGL ES-а укључује секвенцу фаза од улазних података до финалне слике. Vertex Shader се налази после фазе састављања врхова (vertex assembly) и пре фазе растеризације. Сваки врх послат из CPU-а кроз бафер врхова пролази кроз Vertex Shader тачно једном, а резултат се преноси у следећу фазу за састављање примитива.
| Фаза цевовода | Намена |
|---|---|
| Vertex Specification | Пренос података врхова и атрибута из VBO |
| Vertex Shader | Обрада сваког врха, трансформација координата |
| Tessellation | Опциона подела геометрије на подпримитиве |
| Geometry Shader | Опционо генерисање или уклањање примитива |
| Rasterization | Претварање примитива у фрагменте за попуњавање |
Vertex Shader прима на улазу атрибуте врха из бафера врхова (VBO) преко показивача атрибута (vertex attribute pointers) подешених у CPU коду. Програмер пише шейдер код у GLSL (OpenGL Shading Language) или сличном језику, који компајлира GPU драјвер у машинске инструкције за одређени чип.
За сваки врх Vertex Shader секвенцијално извршава три операције: читање улазних атрибута — примену трансформација дефинисаних од стране програмера — упис резултата у излазне променљиве. Минимални обавезни излаз је позиција врха у простору одсецања (gl_Position). Сви остали излазни подаци (боја, нормале, текстурне координате) се интерполирају и прослеђују следећој фази — Fragment Shader-у.
#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 решава широк спектар задатака графичког цевовода везаних за трансформацију геометрије. Сваки задатак се реализује кроз математичке операције над векторима и матрицама, које се извршавају паралелно за хиљаде врхова истовремено.
Основни и најчешћи задатак је множење координата врхова са матрицама model, view и projection (MVP). MVP матрица трансформише врх из локалног простора модела у простор одсецања (clip space), који се затим нормализује и претвара у екранске координате у аутоматским фазама цевовода.
За анимиране ликове Vertex Shader имплементира скелетну анимацију (skinning). Сваки врх је везан за неколико костију са одређеним тежинама. Vertex blending — пондерисани збир трансформација од везаних костију — омогућава глатку деформацију коже лика при покрету скелета.
Vertex Shader може модификовати геометрију на основу времена или других uniform параметара без учешћа CPU-а. Wave deformation, шумна померања по Перлиновом шуму и ефекти таласа на води — сви ови ефекти се реализују у вертекс шейдеру без поновног учитавања геометрије из RAM меморије.
Иако су оба типа шейдера програмабилне фазе графичког цевовода, Vertex Shader и Fragment Shader решавају принципијелно различите задатке и раде на различитим стадијумима обраде слике.
| Карактеристика | Vertex Shader | Fragment Shader |
|---|---|---|
| Улазни подаци | Атрибути врхова из VBO | Интерполирани подаци из VS |
| Број позива | Број врхова | Број фрагмената |
| Основни задатак | Трансформација геометрије | Израчунавање боје пиксела |
| Рачунско оптерећење | Сложеност геометрије | Резолуција екрана |
| Приступ текстурама | Ограничен (кроз texture lookup) | Пун приступ |
Кључна разлика је учесталост позива. Vertex Shader се позива једном по врху, док Fragment Shader — за сваки фрагмент (пиксел). У сцени са високом резолуцијом број позива Fragment Shader-а премашује број позива Vertex Shader-а хиљадама пута, што оптимизацију пикселских шейдера чини још критичнијом.
Перформансе Vertex Shader-а су критичне за апликације у реалном времену, посебно у мобилном развоју са ограниченом потрошњом енергије. Главни фактори перформанси су број врхова, сложеност шейдер кода и пропусни опсег меморије GPU-а.
За смањење оптерећења Vertex Shader-а примењују се следећи приступи. Level of Detail (LOD) — прелазак на упрошћене верзије модела при удаљавању камере од објекта. Instancing — вишеструко цртање исте геометрије са различитим трансформационим матрицама у једном позиву за цртање (draw call).
// 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 на различитим графичким API-јима има сличну логику, али различиту синтаксу и конвенције именовања. Размотримо имплементацију основног вертекс шейдера у GLSL за OpenGL ES 3.0 и у Metal Shading Language за iOS и macOS.
#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;
}
#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 је програм на GPU-у који обрађује сваки врх 3D модела и претвара његове координате у екранске координате. Замислите модел као мрежу тачака; вертекс шейдер помера ове тачке према задатим математичким правилима.
Vertex Shader обрађује врхове и одговоран је за геометрију, док Fragment Shader одређује боју сваког пиксела. Први се позива за сваки врх (хиљаде), други за сваки пиксел (милиони).
Vertex Shader се пише на језику који одговара графичком API-ју: GLSL за OpenGL ES, Metal Shading Language за Metal API на iOS/macOS, HLSL за Direct3D. Концептуално сви они извршавају исте операције над врховима.
Сложеност вертекс шейдера директно утиче на FPS: више инструкција по врху = дужа обрада. Оптимизација укључује смањење броја врхова кроз LOD, коришћење инстансинга и минимизацију условних скокова у коду шейдера.
Основни задаци у играма: трансформација координата кроз MVP матрице, скининг анимираних ликова, процедурална деформација одеће и косе, морфинг између израза лица и ефекти честица са анимацијом на GPU-у.
Резиме
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође