Rendering pipeline nasıl işler? Vertex shader ile fragment shader arasındaki fark nedir?
Cevap
GPU'da bir mesh'in ekrana çizilmesi kabaca şu aşamalardan geçer:
- Input assembly: Vertex ve index buffer'lardan üçgenler oluşturulur.
- Vertex shader: Her vertex için bir kez çalışır. Vertex'i object space'ten clip space'e dönüştürür (MVP matrisi), normal, UV gibi verileri sonraki aşamaya aktarır.
- Rasterization: Üçgenler ekran piksellerine karşılık gelen fragment'lara bölünür; vertex verileri üçgen boyunca interpolasyonla dağıtılır. Back-face culling ve clipping burada yapılır.
- Fragment (pixel) shader: Her fragment için çalışır. Doku örnekleme, ışıklandırma hesabı yaparak son rengi üretir.
- Output merger: Depth test, stencil test ve blending (saydamlık) uygulanıp sonuç frame buffer'a yazılır.
struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; };
struct v2f { float4 pos : SV_POSITION; float2 uv : TEXCOORD0; };
sampler2D _MainTex;
float4 _Color;
v2f vert (appdata v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex); // MVP dönüşümü
o.uv = v.uv;
return o;
}
float4 frag (v2f i) : SV_Target
{
return tex2D(_MainTex, i.uv) * _Color; // piksel rengi
}| Özellik | Vertex shader | Fragment shader |
|---|---|---|
| Kaç kez çalışır | Vertex başına | Piksel (fragment) başına |
| Temel görevi | Konum dönüşümü, deformasyon | Renk, doku, ışık |
| Tipik efektler | Dalgalanan su, rüzgârda çimen, skinning | Toon shading, dissolve, normal map |
Fragment sayısı genellikle vertex sayısından çok fazladır; bu yüzden pahalı hesapları mümkünse vertex shader'a taşımak ve overdraw'u (aynı pikselin defalarca çizilmesi) azaltmak önemli optimizasyonlardır. Pipeline'da ayrıca opsiyonel geometry ve tessellation aşamaları ile genel amaçlı compute shader'lar bulunur.
İlgili Grafik & Render soruları
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.