Vertex Shader, grafik hattının (graphics pipeline) her bir 3B model köşesini bağımsız olarak işleyen programlanabilir bir aşamasıdır. Khronos Group, 2025'e göre, vertex shader giriş olarak köşe niteliklerini (koordinatlar, normaller, renk ve doku koordinatları) alır ve bunları tanımlanan mantığa göre dönüştürür. Vertex Shader her köşe için bağımsız olarak çalışır ve hesaplamaların GPU'nun binlerce çekirdeğinde verimli bir şekilde paralelleştirilmesine olanak tanır.
Önemli Noktalar
Vertex Shader, grafik hattının programlanabilir bir aşamasıdır ve 3B modelin her köşesini ayrı ayrı işler. Köşe (vertex), xyz koordinatları, normaller, renk ve UV doku koordinatları gibi nitelikler içeren üç boyutlu uzayda bir noktadır.
Dönüşümlerin katı bir algoritmaya göre gerçekleştirildiği sabit işlevli hattın (fixed-function pipeline) aksine, Vertex Shader geliştiriciye köşe dönüşümü üzerinde tam kontrol sağlar. Bu, GPU tarafında prosedürel animasyon, model deformasyonu, iskelet skinning ve her türlü matematiksel dönüşümün uygulanmasına olanak tanır.
OpenGL ES grafik hattı, giriş verilerinden nihai görüntüye kadar bir dizi aşama içerir. Vertex Shader köşe birleştirme (vertex assembly) aşamasından sonra ve rasterleştirme aşamasından önce yer alır. CPU'dan bir köşe arabelleği aracılığıyla gönderilen her köşe, Vertex Shader'dan tam olarak bir kez geçer ve sonuç, ilkel birleştirme için bir sonraki aşamaya iletilir.
| Hat Aşaması | Amaç |
|---|---|
| Vertex Specification | VBO'dan köşe verileri ve niteliklerinin aktarımı |
| Vertex Shader | Her köşenin işlenmesi, koordinat dönüşümü |
| Tessellation | Geometrinin alt ilkellere isteğe bağlı bölünmesi |
| Geometry Shader | İlkellerin isteğe bağlı oluşturulması veya kaldırılması |
| Rasterization | Doldurma için ilkellerin parçacıklara dönüştürülmesi |
Vertex Shader, CPU kodunda yapılandırılan köşe nitelik işaretçileri aracılığıyla köşe arabelleğinden (VBO) köşe niteliklerini alır. Geliştirici, GLSL (OpenGL Shading Language) veya eşdeğer bir dilde shader kodu yazar ve GPU sürücüsü bunu belirli çip için makine talimatlarına derler.
Her köşe için Vertex Shader sırayla üç işlem gerçekleştirir: giriş niteliklerini okuma — geliştirici tarafından tanımlanan dönüşümleri uygulama — sonuçları çıkış değişkenlerine yazma. Gerekli minimum çıkış, kırpma uzayındaki köşe konumudur (gl_Position). Diğer tüm çıkış verileri (renk, normaller, doku koordinatları) enterpole edilir ve bir sonraki aşamaya (Fragment Shader) iletilir.
#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, geometri dönüşümüyle ilgili çok çeşitli grafik hattı görevlerini çözer. Her görev, vektörler ve matrisler üzerinde matematiksel işlemler yoluyla uygulanır ve binlerce köşe için aynı anda paralel olarak yürütülür.
Temel ve en yaygın görev, köşe koordinatlarını model, view ve projection (MVP) matrisleriyle çarpmaktır. MVP matrisi bir köşeyi yerel model uzayından kırpma uzayına (clip space) dönüştürür ve daha sonra hattın otomatik aşamalarında normalleştirilir ve ekran koordinatlarına dönüştürülür.
Animasyonlu karakterler için Vertex Shader, iskelet animasyonunu (skinning) uygular. Her köşe, belirli ağırlıklarla birden çok kemiğe bağlanır. Vertex blending — bağlı kemiklerden gelen dönüşümlerin ağırlıklı toplamı — iskelet hareket ettiğinde karakterin derisinin pürüzsüz bir şekilde deforme olmasını sağlar.
Vertex Shader, CPU katılımı olmadan zamana veya diğer uniform parametrelere dayalı olarak geometriyi değiştirebilir. Dalga deformasyonu, Perlin gürültüsü yer değiştirmesi ve su dalgası efektleri — tüm bu efektler, RAM'den geometri yeniden yüklenmeden vertex shader'da uygulanır.
Her iki shader türü de grafik hattının programlanabilir aşamaları olsa da, Vertex Shader ve Fragment Shader temelde farklı görevleri çözer ve görüntü işlemenin farklı aşamalarında çalışır.
| Özellik | Vertex Shader | Fragment Shader |
|---|---|---|
| Giriş verileri | VBO'dan köşe nitelikleri | VS'den enterpole edilmiş veriler |
| Çağrı sayısı | Köşe sayısı | Parçacık sayısı |
| Ana görev | Geometri dönüşümü | Piksel rengi hesaplama |
| Hesaplama yükü | Geometri karmaşıklığı | Ekran çözünürlüğü |
| Doku erişimi | Sınırlı (texture lookup ile) | Tam erişim |
Anahtar fark çağrı sıklığıdır. Vertex Shader köşe başına bir kez çağrılırken, Fragment Shader her parçacık (piksel) için çağrılır. Yüksek çözünürlüklü bir sahnede, Fragment Shader çağrılarının sayısı Vertex Shader çağrılarının sayısını binlerce kat aşar ve bu da piksel shader optimizasyonunu daha da kritik hale getirir.
Vertex Shader performansı gerçek zamanlı uygulamalar için, özellikle sınırlı güç tüketimi olan mobil geliştirmede kritik öneme sahiptir. Ana performans faktörleri köşe sayısı, shader kodunun karmaşıklığı ve GPU bellek bant genişliğidir.
Vertex Shader üzerindeki yükü azaltmak için aşağıdaki yaklaşımlar kullanılır. Level of Detail (LOD) — kamera nesneden uzaklaştığında modellerin basitleştirilmiş sürümlerine geçme. Instancing — tek bir çizim çağrısında (draw call) farklı dönüşüm matrisleriyle aynı geometriyi birden çok kez çizme.
// Instancing desteğiyle 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 farklı grafik API'lerinde benzer mantığa ancak farklı sözdizimi ve adlandırma kurallarına sahiptir. OpenGL ES 3.0 için GLSL'de ve iOS ile macOS için Metal Shading Language'de temel bir vertex shader uygulamasına bakalım.
#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;
}
Sıkça Sorulan Sorular
Vertex Shader, 3B modelin her köşesini işleyen ve koordinatlarını ekran koordinatlarına dönüştüren GPU üzerindeki bir programdır. Modeli bir nokta ağı olarak hayal edin; vertex shader bu noktaları tanımlanan matematiksel kurallara göre hareket ettirir.
Vertex Shader köşeleri işler ve geometriden sorumluyken, Fragment Shader her pikselin rengini belirler. Birincisi her köşe için (binlerce), ikincisi her piksel için (milyonlarca) çağrılır.
Vertex Shader, grafik API'sine karşılık gelen bir dilde yazılır: OpenGL ES için GLSL, iOS/macOS üzerinde Metal API için Metal Shading Language, Direct3D için HLSL. Kavramsal olarak, hepsi köşeler üzerinde aynı işlemleri gerçekleştirir.
Vertex shader'ın karmaşıklığı doğrudan FPS'yi etkiler: köşe başına daha fazla talimat = daha uzun işlem süresi. Optimizasyon, LOD ile köşe sayısını azaltmayı, instancing kullanmayı ve shader kodunda koşullu dallanmaları en aza indirmeyi içerir.
Oyunlardaki ana görevler: MVP matrisleriyle koordinat dönüşümü, animasyonlu karakterlerin skinningi, giysi ve saçın prosedürel deformasyonu, yüz ifadeleri arasında morfing ve GPU animasyonuyla parçacık efektleri.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun