Vertex Shader: bu nədir, vəzifələri və iş prinsipi

Müəllif: IT Sectr Dərc olunub: 2026-06-11 Oxuma vaxtı: 10 dəq

Vertex Shader — qrafik konveyerinin (graphics pipeline) proqramlaşdırıla bilən mərhələsidir, o üçölçülü modelin hər bir təpəsini emal edir. Khronos Group, 2025 məlumatına görə, təpə şeyderi girişdə təpə atributlarını — koordinatları, normalları, rəngi və tekstur koordinatlarını — qəbul edir və onları verilən məntiqə uyğun çevirir. Vertex Shader hər bir təpə üçün müstəqil icra olunur, bu da hesablamaları minlərlə GPU nüvəsində effektiv paralelləşdirməyə imkan verir.

Əsas məqamlar

  • Vertex Shader — GPU-nun proqramlaşdırıla bilən mərhələsi, 3D modelin hər bir təpəsini digərlərindən asılı olmayaraq emal edir.
  • Koordinat çevrilməsi obyekt məkanından ekran məkanına — təpə şeyderinin əsas vəzifəsidir.
  • OpenGL ES 3.0 və Metal Shading Language təpə şeyderləri yazmaq üçün standartlaşdırılmış API təmin edir.
  • Performans Vertex Shader təpələrin sayından və şeyder kodunun mürəkkəbliyindən asılıdır.
  • Skininq və təpə morfingi — GPU-da təpə şeyderində həyata keçirilən tipik tapşırıqlar.

Vertex Shader nədir?

Vertex Shader — qrafik konveyerinin (graphics pipeline) proqramlaşdırıla bilən mərhələsidir, o üçölçülü modelin hər bir təpəsini ayrıca emal edir. Təpə (vertex) — üçölçülü fəzada atributları olan nöqtədir: xyz koordinatları, normallar, rəng və UV tekstur koordinatları.

Sabit funksiyalı konveyerdən (fixed-function pipeline) fərqli olaraq, burada çevrilmələr ciddi verilmiş alqoritmə uyğun icra olunurdu, Vertex Shader proqramçıya təpə transformasiyası üzərində tam nəzarət verir. Bu, prosedur animasiya, modellərin deformasiyası, skelet skininqi və GPU tərəfində istənilən riyazi çevrilmələri həyata keçirməyə imkan verir.

Vertex Shader-in qrafik konveyerində yeri

OpenGL ES qrafik konveyeri giriş məlumatlarından son şəklə qədər mərhələlər ardıcıllığını əhatə edir. Vertex Shader təpə yığımı mərhələsindən (vertex assembly) sonra və rastrlaşdırma mərhələsindən əvvəl yerləşir. CPU-dan təpə buferi vasitəsilə ötürülən hər bir təpə Vertex Shader-dən dəqiq bir dəfə keçir və nəticə primitivlərin yığılması üçün növbəti mərhələyə ötürülür.

Konveyer mərhələsiTəyinat
Vertex SpecificationTəpə məlumatlarının və atributlarının VBO-dan ötürülməsi
Vertex ShaderHər bir təpənin emalı, koordinat transformasiyası
TessellationHəndəsənin altprimitivlərə opsional bölünməsi
Geometry ShaderPrimitivlərin opsional generasiyası və ya silinməsi
RasterizationPrimitivlərin doldurma üçün fraqmentlərə çevrilməsi

Vertex Shader necə işləyir?

Vertex Shader girişdə təpə buferindən (VBO) CPU kodunda konfiqurasiya olunmuş atribut göstəriciləri (vertex attribute pointers) vasitəsilə təpə atributlarını qəbul edir. Proqramçı GLSL (OpenGL Shading Language) və ya oxşar dildə şeyder kodu yazır, bu kod GPU drayveri tərəfindən xüsusi çip üçün maşın təlimatlarına kompilyasiya olunur.

Təpənin emal prosesi

