Müthiş Realtime GI Tüm Masaüstü ve Konsollarda

Alex Lovett ile tekrar birleştik ve Önceden hesaplanmış Realtime GI özelliklerinin Unity 5'teki kullanımını kapsayan bir demo; The Courtyard(Avlu)'ı yarattık. Alex daha önce  Shrine Arch-viz demo'unu yapmıştı. Bu sefer de hedefimiz realtime kare hızlarına gerek duyan oyun geliştiricileriydi. Aşağıda ki videoya bir bakın:

 

 

Alex, demoyu 8 hafta içinde Asset Mağazasından herhangi bir ek paket olmaksızın Unity 5.2'yi olduğu gibi kullanarak inşa etti. Her şey sıfırdan yaratıldı.

Bu karede fırınlanmış ışık hiç kullanılmadı

Demo Precomputed(Önceden Hesaplanmış) Realtime GI ve gerçekzamanlı aydınlatmaya dayanıyor. Tam gün döngüsü, yayıcı geometri, gece canlanan100 kadar animasyonlu spot ışığı ve ayrıca standda birkaç profektör ve opsiyonel bir oyuncu el fenerine sahip. Gün döngüsü, ince aydınlatma değişikliklerini yakalayabilmek için güneşe senkronlanmış animasyonlu bir skybox kullanıyor. Oynanabilir demoda eklenmiş olan oyun-içi özeklliklerin tümünü kontrol edebilmenizi sağlayan bir UI'ı sizler için hazır hale getiriyoruz. Aşağıda günün değişik zamanlarından birkaç kare görebilirsiniz:

Sahne adınlatma açısından özellikle talep edilecek şekilde yaratıldı. Çok büyük bir parçası sıçrayan ışıkla aydınlatıldı ve güneş battığında neredeyse tamamı sıçrayan ışıkla yapıldı.

Gerçekzaman zamanlı GI sistemi karedeki sabit objeler arasındaki muhtemel ışık yollarının tümünü önceden hesaplayarak çalışır. Bu da ışığı kesinti olmadan gerçek zamanda bükmeyi mümkün kılar çünkü sistem aydınlatma değişimlerinin sonuçlarını hızlıca hesaplamak için gerekli tüm infoya zaten sahiptir. Dolayısıyla sabit objeler değiştirilmemeli çünkü değişim tüm bu yolların tekrar hesaplanmasını gerektirecektir. Bu düşünüldüğünde aşamalardaki yazar düzeyleri anlam ifade etmektedir: önce geometri sonra aydınlatma(gerekirse tekrar edilir). Sabit geometriyi etrafta gelişigüzel hareket ettirip aydınlatmayı aynı anda ayarlamak birçok ışık yapılandırması gerektirir. Unity 5.x için daha aşamalı ve etkileşimli aydınlatma çalışma akışı üzerinde çalışmaktayız.

Authoring for Realtime GI

Demo, masaüstü PC ve konsollar düşünülerek yapıldı, mobil platformlar için gerçekzamanlı GI'yı görmek için Transporter demosu içeren blog yazısına bakın.

Gerçekzamanlı GI sistemi Geomerics Enlighten tarafından güçlendirildi ve oyunlarda kullanmak için dizayn edildi. Tüm aydınlatma hesaplamaları işlemci iş parçacıkları üzerinde eş zamanlı olarak gerçekleştirildi çünkü oyunlar genelde GPU'ya bağlıdır ve ekstra CPU çalışması genel kare hızı üzerinde çok az etkiye sahiptir. Ayrıca, sadece ve sadece aydınlatmanın değiştiği alanlar yeniden hesaplanır.

Oyundaki gecikme seçilmiş gerçekzamanlı dolaylı ışık haritaları çözünürlüğüne bağlıdır. Bu demoda, Alex çözünürlüğü -duyarlı olması için- oldukça düşük ayarladı fakat bunda bile hala dolaylık olarak aydınlatılmış alanlarda arzu edilen aydınlatma doğruluğu ve inceliklerini yakalayabilmekte.

Dolaylı aydınlatmaharitaları çözünülüğü şöyleydi:

  • Merkezi bölgelerde her iki ünitede bir texel(yani ünite başına 0.5 texel)
  • Merkezi alana yakın kum tepelerindeki her 10 üniteye 1 texel
  • Dış alanlardaki kum tepelerinde her 32 üniteye bir texel.

