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 — 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.
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əsi | Təyinat |
|---|---|
| Vertex Specification | Təpə məlumatlarının və atributlarının VBO-dan ötürülməsi |
| Vertex Shader | Hər bir təpənin emalı, koordinat transformasiyası |
| Tessellation | Həndəsənin altprimitivlərə opsional bölünməsi |
| Geometry Shader | Primitivlərin opsional generasiyası və ya silinməsi |
| Rasterization | Primitivlərin doldurma üçün fraqmentlərə çevrilməsi |
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.
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.
#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 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.
Ə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.
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.
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.
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.
| Xarakteristika | Vertex Shader | Fragment 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əbliyi | Ekran 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ı 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.
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.
// 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 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.
#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;
}
Tez-tez verilən suallar
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 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 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.
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.
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ə
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.
Həm də oxuyun