Hər bir təpə üçün Vertex Shader ardıcıl olaraq üç əməliyyat yerinə yetirir: giriş atributlarının oxunması — proqramçı tərəfindən müəyyən edilmiş çevrilmələrin tətbiqi — nəticələrin çıxış dəyişənlərinə yazılması. Minimum məcburi çıxış — təpənin kəsmə məkanında mövqeyi (gl_Position). Bütün digər çıxış məlumatları (rəng, normallar, tekstur koordinatları) interpolyasiya olunur və növbəti mərhələyə — Fragment Shader-ə ötürülür.

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-in əsas vəzifələri

Vertex Shader həndəsə transformasiyası ilə bağlı qrafik konveyerinin geniş spektrli vəzifələrini həll edir. Hər bir vəzifə vektorlar və matrislər üzərində riyazi əməliyyatlar vasitəsilə həyata keçirilir, eyni anda minlərlə təpə üçün paralel icra olunur.

MVP vasitəsilə koordinat transformasiyası

Əsas və ən geniş yayılmış vəzifə — təpə koordinatlarının model, view və projection (MVP) matrislərinə vurulmasıdır. MVP matrisi təpəni modelin lokal məkanından kəsmə məkanına (clip space) çevirir, sonra isə avtomatik konveyer mərhələlərində normallaşdırılır və ekran koordinatlarına çevrilir.

Skelet animasiyası (Skinning)

Animasiya olunan personajlar üçün Vertex Shader skelet animasiyasını (skinning) həyata keçirir. Hər bir təpə müəyyən çəkilərlə bir neçə sümüyə bağlanır. Vertex blending — bağlı sümüklərdən çevrilmələrin çəkili cəmi — skelet hərəkət edərkən personajın dərisini hamar deformasiya etməyə imkan verir.

Həndəsənin prosedur deformasiyası

Vertex Shader CPU-nun iştirakı olmadan vaxt və ya digər uniform parametrlər əsasında həndəsəni dəyişdirə bilər. Wave deformation, Perlin səs-küyünə əsaslanan səs-küy yerdəyişmələri və suda dalğa effektləri — bütün bu effektlər təpə şeyderində həndəsəni operativ yaddaşdan yenidən yükləmədən həyata keçirilir.

Vertex Shader vs Fragment Shader: fərqlər

Hər iki şeyder növü qrafik konveyerinin proqramlaşdırıla bilən mərhələləri olsa da, Vertex Shader və Fragment Shader prinsipial olaraq fərqli vəzifələri həll edir və təsvirin emalının müxtəlif mərhələlərində işləyir.

XarakteristikaVertex ShaderFragment Shader
Giriş məlumatlarıVBO-dan təpə atributlarıVS-dən interpolyasiya olunmuş məlumatlar
Çağrı sayıTəpələrin sayıFraqmentlərin sayı
Əsas vəzifəHəndəsə transformasiyasıPiksel rənginin hesablanması
Hesablama yüküHəndəsə mürəkkəbliyiEkran rezolyusiyası
Teksturlara girişMəhdud (texture lookup vasitəsilə)Tam giriş

Əsas fərq — çağrı tezliyidir. Vertex Shader hər təpə üçün bir dəfə çağrılır, Fragment Shader isə hər fraqment (piksel) üçün. Yüksək rezolyusiyalı səhnədə Fragment Shader çağrılarının sayı Vertex Shader çağrılarının sayını minlərlə dəfə üstələyir ki, bu da piksel şeyderlərinin optimallaşdırılmasını daha kritik edir.

Vertex Shader performansı və optimallaşdırılması

Vertex Shader performansı real vaxt tətbiqləri üçün kritik əhəmiyyət daşıyır, xüsusilə məhdud enerji istehlakı olan mobil inkişafda. Əsas performans faktorları — təpələrin sayı, şeyder kodunun mürəkkəbliyi və GPU yaddaşının ötürmə qabiliyyətidir.

Performansa təsir edən faktorlar

  • Vertex count — kadr başına GPU-ya ötürülən təpələrin sayı. Milyonlarla poliqonu olan modellər təpə şeyderində yüksək yük yaradır.
  • Shader complexity — şeyderdəki təlimatların sayı. İç-içə dövrlər və şərti keçidlər (divergence) SIMD bloklarının paralel performansını azaldır.
  • Bandwidth — video yaddaşdan təpə məlumatlarının oxuma sürəti. Atribut formatı (float32, float16, normallaşdırılmış tam ədəd) birbaşa ötürmə qabiliyyətinə təsir edir.