Çözünürlüğü dengeleyebilmek için sahnede her üniteye 0.25 texellik genel başlangıç belirlendi. Daha sonra gerçekten güzel bir aydınlatma ve 15 dakikalık yeniden hesaplama zamanı vermek için özel aydınlatmaharitaları parametreleri kullanılarak çarpanlar eklendi.

Aşağıdaki ekran sahneye gölgeli bir bakış göstermekte, meydana getirilen Aydınlatma sistemleri, UV grafik görüntüsü (dolaylı ışıkharitalarının çözünürlüğünü göstermekte), kümeler (ışık sıçramalarını emmekle yükümlü), sıçrayan aydınlatma ve aydınlatma yönü (eksen geometrsini ve spekturumu aydınlatmak için kullanışmış):

 

İyi aydınlatmaharitalayıcı UVler sağlamak için oldukça dikkat edildi. Bazı durumlarda modellerin aydınlatma yapıları ve çalışmazamanı için sağlam performans sergilemesini garantilemek için işi ele aldık. Bunun özel bir örneği ise bu merdiven modelidir.

Merdivenleri düzgün yapmak, geniş texel ebatlarında bir texelin tek adımdan fazlasını kapsayacağı için, zor olabilir. Bu da aydınlatma seviyelerinni adımlar arasında beklenmedik şekilde değişkenlik göstermesine yol açabilir. Diğer bir açıdan adımlar için birçok texel kullanmak performans yönünden pahalıya patlayabilir. Bu sahnede kullanılan merdivenler de eğik çizgilere sahipti, bu da cidden gerçekzamanlı GI'ın açma ve paketleme işlemini ortadan kaldırabilir ve texel alanını kaplayan gereksiz grafikler üretebilir. Başlangıç merdiven dizaynı gerçekzamanlı GI UV düzeninde şöyle görünmekteydi :

 

texel

Bu, 70x72 texel gerçekzamanlı ışıkhariası gerektirir. Bu düzenle ilgili iki sorun mvcut. Öncelikle, her adımda çok fazla texel kullanıyor(4x4) ikinci olarak, eğri çizgiler ayrıca min 44 texel gerektiren iki ayrı tabloya bölünmüş durumda. Neden her table sadece 1 texel kullanamıyor? Birinci olarak, Aydınlatma çalışma akışında dokuyu işleyeceği zaman 2x2 texel bloğuna optimize dilmiş. İki, Aydınlatma düzgün sonuçlara erişilmesi için tabloların birbirine dikilebilir olduğu bir birleştirme özelliği içermekte, örneğin; küreler ve silindirler, bu özellik bir grafiğin her kenarda ayrı yön bilgisi bulundurmasını gerektirir. Yön bilgisi blok-başına bazında depolanır dolayısıyla dikişli çizelge, minimum 4x4 texele dönüşebilmek için,  her zaman minimum 2x2 bloğa ihtiyaç duyacak. Merdiven için herhangi bir dikişe ihtiyaç duyulmadığı için 2x2 grafikleri yeterlidir.

Aydınlatma paneli obje özellikleri içinde bunun için bir seçenek tanıttık:

parametre

Değer ya yönlülük kullanan ayarlar için oldukça iyi çalışan 4 olabilir ya da daha sıkı olan 2. Minimum grafik boyut seçeneğini 2’ye ayarlamak texel yoğunluğunu büyük oranda düşürür- model şuan 44×46 texel gerçekzaman aydınlatma haritasına uyuyor:

normalkullan

Eğimler hala gereksiz grafik alanını işgal ediyor. Eğim ve basamaklar eğim UV alanındaki adımın bir parçası olacak şekilde yazıldığı müddetçe, bu biraz beklenmedik bir durum. Şağıdaki resim UV sınırlarının model üzerine fazla yüklendiğini gösteriyor:

adımlar

Aydınlatmaharitalayıcı UV’lerin 2D görünümünde eğimler belirmiyor. Bunun nedeni adım grafiklerinin içinde çökmüş olmaları böyle de UV alanında herhangi bir yerleri yok. Bu, aydınlatma simülasyonunun eğimli eğimlerin hesaba katılmasını önlemek için yapılır.

merdivenler_uv_charts

Eğrilerin ayrı grafikler halinde ayrılmasının nedeni, gerçek zamanlı GI için kullanılan UV'lerin, her örneğinin kullanılacak gerçek çözünürlükte yeniden paketlenmeyi gerektirmesidir. Paketleme algoritması, çizelgeler arasında yarım texel sınırının bulunmasını garantiler; böylece çizelgeler arasındaki kanayan eserler engellenmiş olur. Bu, atlasların gayet iyi şekilde kullanılmasını sağlar aydrıca örnek UV'lere sahip olma pahasına ambalaj kenar boşluklarına gerek duyulmaz

Sorun, bu örnekteki gibi adımlar ve eğimler arasında sert köşe gibi bir sert köşe olduğunda çıkmakta. Model importer, sert kenarın köşelerini, sert köşenin her yanı farklı normallere ihtiyaç duyduğundan zaten kopyalanmış olacaktır. Bu sebepten dolayı grafikler en baştan zaten bölünmüş durumda. Bunu yeniden paketlemek eğimlerin ayrı grafiklerde sonlanmasına neden olacaktır. Bunun sebebi grafik algılamanın varsayılan ayarda grafik algısı için normalleri kullanmasıdır. Eşit köşe konumlarına sahip bir kenar, aynı UV’lar fakat değişik normaller bulduğu zaman grafiği o kenar boyunca bölecektir.

Bu örnekte o davranış talep edilmiyor. Eğim, aydınlatma üzerinde öyle büyük bir etkiye sahip olmayacağı için, adım için grafiğe entegre edilmelidir. Bunu yapmak için, paketleme adımında grafik algılaması yaparken normalleri görmezden gelme seçeneği sunduk. Bu, sert kenarlara rağmen, grafikleri yazıldıkları gibi tutacaktır:

parame.jgp

Paketleyici özelliği aktive etmek yoğunluğu daha da fazla düşürür. Şuan eğimler adımlarla entegre edilmiş halde. Sonuç 22x24’lük aydınlatma haritasına sığmakta:

sonuç
sonuc2

Uygun olduğunda bu seçenekelri kullanarak gerçek zamanlı GI yeniden hesaplama zamanı bir buçuk saatten 15 dakikaya düşürülebilir.

Peki ya Performans ?

Realtime GI, arzu edilen çalışma zamanı performansı/hafıza bütçesine uymak için fazla ince ayara gerek duymadı. Bununla birlikte, efekt sonrası yığın oldukça derin ve Filmik Skeç, Bloom, Tonharitalama, Mercek Bükme, Ekran Alanı Ortam Tıkanıklığı, Renk Düzeltme Eğrileri, Gürültü ve Tane, Renk Derecelendirme Özellikleri ve Düzeltme Önleyici içermekte. Buna rağmen iyi bir GPU ile hızlı bir bilgisayarda 60fps düzeyinde çalışır.

Yine de gerçek zamanlı GI’a birkaç ince ayar uygulandı.

 

Hızlı Çevre Aydınlatma

Gerçek zamanlı GI çevre aydınlatma girdilerini kullanmak için direkt olarak skybox kullanabilme yeteneğine sahiptir. Bununla birlikte bu özellik, CPU’ya dayalı gerçek zamanlı GI sistemini güncellemekmek için skybox dokularını GPU’dan indirmeyi gerektirir. Bu, demoda dönümü simülasyonu çalışırken olduğu gibi gün, çevre ışığının her karede değiştiği durumlar için ideal değildir. Bunun yerine, çevre aydınlatması güncel zamandan çekilir ve gerçek zamanlı GI sistemini sürmesi için kullanılan ışık düşümü ve ambians yoğunluğuna dönüştürülür. Aydınlatma panelindeki ışık gradyan ve ambians ayarları şunlardır:

ay-panel

Bir düşüm ambiansı kaynağı tümüyle CPU üzerinde halledilebilir. Performans açısından oldukça verimlidir ve size neredeyse full skyboxtan ayırtedilemeyecek bir sonuç verir.

gid

Çevre aydınlatmasını güncellemek için kullanılan en sade kod şu şekildedir.:

 

[csharp]
using System;
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

[ExecuteInEditMode]
public class EnvironmentUpdater : MonoBehaviour {

public Gradient groundGradient, equatorGradient, skyGradient;
private TimeOfDayManager m_TimeOfDayManager;

void OnEnable () {
m_TimeOfDayManager = FindObjectOfType<timeofdaymanager> ();
}

void Update () {
float currentTime = m_TimeOfDayManager.time;
RenderSettings.ambientGroundColor = groundGradient.Evaluate(currentTime);
RenderSettings.ambientEquatorColor = equatorGradient.Evaluate(currentTime);
RenderSettings.ambientSkyColor = skyGradient.Evaluate(currentTime);
}
}
[/csharp]

emici

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir