Three.js · Renderer
Renderer: piksel işleme merkezi
Three.js'te ekrana görüntü basan katman WebGLRenderer'dır (veya
alternatif renderer sınıfları). Ağır iş CPU'da değil GPU'da
yürür; her karede render(scene, camera) ile o anki sahne ve kamera
durumu okunur, piksel tamponuna yazılır ve sonuç <canvas> üzerinden
sayfaya taşınır. Renderer sahne grafiğini güncellemez; yalnızca
çıktı üretir.
Holodepth üçlüsünde roller birbirini tamamlar: sahne yapıyı tutar, kamera hangi kesitin çizileceğini seçer, renderer bu kesiti GPU ile işler. Bu metinde üçlünün çıktı ve yürütme ayağını okuyorsunuz; sahne grafiği ve kamera matrisleri kardeş sayfalarda kalır.
Aşağıda render hattının özeti, requestAnimationFrame döngüsü,
setSize / pixel ratio, shadowMap bayrakları, API tablosu ve
tam kurulum örneği var; ışık türleri, materyal modelleri veya
scene.traverse burada tekrar anlatılmaz.
WebGLRenderer ve görüntüleme hattı
WebGLRenderer ve GPU donanımı
Varsayılan yol WebGLRenderer'dır; girişte özetlenen
yürütücü katman pratikte bu sınıftır. Paralel piksel işi ve
donanım hızlandırması sayesinde kare başına çizim maliyeti CPU ile kıyaslanamaz
ölçekte ölçeklenir; çıktı domElement (
<canvas>) üzerinden DOM'a eklenir.
- Paralel hesaplama: CPU çoğu işi sırayla yürütür; GPU ise aynı komutu yüzlerce veya binlerce çekirdekte aynı anda tekrarlayabilir. Three.js'te bu, özellikle fragment (piksel) aşamasında hissedilir: ekrandaki her piksel için ışık, materyal ve derinlik hesabı GPU tarafında paralel yürür. Sahne büyüdükçe “her pikseli JavaScript ile boyamak” yerine bu model performansın temelidir.
- Donanım hızlandırması:
WebGLRenderer,<canvas>üzerinde bir WebGL bağlamı açar ve çizim komutlarını doğrudan GPU'ya iletir — HTML Canvas 2D API'sinde olduğu gibi her karede tek tekfillRectçağırmazsınız. Akıcı kare hızı, bu düşük seviyeli GPU yolunun sürekli beslenmesine bağlıdır. Sahne + kamera + renderer üçlüsünün minimal kurulumu sahne girişindeki tam örnekte verilir; Canvas 2D ile WebGL farkı için Canvas vs WebGL köprüsüne bakabilirsiniz.
Renderer sahneyi değiştirmez
Renderer sahne grafiğini veya nesne durumunu değiştirmez; yalnızca o
andaki sahne + kamera verisini okuyup çizer. Konum, materyal ve ışık güncellemeleri
Scene ve nesneler üzerindedir; kamera dönüşümü
Camera'dadır; renderer bunların görüntüsünü üretir.
Bir karede render hattı (özet)
Her render çağrısında kabaca şu zincir işler:
- Kameraya göre görünür nesneler belirlenir (frustum vb.).
- Işık ve materyal hesaplamaları GPU üzerinde yürütülür.
- Geometriler piksel renklerine dönüştürülür.
- Gerekli durumlarda derinlik (Z-buffer) ve harmanlama (blending) işlemleri uygulanır.
- Sonuç
canvastamponuna yazılır.
Render döngüsü: Kalp
Renderer tek başına sürekli çalışmaz; hareket, animasyon veya etkileşim için her karede
renderer.render(scene, camera) çağrılmalıdır. Bunun standart kalıbı
requestAnimationFrame ile bir render döngüsüdür:
function animate() {
requestAnimationFrame(animate);
renderer.render(scene, camera);
}
animate();
scene ve camera önceden oluşturulmuş kabul edilir. Bu döngü,
statik bir kareden canlı sahneye geçişin temelidir. Aynı kalıp, aşağıdaki
kurulum + render döngüsü örneğinde renderer ayarlarıyla
birlikte tek parça halinde verilir.
Kritik kurulum parametreleri
new THREE.WebGLRenderer({ … }) satırındaki seçenekler, canvas ve WebGL
bağlamının ilk an nasıl açılacağını belirler; çoğu seçenek
sonradan değiştirilemez; gerekirse renderer yeniden oluşturulur. Görsel kalite,
şeffaflık ve GPU tercihi burada; piksel oranı ve boyut
bir sonraki alt başlıkta,
gölge ve renk uzayı
tam örnekte tamamlanır.
- Antialias: Kenar ve eğimli yüzeylerde görülen tırtıklanmayı
(aliasing) azaltır; çokgen kenarları daha yumuşak görünür.
{ antialias: true }ek GPU maliyeti getirir — mobilde pil ve ısınma için bazenfalsebırakılır; masaüstü ve vitrin sahnelerinde sık açık tutulur. Kapalıyken sonradan post-processing ile AA mümkün olabilir; burada yalnızca oluşturucu bayrağı anlatılır. - Alpha:
alpha: trueiken WebGL tamponu şeffaf olabilir; çizilmeyen veya yarı saydam piksellerde altta sayfanın CSS arka planı görünür. Tam opak sahne için geneldesetClearColor(ve gerekirse alpha kanalı) ile birlikte düşünülür — bu, sahnebackgroundyaklaşımından farklı bir katmandır. Şeffaf canvas, 3B içeriği HTML/CSS katmanlarıyla kompozisyon için kullanılır (ör. sayfa düzeni üzerinde canvas, HUD). - powerPreference: Tarayıcıya hangi GPU profilini tercih
ettiğinizi bildirir; garanti değildir — son söz tarayıcı ve işletim
sistemindedir. Çift GPU'lu dizüstülerde
"high-performance"bazen ayrık (dedicated) kartı seçtirir;"low-power"pil ömrünü korur. Yoğun sahnelerdehigh-performanceyaygındır; ölçüm yapmadan her projede açmak şart değildir.
const renderer = new THREE.WebGLRenderer({
antialias: true,
alpha: true,
powerPreference: 'high-performance',
});
Ekran netliği: pixel ratio ve boyutlandırma
Retina ve yüksek DPI ekranlarda piksel yoğunluğu yüksektir.
setPixelRatio(Math.min(window.devicePixelRatio, 2)) genelde netlik ile
performans arasında iyi denge sağlar. Yüksek pixel ratio değerleri GPU
yükünü belirgin şekilde artırır; bu yüzden pratikte üst sınır (ör. 2)
konması yaygındır. setSize canvas'ın çizim boyutunu belirler; tam
ekran örneklerde sıklıkla window.innerWidth /
window.innerHeight kullanılır ve pencere resize ile
güncellenir.
Gölgeler ve performans
shadowMap sistemi ek maliyet getirir; yalnızca gerçekten gölge ihtiyacı
olan ışıklar ve castShadow gerektiren mesh'ler için açılması iyi
pratiktir.
Teknik tablo: Renderer API özeti
| Metot / özellik | Açıklama | Neden önemli? |
|---|---|---|
.render(scene, camera) |
O kare için sahneyi hedefe çizer. | Animasyon döngüsünün kalbi. |
.domElement |
Oluşturulan <canvas> öğesidir. |
DOM'a eklemek için kullanılır. |
.shadowMap |
Gölge haritası ayarlarını taşır. | Gerçekçi gölgeler için enabled ve tip seçimi. |
.setClearColor() |
Tampon temizleme (arka plan) rengini ayarlar. | scene.background kullanılmadığında alternatif. |
.outputColorSpace |
Çıktı renk uzayını belirler (ör. THREE.SRGBColorSpace). |
Renklerin doğru gamma ile ekrana yansıması; eski
outputEncoding yerine kullanılır.
|
Uygulama: kurulum + render döngüsü
Aşağıdaki örnek renderer kurulumunu, outputColorSpace (gamma / sRGB),
gölgeleri ve animate içinde render(scene, camera) çağrısını
birleştirir; scene ve camera önceden tanımlıdır.
// 1. Renderer oluşturma
const renderer = new THREE.WebGLRenderer({
antialias: true,
alpha: true,
powerPreference: 'high-performance',
});
// 2. Boyut ve piksel yoğunluğu
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));
// 3. Renk uzayı (gamma / sRGB) ve gölgeler
renderer.outputColorSpace = THREE.SRGBColorSpace;
renderer.shadowMap.enabled = true;
renderer.shadowMap.type = THREE.PCFSoftShadowMap;
// 4. Canvas'ı sayfaya ekle
document.body.appendChild(renderer.domElement);
// 5. Render döngüsü — scene & camera tanımlı varsayılır
function animate() {
requestAnimationFrame(animate);
renderer.render(scene, camera);
}
animate();
Holodepth notu: 60 FPS hedefi
Saniyede 60 kare hedefi, her kare için kabaca 16,6 ms bütçesi demektir. Sahne ağırlaştıkça renderer bu süreyi aşar ve akışta takılmalar görülür; bu yüzden veriyi "az ama öz" tutmak 3D geliştirmede temel beceridir.