Təpə şeyderlərinin optimallaşdırılması metodları

Vertex Shader yükünü azaltmaq üçün aşağıdakı yanaşmalar tətbiq olunur. Level of Detail (LOD) — kameranın obyektdən uzaqlaşması zamanı modellərin sadələşdirilmiş versiyalarına keçid. Instancing — bir çəkmə çağrısında (draw call) eyni həndəsənin müxtəlif transformasiya matrisləri ilə çoxsaylı çəkilməsi.

glsl
// Vertex Shader instansiya dəstəyi ilə
in vec3 aPosition;
in mat4 aInstanceMatrix;
uniform mat4 uViewProjection;

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

Vertex Shader kod nümunələri

Vertex Shader müxtəlif qrafik API-lərində oxşar məntiqə, lakin fərqli sintaksis və adlandırma konvensiyalarına malikdir. OpenGL ES 3.0 üçün GLSL və iOS və macOS üçün Metal Shading Language-da əsas təpə şeyderinin implementasiyasını nəzərdən keçirək.

OpenGL ES 3.0 üçün GLSL nümunəsi

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 nümunəsi

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

Tez-tez verilən suallar

Vertex Shader sadə sözlərlə nədir?

Vertex Shader — GPU-da proqramdır, 3D modelin hər bir təpəsini emal edir və onun koordinatlarını ekran koordinatlarına çevirir. Modeli nöqtələrdən ibarət şəbəkə kimi təsəvvür edin; təpə şeyderi bu nöqtələri verilən riyazi qaydalara uyğun hərəkət etdirir.

Vertex Shader Fragment Shader-dən nə ilə fərqlənir?

Vertex Shader təpələri emal edir və həndəsəyə cavabdehdir, Fragment Shader isə hər pikselin rəngini müəyyən edir. Birincisi hər təpə üçün çağrılır (minlərlə), ikincisi hər piksel üçün (milyonlarla).

Vertex Shader hansı dillərdə yazılır?

Vertex Shader qrafik API-yə uyğun dildə yazılır: GLSL OpenGL ES üçün, Metal Shading Language iOS/macOS-də Metal API üçün, HLSL Direct3D üçün. Konseptual olaraq hamısı təpələr üzərində eyni əməliyyatları yerinə yetirir.

Vertex Shader performansa necə təsir edir?

Təpə şeyderinin mürəkkəbliyi birbaşa FPS-ə təsir edir: təpə başına daha çox təlimat = daha uzun emal. Optimallaşdırma LOD vasitəsilə təpələrin sayının azaldılması, instansinqin istifadəsi və şeyder kodunda şərti keçidlərin minimallaşdırılmasını əhatə edir.

Vertex Shader oyunlarda hansı vəzifələri həll edir?

Oyunlarda əsas vəzifələr: MVP matrisləri vasitəsilə koordinat transformasiyası, animasiya olunan personajların skininqi, paltar və saçların prosedur deformasiyası, üz ifadələri arasında morfing və GPU-da animasiya ilə hissəcik effektləri.

Nəticə

  • Vertex Shader — qrafik konveyerinin proqramlaşdırıla bilən mərhələsi, 3D modelin hər bir təpəsini müstəqil emal edir.
  • Əsas vəzifə — təpə koordinatlarının lokal məkandan ekran məkanına MVP matrisləri vasitəsilə çevrilməsi.
  • Vertex Shader paralel olaraq çoxsaylı GPU nüvələrində icra olunur, milyonlarla təpədə yüksək performans təmin edir.
  • Skininq, morfing və prosedur animasiya CPU-nun iştirakı olmadan təpə şeyderində həyata keçirilir.
  • Çağrı sayı Vertex Shader təpələrin sayına bərabərdir — Fragment Shader çağrılarından əhəmiyyətli dərəcədə azdır.
  • Optimallaşdırma LOD modelləri, instansinq və şeyder kodunda budaqlanmaların minimallaşdırılmasını əhatə edir.
  • GLSL və Metal Shading Language — mobil inkişafda təpə şeyderləri üçün əsas dillər.

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun