Fragment Shader, bir görüntünün her parçasının (piksel) nihai rengini belirleyen, grafik hattının programlanabilir bir aşamasıdır. Khronos Group, 2025'e göre, parça gölgelendirici Vertex Shader'dan enterpolasyonlu veriler alır ve aydınlatma hesaplamaları, doku oluşturma ve renk efektleri gerçekleştirir. Fragment Shader her piksel için çağrılır ve bu da onu grafik hattının en kaynak yoğun aşaması yapar.
Önemli Noktalar
Fragment Shader (parça veya piksel gölgelendirici), görüntünün her parçasının nihai rengini hesaplayan, grafik hattının programlanabilir bir aşamasıdır. Parça, derinlik ve şablon testlerini geçtikten sonra ekranda görünür piksel haline gelen potansiyel bir pikseldir.
Fragment Shader, 3D ilkellerin (üçgenler) zaten bir parça kümesine dönüştürüldüğü rasterleştirmeden sonra çalıştırılır. Gölgelendirici, Vertex Shader'da üçgen köşeleri için hesaplanan ve üçgenin içindeki her piksel için doğrusal olarak enterpole edilen enterpolasyonlu nitelikleri (doku koordinatları, normaller, renkler) alır.
Programlanabilir gölgelendiricilerin ortaya çıkmasından önce (DirectX 8 / OpenGL 2.0 öncesi), piksel rengi hesaplaması sınırlı işlem setine sahip sabit bir hat tarafından gerçekleştiriliyordu. Programlanabilir Fragment Shader 2001 yılında ortaya çıktı ve grafik yeteneklerini kökten genişletti: geliştiriciler her pikselin rengi üzerinde tam kontrol elde ederek fotogerçekçi aydınlatma, karmaşık malzemeler ve sonradan efektler uygulayabildi.
Fragment Shader, rasterleştirici tarafından oluşturulan her parça için GPU tarafından başlatılır. Her gölgelendirici çağrısı bir parçayı işler, giriş verilerini okur, kullanıcı kodunu çalıştırır ve çıkış değerini — RGBA formatında parçanın rengini — yazar.
Fragment Shader giriş verileri, Vertex Shader'dan enterpolasyonlu nitelikler (doku koordinatları, normaller, renkler), uniform değişkenler (ışık kaynakları, matrisler) ve doku örnekleyicilerini içerir. Çıkış verisi, renk tamponuna yazılan renk vektörüdür (OpenGL ES 2.0'da gl_FragColor veya ES 3.0'da kullanıcı tanımlı değişken).
#version 300 es
precision mediump float;
in vec2 vTexCoord;
uniform sampler2D uTexture;
out vec4 fragColor;
void main() {
fragColor = texture(uTexture, vTexCoord);
}
Fragment Shader görüntünün görsel kalitesinden sorumludur. Kullanıcının ekranda gördüğü tüm efektler — renk, gölgeler, yansımalar, şeffaflık — grafik hattının bu aşamasında hesaplanır.
En sık yapılan işlem, enterpolasyonlu UV koordinatlarını kullanarak bir dokudan renk örneklemektir. Sampler2D ve texture() işlevi, bir doku atlasından piksel rengi almayı sağlar. Filtreleme (bilinear, trilinear, anisotropic) örnekleyici parametreleri aracılığıyla kontrol edilir ve farklı görüş açılarında görüntü keskinliğini etkiler.
Phong gölgeleme modeli, Fragment Shader'da piksel başına hesaplanır ve köşe aydınlatmasından (Gouraud gölgeleme) daha yumuşak parlamalar sağlar. Phong aydınlatması üç bileşen içerir: ortam (ambient), dağınık (diffuse) ve speküler (specular) yansıma.
// Fragment shader with Phong lighting
in vec3 vNormal;
in vec3 vPosition;
uniform vec3 uLightDir;
uniform vec3 uLightColor;
void main() {
vec3 norm = normalize(vNormal);
float diff = max(dot(norm, uLightDir), 0.0);
fragColor = vec4(uLightColor * diff, 1.0);
}
Fragment Shader, sonradan işleme uygulamaya izin verir: arama tabloları (LUT) aracılığıyla renk düzeltme, bulanıklaştırma (blur), parlama efekti (bloom) ve HDR oluşturma için ton eşleme. Tüm bu efektler piksel seviyesinde çalışır ve gerçek zamanlı olarak yürütülür.
Fragment Shader performansı, modern mobil oyunlarda FPS'yi sınırlayan ana faktördür. Gölgelendirici her piksel için çağrıldığından, kod karmaşıklığındaki küçük bir artış bile kare hızında belirgin bir düşüşe neden olabilir.
Mobil GPU'lar (Qualcomm Adreno, ARM Mali) için önerilir: float değişkenler için mediump precision kullanın, doku örneklemelerini birleştirin, gölgelendirici yürütülmeden önce görünmez parçaları atmak için early-z testleri uygulayın.
| Yöntem | Açıklama | Kazanç |
|---|---|---|
| Mediump precision | 32 bit yerine 16 bit hassasiyet | 2x hıza kadar |
| Early-Z | Gölgelendiriciden önce derinlik testi | Çağrı azaltma |
| Texture atlasing | Birden fazla yerine tek doku | Daha az geçiş |
Her iki gölgelendirici türü de geliştirici tarafından programlanabilir, ancak hattın farklı aşamalarında çalışır ve farklı görevleri çözer. Fragment Shader çağrı sayısı nedeniyle önemli ölçüde daha kaynak yoğundur.
| Parametre | Fragment Shader | Vertex Shader |
|---|---|---|
| Çağrı sayısı | Milyonlar (ekran çözünürlüğü) | Binler (köşe sayısı) |
| Giriş verileri | Enterpolasyonlu nitelikler | Köşe nitelikleri |
| Ana işlev | Parça rengi hesaplama | Geometri dönüşümü |
| Doku erişimi | Tam (birden çok örnekleyici) | Sınırlı |
| Performans etkisi | Yüksek (çözünürlüğe bağlı) | Orta (geometriye bağlı) |
Fragment Shader basit (doku örnekleme) veya karmaşık (çok katmanlı aydınlatma) olabilir. İki pratik örneği inceleyelim: temel doku oluşturma ve zaman kullanan bir gradyan efekti.
#version 300 es
precision mediump float;
in vec2 vTexCoord;
in vec3 vColor;
uniform sampler2D uDiffuseMap;
out vec4 fragColor;
void main() {
vec4 texColor = texture(uDiffuseMap, vTexCoord);
fragColor = texColor * vec4(vColor, 1.0);
}
#include <metal_stdlib>
using namespace metal;
struct FragmentIn {
float2 texCoord;
float3 normal;
};
fragment float4
fragmentMain(FragmentIn in [[stage_in]],
texture2d<float> tex [[texture(0)]]) {
constexpr sampler s(filter = linear);
float4 color = tex.sample(s, in.texCoord);
return color;
}
Sıkça Sorulan Sorular
Fragment Shader, GPU üzerinde her pikselin ekranda hangi renkte olacağını belirleyen küçük bir programdır. Vertex Shader nesnenin şeklini belirlerken, Fragment Shader o nesnenin nasıl göründüğünü — doku, aydınlatma, renk — belirler.
Fragment Shader ekrandaki her piksel için çağrılır. 2532x1170 (iPhone) çözünürlüğüne sahip bir cihazda bu, kare başına neredeyse 3 milyon çağrıdır. 60 FPS'de gölgelendirici saniyede 180 milyon kez çalışır ve bu da büyük hesaplama gücü gerektirir.
Fragment Shader'da şunlar uygulanır: doku oluşturma, aydınlatma (Phong, PBR), gölgeler, yansımalar, kırılmalar, bloom, alan derinliği, renk düzeltme, LUT filtreleri ve prosedürel doku üretimi.
float için mediump precision kullanın, doku örnekleme sayısını azaltın, early-z culling uygulayın, gölgelendirici işlemlerini birleştirin ve gölgelendirici içinde koşullu dallanmalardan kaçının.
Aynı şeydir. Fragment Shader terimi OpenGL / Vulkan'da kullanılırken, Pixel Shader Direct3D (Microsoft) terminolojisinde kullanılır. İşlevsel olarak aynıdırlar: her ikisi de her parçanın/pikselin rengini hesaplar.
Ö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