View Categories

Başlarken

14 dakika okuma

Bu sayfa, Uygulama SDK’sına hızlı bir genel bakış sunar ve sizi fotogerçekçi görüntüleme konusuyla tanıştırır.

I. Giriş #


V-Ray Uygulama SDK’sı, üçüncü taraf entegratörlerin V-Ray motorunu kullanan bir işleme sürecini başlatmasına ve kontrol etmesine olanak tanır. Kullanıcıların,  dağıtılmış işleme kullanarak ana işlem içinde veya dışında bir V-Ray sahnesini işlemesini ve manipüle etmesini sağlayan üst düzey bir API sunar. Sahne, yerel formatın V-Ray eklentilerine çevrilmesiyle bellekte oluşturulabilir   veya başka bir uygulamadan dışa aktarılan bir dosyadan yüklenebilir.

II. Kurulum #


V-Ray Uygulama SDK’sını kullanmak için VRAY_SDK ortam değişkeninin ayarlanması gerekir. Python bağlayıcısını kullanmak için, python klasörünün Python modül yükleme yollarında (örneğin PYTHONPATH’e eklenerek ) bulunması gerekir.

`setenv` komut dosyası her iki ortam değişkenini de ayarlayacaktır. Kullanmak için ilgili komut satırı aracından çalıştırın:

  • setenv.bat (Windows)

  • setenv.sh dosyasını kaynak olarak kullan (Linux/macOS)

VRAY_SDK ayarlandığında, App SDK bağlayıcısı VRaySDKLibrary ikili dosyasını ve bağımlılıklarını VRAY_SDK/bin klasöründe arayacaktır. App SDK kullanan bir ürünün dizin yapısı ikili dosyaları /bin klasöründe içermiyorsa, VRAY_SDK yerine VRAY_APPSDK_BIN kullanılabilir . Bu durumda, App SDK bağlayıcısı ikili dosyaları doğrudan VRAY_APPSDK_BIN’in işaret ettiği klasörden yüklemeye çalışacaktır.

Ortam değişkenlerinin kullanılamadığı durumlarda, Uygulama SDK API’si arama yolunu çalışma zamanında ayarlamaya olanak tanır. Lütfen ilgili bağlama için API dokümantasyonunu okuyun.

III. Paket İçeriği #


  • bin – V-Ray çekirdek ikili dosyaları. V-Ray Uygulama SDK kütüphanesini içerir.

  • cpp – C++ başlık dosyaları

  • dotnet – .NET Framework 4.0 (Mono) V-Ray Uygulama SDK DLL’leri

  • dotnetcore – .NET Core 3.1 V-Ray Uygulama SDK DLL’leri

  • Örnekler – Desteklenen tüm diller için kod örnekleri

  • yardım – Çevrimdışı kullanım için SDK dokümantasyonu ve API kılavuzu

  • node – Node.JS ve Electron V-Ray Uygulama SDK modülü/bağlantısı

  • python – Python V-Ray Uygulama SDK modülü

  • sahneler – Chaos tarafından oluşturulmuş örnek sahneler

  • Araçlar – Varlıkların görüntülenmesi/dönüştürülmesi vb. için V-Ray araçları.

  • setenv.bat/sh – V-Ray Uygulama SDK’sını çalıştırmak için yerel bir ortam kuran betik. Kullanmak için, komut penceresinde bir betik çalıştırın (bash’te “source setenv.sh” kullanın). Bu, SDK tarafından ihtiyaç duyulan ortam değişkenlerini güncelleyecektir.

IV. Temel İşleme #


V-Ray Uygulama SDK’sı, herhangi bir render işlemini başlatan ve kontrol eden bir VRayRenderer sınıfı sunar. Bu sınıf, bir V-Ray sahnesi oluşturmak veya yüklemek ve render etmek için üst düzey yöntemler tanımlar. V-Ray motorunun iç karmaşıklıklarını gizlerken, güçlü yeteneklerini korur.

Render işlemine başlamanın temel iş akışı genellikle aşağıdaki adımlardan oluşur:

  • Yapılandırılabilir VRayRenderer sınıfının örneği oluşturuluyor.

  • Aşağıdakilerden herhangi biri (veya bunların bir kombinasyonu):

  • Oluşturma işlemi için yöntemi çağırma

  • Görüntünün kullanılabilir hale gelmesi bekleniyor.

  • VRayRenderer’ı kapatarak bellek kaynaklarını temizleme.

VRayRenderer sınıfının tüm dil uygulamaları, şu anda yüklü olan sahnenin işlenmesini başlatmak için kullanılan bağımsız değişken içermeyen bir yöntem (start()) sunar. Bu yöntem, dahili olarak V-Ray motorunu ayrı bir iş parçacığında çalıştıran engellemeyen bir çağrıdır. Bu sayede, işleme, iş parçacığı oluşturmak için dile özgü araçlar kullanmaya gerek kalmadan, arka plan işlemi olarak rahatlıkla gerçekleştirilebilir.

VRayRenderer sınıfı, herhangi bir anda işlenmiş görüntünün mevcut durumuna erişim sağlar. İşleme süreci tamamlanmış olsun veya olmasın, işleme ilerlemesini izlemek için bir görüntü çıkarılabilir. Tüm dil bağlamaları, istek anında işlenmiş görüntü verilerini tutan bir görüntü nesnesi döndüren bir yöntem sunar. Bu görüntü sınıfı, doğrudan görüntüleme için veya işlenmiş görüntüyü desteklenen çeşitli popüler sıkıştırma biçimlerinden birinde bir dosyaya kaydetmek için kullanılabilir.

vray'i içe aktar

 

vray.VRayRenderer() ile renderer olarak:

renderer.load('intro.vrscene')

oluşturucu.başlat()

renderer.waitForRenderEnd(6000)

resim = oluşturucu.resmializeet()

resim.kaydet('intro.png')

#include "vraysdk.hpp"

VRay ad alanını kullanarak;

 

int main() {

VRayInit init(NULL, true);

VRayRenderer oluşturucu;

renderer.load("intro.vrscene");

oluşturucu.başlat();

renderer.waitForRenderEnd(6000);

LocalVRayImage image(renderer.getImage());

resim->saveToPng("intro.png");

 

0 döndür;

}

VRay kullanarak;

 

(VRayRenderer renderer = new VRayRenderer()) kullanarak

{

renderer.Load("intro.vrscene");

oluşturucu.Başlat();

renderer.WaitForRenderEnd(6000);

VRayImage image = renderer.GetImage();

resim.PNG'ye Kaydet("intro.png");

}

var vray = require('vray');

var oluşturucu = vray.VRayRenderer();

 

renderer.load('intro.vrscene', function(err) {

Eğer (hata) varsa, hata fırlat;

oluşturucu.başlat(işlev(hata) {

Eğer (hata) varsa, hata fırlat;

renderer.waitForRenderEnd(6000, function() {

var resim = renderer.getImage();

resim.kaydet('intro.png', fonksiyon() {

oluşturucu.kapat();

});

});

});

});

V. Oluşturma Modları #


V-Ray Uygulama SDK’sı, V-Ray motorunu iki farklı render modunda çalıştırma olanağı sunar Üretim ve Etkileşimli .

Üretim  modu, sahne dikkatlice yapılandırıldıktan sonra istenen nihai görüntüyü elde etmek için uygundur, çünkü tüm görüntünün kullanılabilir hale gelmesi için render işlemi çok zaman alabilir.

 Öte yandan etkileşimli mod, hızlı görüntü önizlemesi ve kademeli görüntü kalitesi iyileştirmesi için çok kullanışlıdır; bu da onu sahne ayarlarıyla denemeler yapmak, içeriği değiştirmek ve hızlı render geri bildirimi almak için mükemmel bir seçim haline getirir.

Her işleme modu iki şekilde desteklenir: CPU ve GPU. İlki işlemci kaynaklarını kullanırken, ikincisi grafik kartının işlem gücünden yararlanır. GPU işleme türü ise, GPU ile kullanılan teknolojiye bağlı olarak iki moda ayrılır: CUDA ve Optix (her ikisi de yalnızca NVIDIA).

Başlatılacak render türü, VRayRenderer nesnesinin renderMode özelliği aracılığıyla kolayca seçilebilir. VRayRenderer sınıfının varsayılan render modu Etkileşimli (CPU)’dur. Sahneyi yeniden oluşturmak veya yeniden yüklemek zorunda kalmamak için render modu render işlemleri arasında değiştirilebilir. Bu, V-Ray ile bir sahne üzerinde etkileşimli olarak çalışmanıza ve ardından herhangi bir ek yük olmadan son render için üretim moduna geçmenize olanak tanır.

vray.VRayRenderer() ile renderer olarak:

renderer.renderMode = 'production'

renderer.load('intro.vrscene')

oluşturucu.başlat()

renderer.waitForRenderEnd(6000)

resim = oluşturucu.resmializeet()

resim.kaydet('intro.png')

VRayInit init(NULL, true);

VRayRenderer oluşturucu;

renderer.setRenderMode(VRayRenderer::RenderMode::RENDER_MODE_URETION);

renderer.load("intro.vrscene");

oluşturucu.başlat();

renderer.waitForRenderEnd(6000);

LocalVRayImage image(renderer.getImage());

resim->saveToPng("intro.png");

(VRayRenderer renderer = new VRayRenderer()) kullanarak

{

renderer.RenderMode = RenderMode.PRODUCTION;

renderer.Load("intro.vrscene");

oluşturucu.Başlat();

renderer.WaitForRenderEnd(6000);

VRayImage image = renderer.GetImage();

resim.PNG'ye Kaydet("intro.png");

}

var oluşturucu = vray.VRayRenderer();

renderer.renderMode = 'production';

renderer.load('intro.vrscene', function(err) {

Eğer (hata) varsa, hata fırlat;

oluşturucu.başlat(işlev(hata) {

Eğer (hata) varsa, hata fırlat;

renderer.waitForRenderEnd(6000, function() {

var resim = renderer.getImage();

resim.kaydet('intro.png', fonksiyon() {

oluşturucu.kapat();

});

});

});

});

VI. Ortak Etkinlikler #


Arka planda ayrı bir iş parçacığında çalışan işleme süreci sırasında V-Ray,  Uygulama SDK kullanıcılarının erişebileceği bir dizi olay yayar. Bu olaylara ana VRayRenderer sınıfı aracılığıyla abone olabilirsiniz.

V-Ray Uygulama SDK’sı, bir olay meydana geldiğinde özel istemci mantığını yürüten geri çağırma işlevlerini ekleme olanağı sağlar. Geri çağırma işlevlerinin kodu, ana V-Ray işleme iş parçacığından farklı bir ayrı iş parçacığında yürütülür. Bu tasarım, V-Ray işleme sürecinin ek yük olmadan hızlı kalmasını sağlar ve istemci geri çağırma kodundaki yavaş işlemlerin toplam işleme süresini etkilememesini garanti eder. Yavaş kullanıcı geri çağırma işlevlerinin diğer geri çağırma işlevlerinin yürütülmesini geciktirebileceğini unutmayın. Her geri çağırma işlevi, olayın meydana geldiği tam zamanı veren bir zaman ‘anlık’ argümanı içerir. Geri çağırma işlevinin kendisi, kuyruğa alma ve eşzamansız olma nedeniyle fark edilir derecede farklı bir anda yürütülebilir.

Olaylar  genel olarak üç tipe ayrılabilir: tüm işleme modları için ortak olan olaylar, kova işleme (bucket rendering) için özel olaylar ve aşamalı işleme (progressive rendering) için özel olaylar. Bu bölüm, örnekleme türünden bağımsız olarak yayılan olayları kapsamaktadır 

Ortak render olayları şu durumlarda meydana gelir:

  • Oluşturucunun durumu değişir (örneğin, oluşturmaya başlar, oluşturmayı durdurur).

  • V-Ray, render işleminden önce ve işlem sırasında metin mesajları üretir.

  • V-Ray mevcut görevi değiştirir (örneğin yükleme, render alma) ve ilerleme yüzdesini bildirir.


Eyalet Değişikliği Olayı #

Durum değişikliği olayı, render işlemine başlanırken, görüntü tamamlandığında veya bir hata oluşup durduğunda olduğu gibi, render motoru bir durumdan diğerine geçtiğinde her seferinde tetiklenir. Bu, render işlemlerini başlatma ve tamamlama ile ilgili kullanıcı mantığını uygulamak için ana noktadır.

Asenkron start() yöntemi yerine startSync() kullanılmadığı sürece, PREPARING durumundayken sahnede ve render motorunda herhangi bir değişiklik yapılmamalıdır. Değişiklik yapma girişimleri reddedilecektir.

Son görüntü, render işlemi IDLE_DONE durumuna geçtiğinde kullanılabilir. Render işlemi sırasında ara görüntüler de mevcuttur.

def onStateChanged(oluşturucu, oldState, newState, anlık):

print('Durum şuradan şuraya değişti:', oldState, 'yeniDurum')

 

vray.VRayRenderer() ile renderer olarak:

renderer.setOnStateChanged(onStateChanged)

renderer.load('intro.vrscene')

oluşturucu.başlat()

renderer.waitForRenderEnd(6000)

void onStateChanged(VRayRenderer& renderer, RendererState oldState, RendererState newState, double instant, void* userData) {

printf("Durum %d'den %d'ye değişti\")

", eskiDurum, yeniDurum);

}

 

int main() {

VRayInit init(NULL, true);

VRayRenderer oluşturucu;

renderer.setOnStateChanged(onStateChanged);

renderer.load("intro.vrscene");

oluşturucu.başlat();

renderer.waitForRenderEnd(6000);

0 döndür;

}

(VRayRenderer renderer = new VRayRenderer()) kullanarak

{

renderer.StateChanged += new EventHandler<StateChangedEventArgs>((source, e) =>

{

Console.WriteLine("Durum {0}'dan {1}'e değişti", e.OldState, e.NewState);

});

renderer.Load("intro.vrscene");

oluşturucu.Başlat();

renderer.WaitForRenderEnd(6000);

}

var oluşturucu = vray.VRayRenderer();

renderer.on('stateChanged', function(oldState, newState, instant) {

console.log('Durum ' + oldState + 'den ' + newState + 'e değişti');

});

renderer.load('intro.vrscene', function(err) {

Eğer (hata) varsa, hata fırlat;

oluşturucu.başlat(işlev(hata) {

Eğer (hata) varsa, hata fırlat;

renderer.waitForRenderEnd(6000, function() {

oluşturucu.kapat();

});

});

});

Günlük Mesajı Olayı #

Çıkış mesajları, sahne yükleme ve işleme sırasında V-Ray motoru tarafından üretilir ve mesaj günlüğü olayına abone olunarak yakalanabilir. Bir mesaj günlüğe kaydedildiğinde kullanılabilir hale gelen geri bildirim verileri, mesajın metni ve günlük düzeyi türüdür (bilgi, uyarı veya hata).

def onLogMessage(renderer, message, level, instant):

if level == vray.LOGLEVEL_ERROR:

print("[HATA]", mesaj)

elif level == vray.LOGLEVEL_WARNING:

print("[Uyarı]", mesaj)

elif level == vray.LOGLEVEL_INFO:

print("[bilgi]", mesaj)

# Test amaçlı olarak yorum satırını kaldırın, ancak gerçek kodda bunları göz ardı etmek isteyebilirsiniz.

#else: print("[debug]", message)

vray.VRayRenderer() ile renderer olarak:

renderer.setOnLogMessage(onLogMessage)

# ...

void onLogMessage(VRayRenderer &renderer, const char* message, MessageLevel level, double instant, void* userData) {

anahtar (seviye) {

durum MesajHatası:

printf("[HATA] %s\

", mesaj);

kırmak;

durum MesajUyarı:

printf("[Uyarı] %s\

", mesaj);

kırmak;

durum MesajBilgisi:

printf("[bilgi] %s\

", mesaj);

kırmak;

durum MesajHata Ayıklama:

// Test amaçlı olarak yorum satırını kaldırın, ancak gerçek kodda bunları göz ardı etmek isteyebilirsiniz.

//printf("[debug] %s\

", mesaj);

kırmak;

}

}

 

int main() {

VRayInit init(NULL, true);

VRayRenderer oluşturucu;

renderer.setOnLogMessage(onLogMessage);

// ...

0 döndür;

}

(VRayRenderer renderer = new VRayRenderer()) kullanarak

{

renderer.LogMessage += new EventHandler<MessageEventArgs>((source, e) =>

{

// Test amaçlı olarak if koşulunu kaldırabilirsiniz, ancak gerçek kodda Debug'ı göz ardı etmek isteyebilirsiniz.

eğer (e.LogLevel != LogLevelType.Debug)

{

Console.WriteLine(String.Format("[{0}] {1}", e.LogLevel.ToString(), e.Message));

}

});

 

// ...

}

var oluşturucu = vray.VRayRenderer();

 

renderer.on('logMessage', function(message, level, instant) {

if (level == vray.LOGLEVEL_ERROR)

console.log("[HATA] ", mesaj);

aksi takdirde eğer (seviye == vray.LOGLEVEL_WARNING)

console.log("[Uyarı] ", message);

aksi takdirde eğer (seviye == vray.LOGLEVEL_INFO)

console.log("[bilgi] ", mesaj);

// Test amaçlı olarak yorum satırını kaldırın, ancak gerçek kodda bunları göz ardı etmek isteyebilirsiniz.

//else console.log("[debug] ", message);

});

 

// ...

İlerleme Olayı #

İlerleme olayları, mevcut görev değiştiğinde ve tamamlanan iş miktarı arttığında tetiklenir. Bu olaylar, mevcut görevin adını ve yapılacak toplam iş miktarı ile tamamlanan iş miktarını gösteren iki rakamı içeren kısa bir mesaj içerir.

İşte ilerlemeyi yüzde olarak nasıl raporlayacağınıza dair kısa örnekler:

def printProgress(renderer, msg, progress, total, instant):

print('İlerleme: {0} {1}%'.format(msg, round(100.0 * progress / total, 2)))

 

vray.VRayRenderer() ile renderer olarak:

renderer.setOnProgress(printProgress)

# render ...

void printProgress(VRay::VRayRenderer &renderer, const char* message, int progress, int total, double instant, void* userData) {

printf("İlerleme: %s %.2f%%\")

", mesaj, 100.0 * ilerleme / toplam);

}

 

int main() {

// ...

renderer.setOnProgress(printProgress);

// render ...

}

renderer.Progress += new EventHandler<ProgressEventArgs>((source, e) =>

{

Console.WriteLine(String.Format("İlerleme: {0} {1}%", e.Message, 100.0 * e.Progress / e.Total));

});

// render ...

var printProgress = function(message, progress, total, instant) {

console.log('İlerleme: ' + message + (100.0 * progress / total).toFixed(2) + '%');

});

renderer.on('progress', printProgress);

// render ...

VII. Kova Olayları #


Üretim modunda iki tür görüntü örnekleme yöntemi vardır: “kova” örnekleme ve aşamalı örnekleme. Kova işleme, görüntüyü küçük dikdörtgen alt görüntülere böler ve her biri farklı bir yerel CPU iş parçacığı veya ağ sunucusu tarafından bağımsız olarak işlenir ( Dağıtılmış İşleme bölümüne bakın). Alt görüntüler yalnızca tamamen hazır olduğunda döndürülür. Aşamalı işleme, Etkileşimli moddakiyle aynı şekilde çalışır; tüm görüntü örneklenir ve her örnekleme geçişi için görüntüler döndürülür, böylece her geçişte gürültü azaltılır. Bu bölüm, yalnızca Üretim kova işlemesine özgü olayları kapsar. Aşamalı örnekleme modu, aşağıda Aşamalı Olaylar bölümünde açıklanan olayı yayar.

Üretim ortamında görüntü oluşturma işleminde iki aşama vardır: bir görüntü kovasının bir oluşturma sunucusuna (veya yerel iş parçacığına) atanması ve görüntünün atanan bölgesinin oluşturulması. Bu nedenle, görüntünün her bir kovası için iki olay tetiklenir: bir kovanın başlatılması ve görüntü sonucunun alınması. API kullanıcıları, ana VRayRenderer sınıfı aracılığıyla bu olaylara abone olabilirler.

Üretim kova modunda görüntü, dikdörtgen bölgelerden oluşan bir ızgara, yani “kovalar” olarak algılanır. Kova, sol üst köşesinin koordinatları ve dikdörtgen bölgesinin genişliği ve yüksekliği ile benzersiz bir şekilde tanımlanır. Tüm görüntünün sol üst köşesinin koordinatları (0, 0)’dır.

Kova örneklemesini etkinleştirmek için, VRayRenderer’ın render modu  production olmalı  ve  SettingsImageSampler::type=1 olarak ayarlanmalıdır .


Kova Başlatma Olayı #

Ana V-Ray iş parçacığı bir ağ render sunucusuna veya yerel iş parçacığına bir kova atadığında kova başlatma olayı tetiklenir. Bu olay için sağlanan geri çağrı verileri, kova boyutu ve koordinatlarının yanı sıra ağda göründüğü şekliyle render sunucusunun adıdır (varsa).

def onBucketInit(renderer, bucket, passType, instant):

print('Başlangıç ​​kovası:')

print('\ x: ', bucket.x)

print('\ y: ', bucket.y)

print('\ genişlik: ', bucket.width)

print('\ yükseklik:', bucket.height)

print('\ host:', bucket.host)

 

vray.VRayRenderer() ile renderer olarak:

renderer.renderMode = 'production'

renderer.setOnBucketInit(onBucketInit)

 

renderer.load('intro.vrscene')

# Örnekleyici türünü adaptive(buckets) olarak ayarlayın.

sis = renderer.classes.SettingsImageSampler.getInstanceOrCreate()

sis.type = 1

# Kovaları doğrudan alabilmek için hafif önbelleği devre dışı bırakın.

sgi = renderer.classes.SettingsGI.getInstanceOrCreate()

sgi.secondary_engine = 2

oluşturucu.başlat()

oluşturucu.bekleRenderSonu()

VRay ad alanını kullanarak;

VRay::Plugins ad alanını kullanarak;

void onBucketInit(VRayRenderer& renderer, int x, int y, int width, int height

, const char* host, ImagePassType pass, double instant, void* userData) {

printf("Başlangıç ​​kovası:\")

");

printf("\ x: %d\

", X);

printf("\ y: %d\

", y);

printf("\ genişlik: %d\

", Genişlik);

printf("\ yükseklik: %d\

", yükseklik);

printf("\ ana bilgisayar: %s\

", ev sahibi);

}

int main() {

VRayInit init(NULL, true);

VRayRenderer oluşturucu;

renderer.setRenderMode(VRayRenderer::RenderMode::RENDER_MODE_URETION);

renderer.setOnBucketInit(onBucketInit);

renderer.load("intro.vrscene");

// Örnekleyici türünü uyarlanabilir (kovalar) olarak ayarlayın.

SettingsImageSampler sis = renderer.getInstanceOrCreate<SettingsImageSampler>();

sis.set_type(1);

// LC hesaplamasını durdurun, böylece grupları hemen elde edelim.

SettingsGI sgi = renderer.getInstanceOrCreate<SettingsGI>();

sgi.set_secondary_engine(2);

oluşturucu.senkronizasyonubaşlat();

renderer.waitForRenderEnd();

0 döndür;

}

VRay kullanarak;

VRay.Plugins kullanılarak;

(VRayRenderer renderer = new VRayRenderer()) kullanarak

{

renderer.RenderMode = RenderMode.PRODUCTION;

renderer.BucketInit += new EventHandler<BucketRegionEventArgs>((source, e) =>

{

Console.WriteLine("Kova başlatılıyor:");

Console.WriteLine("\ x:" + eX);

Console.WriteLine("\ y:" + eY);

Console.WriteLine("\ genişlik:" + e.Width);

Console.WriteLine("\ yükseklik:" + e.Height);

Console.WriteLine("\ host:" + e.Host);

});

 

renderer.Load("intro.vrscene");

// Örnekleyici türünü uyarlanabilir (kovalar) olarak ayarlayın.

SettingsImageSampler sis = renderer.GetInstanceOrCreate<SettingsImageSampler>();

sis.SettingsImageSamplerType = 1;

// LC hesaplamasını durdurun, böylece grupları hemen elde edelim.

SettingsGI sgi = renderer.GetInstanceOrCreate<SettingsGI>();

sgi.SecondaryEngine = 2;

oluşturucu.Başlat();

oluşturucu.RenderSonundaBekle();

}

var oluşturucu = vray.VRayRenderer();

renderer.renderMode = 'production';

 

renderer.on('bucketInit', function(region, passType, instant) {

console.log('Kova başlatılıyor:');

console.log('\ x:' + region.x);

console.log('\ y:' + region.y);

console.log('\ genişlik:' + region.width);

console.log('\ yükseklik:' + region.height);

console.log('\ host:' + region.host);

});

 

renderer.load('intro.vrscene', function(err) {

Eğer (hata) varsa, hata fırlat;

// Örnekleyici türünü adaptive(buckets) olarak ayarlayın.

var sis = renderer.classes.SettingsImageSampler.getInstanceOrCreate();

sis.type = 1;

// Kovaları doğrudan alabilmek için hafif önbelleği devre dışı bırakıyoruz.

var sgi = renderer.classes.SettingsGI.getInstanceOrCreate();

sgi.secondary_engine = 2;

oluşturucu.başlat(işlev(hata) {

Eğer (hata) varsa, hata fırlat;

renderer.waitForRenderEnd(function() {

oluşturucu.kapat();

});

});

});

Kova Hazır Etkinliği #

“Bucket ready” olayı, kendisine bir “bucket” atanmış olan render sunucusunun görüntünün ilgili bölümünü işlemeyi bitirip sonucunu ana V-Ray iş parçacığına gönderdiğinde tetiklenir. Olay için döndürülen geri bildirim verileri, bölgenin boyutunu ve koordinatlarını, render sunucusunun adını ve üretilen görüntüyü içerir.

def onBucketReady(renderer, bucket, passType, instant):

'Kova hazır:' yazdır

print('\ x: ', bucket.x)

print('\ y: ', bucket.y)

print('\ genişlik: ', bucket.width)

print('\ yükseklik:', bucket.height)

print('\ host:', bucket.host)

 

dosyaAdı = 'intro-{0}-{1}.png'.format(kova.x, kova.y)

kova.kaydet(dosyaAdı)

 

vray.VRayRenderer() ile renderer olarak:

renderer.renderMode = 'production'

renderer.setOnBucketReady(onBucketReady)

 

renderer.load('intro.vrscene')

# Örnekleyici türünü adaptive(buckets) olarak ayarlayın.

sis = renderer.classes.SettingsImageSampler.getInstanceOrCreate()

sis.type = 1

# Kovaları doğrudan alabilmek için hafif önbelleği devre dışı bırakın.

sgi = renderer.classes.SettingsGI.getInstanceOrCreate()

sgi.secondary_engine = 2

oluşturucu.başlat()

oluşturucu.bekleRenderSonu()

VRay ad alanını kullanarak;

VRay::Plugins ad alanını kullanarak;

 

void onBucketReadyCallback(VRayRenderer& renderer, int x, int y, const char* host

, VRayImage* image, ImagePassType pass, double instant, void* userData) {

printf("Kova hazır:\")

");

printf("\ x: %d\

", X);

printf("\ y: %d\

", y);

printf("\ genişlik: %d\

", image->getWidth());

printf("\ yükseklik: %d\

", image->getHeight());

printf("\ ana bilgisayar: %s\

", ev sahibi);

 

karakter dosya adı[64];

sprintf(fileName, "intro-%d-%d.png", x, y);

resim->Png'ye kaydet(dosyaAdı);

}

int main() {

VRayInit init(NULL, true);

 

VRayRenderer oluşturucu;

renderer.setRenderMode(VRayRenderer::RenderMode::RENDER_MODE_URETION);

renderer.setOnBucketReady(onBucketReadyCallback);

 

renderer.load("intro.vrscene");

// Örnekleyici türünü uyarlanabilir (kovalar) olarak ayarlayın.

SettingsImageSampler sis = renderer.getInstanceOrCreate<SettingsImageSampler>();

sis.set_type(1);

// LC hesaplamasını durdurun, böylece grupları hemen elde edelim.

SettingsGI sgi = renderer.getInstanceOrCreate<SettingsGI>();

sgi.set_secondary_engine(2);

oluşturucu.senkronizasyonubaşlat();

renderer.waitForRenderEnd();

0 döndür;

}

VRay kullanarak;

VRay.Plugins kullanılarak;

(VRayRenderer renderer = new VRayRenderer()) kullanarak

{

renderer.RenderMode = RenderMode.PRODUCTION;

renderer.BucketReady += new EventHandler<BucketImageEventArgs>((source, e) =>

{

Console.WriteLine("Kova hazır:");

Console.WriteLine("\ x:" + eX);

Console.WriteLine("\ y:" + eY);

Console.WriteLine("\ genişlik:" + e.Width);

Console.WriteLine("\ yükseklik:" + e.Height);

Console.WriteLine("\ host:" + e.Host);

 

VRayImage image = e.Image;

image.SaveToPNG(string.Format("intro-{0}-{1}.png", eX, eY));

resim.Dispose();

});

 

renderer.Load("intro.vrscene");

// Örnekleyici türünü uyarlanabilir (kovalar) olarak ayarlayın.

SettingsImageSampler sis = renderer.GetInstanceOrCreate<SettingsImageSampler>();

sis.SettingsImageSamplerType = 1;

// LC hesaplamasını durdurun, böylece grupları hemen elde edelim.

SettingsGI sgi = renderer.GetInstanceOrCreate<SettingsGI>();

sgi.SecondaryEngine = 2;

 

oluşturucu.Başlat();

oluşturucu.RenderSonundaBekle();

}

var oluşturucu = vray.VRayRenderer();

renderer.renderMode = 'production';

 

renderer.on('bucketReady', function(bucket, passType, instant) {

console.log('Kova hazır:');

console.log('\ x:' + bucket.x);

console.log('\ y:' + bucket.y);

console.log('\ genişlik:' + bucket.width);

console.log('\ yükseklik:' + bucket.height);

console.log('\ host:' + bucket.host);

 

var fileName = 'intro-' + bucket.x + '-' + bucket.y + '.png'

kova.kaydet(dosyaAdı, fonksiyon() {

kova.kapat();

});

});

 

renderer.load('intro.vrscene', function(err) {

Eğer (hata) varsa, hata fırlat;

// Örnekleyici türünü adaptive(buckets) olarak ayarlayın.

var sis = renderer.classes.SettingsImageSampler.getInstanceOrCreate();

sis.type = 1;

// Kovaları doğrudan alabilmek için hafif önbelleği devre dışı bırakıyoruz.

var sgi = renderer.classes.SettingsGI.getInstanceOrCreate();

sgi.secondary_engine = 2;

oluşturucu.başlat(işlev(hata) {

Eğer (hata) varsa, hata fırlat;

renderer.waitForRenderEnd(function() {

oluşturucu.kapat();

});

});

});

VIII. Aşamalı Olaylar #


Etkileşimli modda veya üretim modunda, görüntü örnekleyicisi kademeli örnekleme (kovalar yerine) için ayarlanmışken render işlemi yapılırken, tüm görüntü aynı anda örneklenir ve her örnekleme geçişi için daha rafine bir görüntüyle progressiveImageUpdated olayı tetiklenir. Etkileşimli modun amacı, kullanıcıların yapılandırdıkları sahne için hızlı geri bildirim almalarını sağlamaktır. Etkileşimli render işlemi başladığında gürültülü görüntüler hızla kullanılabilir hale gelir.

sayaç = 0

 

def onImageUpdated(renderer, image, index, passType, instant):

küresel sayaç

sayaç += 1

dosyaAdı = 'intro-{0}.jpeg'.format(sayaç)

resim.kaydet(dosyaAdı)

 

vray.VRayRenderer() ile renderer olarak:

renderer.setOnProgressiveImageUpdated(onImageUpdated)

 

renderer.load('intro.vrscene')

oluşturucu.başlat()

oluşturucu.bekleRenderSonu()

tamsayı sayacı = 0;

 

void onImageUpdated(VRayRenderer& renderer, VRayImage* image

, unsigned long long index, ImagePassType passType, double instant, void* userData) {

karakter dosya adı[64];

sprintf(fileName, "intro-%d.jpeg", ++counter);

resim->dosyaAdı'naJpeg olarak kaydet;

}

int main() {

VRayInit init(NULL, true);

VRayRenderer oluşturucu;

renderer.setOnProgressiveImageUpdated(onImageUpdated);

 

renderer.load("intro.vrscene");

oluşturucu.senkronizasyonubaşlat();

renderer.waitForRenderEnd();

0 döndür;

}

(VRayRenderer renderer = new VRayRenderer()) kullanarak

{

tamsayı sayacı = 0;

renderer.ProgressiveImageUpdated += new EventHandler<VRayImageEventArgs>((source, e) =>

{

string fileName = string.Format("intro-{0}.jpeg", ++counter);

e.Image.SaveToJPEG(fileName);

e.Image.Dispose();

});

 

renderer.Load("intro.vrscene");

oluşturucu.Başlat();

oluşturucu.RenderSonundaBekle();

}

var oluşturucu = vray.VRayRenderer();

 

var sayaç = 0;

renderer.on('progressiveImageUpdated', function(image, index, passType, instant) {

var fileName = 'intro-' + (++counter) + '.jpeg';

resim.kaydet(dosyaAdı, fonksiyon() {

resim.kapat();

});

});

 

renderer.load('intro.vrscene', function(err) {

Eğer (hata) varsa, hata fırlat;

oluşturucu.başlat(işlev(hata) {

Eğer (hata) varsa, hata fırlat;

renderer.waitForRenderEnd(function() {

oluşturucu.kapat();

});

});

});

IX. V-Ray Görüntüleri #


VRayImage sınıfı, V-Ray tarafından oluşturulan görüntülere erişim sağlar. VRayRenderer tarafından ve bir olay meydana geldiğinde çağrılan geri çağırma işlevlerinin bazı argümanları tarafından kullanılır. VRayImage sınıfı, alınan ikili görüntü verilerini işlemek için yardımcı işlevler sağlar. İkili veriler, kanal başına tam 32 bit kayan noktalı biçimdedir ve doğrudan erişilebilir; ancak en popüler 8 bit biçimlerinden (BMP, JPEG, PNG) birkaçında sıkıştırma yapan kolaylık yöntemleri de mevcuttur. EXR ve diğer yüksek dinamik aralıklı biçimlerin kaydedilmesi de başka bir API aracılığıyla mümkündür: VRayRenderer.vfb.saveImage().

VRayImage sınıfı tarafından sunulan yöntemler iki türdedir. Birinci grup yöntemler doğrudan sıkıştırılmış görüntünün baytlarını döndürürken, ikinci grup görüntüyü sıkıştırır ve bir dosyaya kaydeder.

vray.VRayRenderer() ile renderer olarak:

renderer.load('intro.vrscene')

oluşturucu.başlat()

renderer.waitForRenderEnd(6000)

 

resim = oluşturucu.resmializeet()

veri = resim.sıkıştır(tür='png')

'intro_compressTo.png' dosyasını 'wb' olarak açıp outStream olarak kaydediyoruz:

outStream.write(data)

resim.kaydet("intro_saveTo.png")

VRayInit init(NULL, true);

VRayRenderer oluşturucu;

renderer.load("intro.vrscene");

oluşturucu.senkronizasyonubaşlat();

renderer.waitForRenderEnd(6000);

 

VRayImage* image = renderer.getImage();

size_t imageSize;

Png* png = image->compressToPng(imageSize);

ofstream çıktıStream("intro_compressTo.png", ofstream::binary);

outputStream.write((char*)png->getData(), imageSize);

outputStream.close();

png dosyasını sil;

bool res = image->saveToPng("intro_saveTo.png");

Resmi sil;

(VRayRenderer renderer = new VRayRenderer()) kullanarak

{

renderer.Load("intro.vrscene");

oluşturucu.Başlat();

renderer.WaitForRenderEnd(6000);

 

(VRayImage image = renderer.GetImage()) kullanarak

{

byte[] data = image.CompressToPNG();

(FileStream outStream = new FileStream("intro_compressTo.png", FileMode.Create, FileAccess.Write))

{

outStream.Write(data, 0, data.Length);

}

resim.PNG'yeKaydet("intro_saveTo.png");

}

}

var fs = require('fs');

var oluşturucu = vray.VRayRenderer();

 

renderer.load('intro.vrscene', function(err) {

Eğer (hata) varsa, hata fırlat;

oluşturucu.başlat(işlev(hata) {

Eğer (hata) varsa, hata fırlat;

renderer.waitForRenderEnd(6000, function () {

var resim = renderer.getImage();

resim.sıkıştır('png', fonksiyon (hata, tampon) {

Eğer (hata) varsa, hata fırlat;

fs.writeFile('intro_compressTo.png', buffer, function () {

resim.kaydet('intro_saveTo.png', fonksiyon () {

oluşturucu.kapat();

});

});

});

});

});

});

VRayImage sınıfının tüm örnekleri, örnek tarafından tutulan bellek kaynaklarının serbest bırakılması için kapatılmalıdır. Görüntüyle çalışmayı bitirdiğinizde kaynakları her zaman serbest bırakmanız (görüntüyü kapatmanız) önerilir. Çöp toplama mekanizmasını destekleyen platformlar, kullanıcının alınan görüntüyü kapatmaması durumunda dahili olarak tutulan kaynakların serbest bırakılmasını otomatik olarak halleder.


Küçültme #

Sıkıştırma için yardımcı yöntemlere ek olarak, VRayImage sınıfı, alınan görüntüyü daha küçük bir boyuta yeniden boyutlandıran küçültme işlemlerini de destekler. Küçültme işlemlerinin sonucu, sınıfın tüm yardımcı yöntemlerine sahip başka bir VRayImage örneğidir.

vray.VRayRenderer() ile renderer olarak:

renderer.load('intro.vrscene')

oluşturucu.başlat()

renderer.waitForRenderEnd(6000)

 

resim = oluşturucu.resmializeet()

küçültülmüş = resim.getDownscaled(260, 180)

küçültülmüş.kaydet('intro.png')

VRayInit init(NULL, true);

VRayRenderer oluşturucu;

renderer.load("intro.vrscene");

oluşturucu.başlat();

renderer.waitForRenderEnd(6000);

 

// LocalVRayImage, yığın üzerinde oluşturulacak ve görüntünün otomatik olarak silinmesini sağlayacak bir VRayImage varyasyonudur.

LocalVRayImage image = renderer.getImage();

LocalVRayImage küçültülmüş = image->getDownscaled(260, 180);

küçültülmüş->saveToPng("intro.png");

(VRayRenderer renderer = new VRayRenderer()) kullanarak

{

renderer.Load("intro.vrscene");

oluşturucu.Başlat();

renderer.WaitForRenderEnd(6000);

 

(VRayImage image = renderer.GetImage()) kullanarak

{

(VRayImage'ı küçültülmüş halini kullanarak = image.GetDownscaled(260, 180))

{

küçültülmüş.SaveToPNG("intro.png");

}

}

}

var oluşturucu = vray.VRayRenderer();

 

renderer.load('intro.vrscene', function (err) {

Eğer (hata) varsa, hata fırlat;

oluşturucu.başlat(işlev(hata) {

Eğer (hata) varsa, hata fırlat;

renderer.waitForRenderEnd(6000, function () {

var resim = renderer.getImage();

resim.getDownscaled(260, 180, function(downscaled) {

küçültülmüş.kaydet('intro.png', fonksiyon() {

downscaled.close(); // Zorunlu değil, çöp toplayıcıya bırakılabilir

resim.kapat(); // Zorunlu değil, çöp toplayıcıya bırakılabilir

oluşturucu.kapat();

});

});

});

});

});

Görüntü Boyutunu Değiştirme #

Oluşturulan görüntünün boyutu, VRayRenderer sınıfının `size` özelliği aracılığıyla kontrol edilebilir. Bir “.vrscene” dosyası yüklendiğinde, VRayRenderer boyutu dosya yüklendikten sonra ayarlanarak geçersiz kılınmadığı sürece, bu sahne dosyasında tanımlanan boyut kullanılır.

vray.VRayRenderer() ile renderer olarak:

renderer.load('intro.vrscene')

oluşturucu.boyutu = (640, 360)

oluşturucu.başlat()

renderer.waitForRenderEnd(6000)

resim = oluşturucu.resmializeet()

resim.kaydet('intro.png')

VRayInit init(NULL, true);

VRayRenderer renderer();

renderer.load("intro.vrscene");

renderer.setImageSize(640, 360);

oluşturucu.başlat();

renderer.waitForRenderEnd(6000);

LocalVRayImage image = renderer.getImage();

resim->saveToPng("intro.png");

(VRayRenderer renderer = new VRayRenderer()) kullanarak

{

renderer.Load("intro.vrscene");

renderer.SetImageSize(640, 360);

oluşturucu.Başlat();

renderer.WaitForRenderEnd(6000);

(VRayImage image = renderer.GetImage()) kullanarak

{

resim.PNG'ye Kaydet("intro.png");

}

}

var oluşturucu = vray.VRayRenderer();

renderer.load('intro.vrscene', function(err) {

Eğer (hata) varsa, hata fırlat;

renderer.size = {width: 640, height: 360};

oluşturucu.başlat(işlev(hata) {

Eğer (hata) varsa, hata fırlat;

renderer.waitForRenderEnd(6000, function() {

var resim = renderer.getImage();

resim.kaydet('intro.png', fonksiyon() {

resim.kapat();

oluşturucu.kapat();

});

});

});

});

X. Öğeleri Oluştur #


V-Ray Render Elemanları (Render Kanalları veya Rastgele Çıkış Değişkenleri, AOV’ler olarak da bilinir), 3 elemanlı renk, tekli kayan noktalı sayılar veya tamsayılar olarak kodlanmış çeşitli render verisi türlerini içeren görüntülerdir. Bunlardan bazıları Z derinliği, yüzey normali, UV koordinatları, hız, aydınlatma, yansımalar vb.dir. Her V-Ray sahnesi, rastgele sayıda render elemanı (kanal olarak da adlandırılır) içerebilir. Her kanal, her zaman etkin olan RGB ve Alfa kanalları hariç, benzersiz bir eklenti tarafından etkinleştirilir.

Geçerli sahnedeki render öğelerine erişmek için, sahnenin yüklendiği VRayRenderer örneğini kullanın. Her render öğesinin verileri, VRayImage olarak veya ham veri (bayt, tamsayı veya ondalık sayı tamponları olarak) olarak alınabilir. İsteğe bağlı olarak, verilerin o bölümünü almak için API’lere ilgi duyulan bir alt bölge sağlayabilirsiniz.

Sahne, render öğesi eklentileri içermiyorsa, örneklerde gösterildiği gibi eklenebilirler.

# Python 2.7 ile uyumluluk.

from __future__ import print_function

# Vray paylaşımlı nesnesini içeren dizin, PYTHONPATH ortam değişkeninde bulunmalıdır.

# VRAY_SDK/python dizininden vray modülünü içe aktarmayı deneyin, eğer PYTHONPATH'te yoksa.

import sys, os

VRAY_SDK = os.environ.get('VRAY_SDK')

VRAY_SDK ise:

sys.path.append(os.path.join(VRAY_SDK, 'python'))

vray'i içe aktar

SCENE_PATH = os.path.join(os.environ.get('VRAY_SDK'), 'scenes')

# Göreceli sahne kaynaklarını yükleyebilmek için işlem çalışma dizinini SCENE_PATH olarak değiştirin.

os.chdir(SCENE_PATH)

def addExampleRenderElements(renderer):

reManager = renderer.renderElements

# Python ve JS'de dizeler kullanırız:

print('Tüm render öğesi (kanal) tanımlayıcıları:')

print(reManager.getAvailableTypes())

# RGB kanalı her zaman mevcuttur. Kompozitörler tarafından genellikle "Güzellik" olarak adlandırılır.

# Alfa her zaman dahildir

# --- GÜZELLİK UNSURLARI ---

# "Güzellik" unsurları, ana RGB kanalını oluşturan bileşenlerdir.

# Doğrudan ve dolaylı aydınlatma, yansıma ve dağınık ışık katkıları vb. gibi.

# Dağıtıcı malzemelerden (katmanlardan) yansıyan ışık

reManager.add('diffuse')

# Parlak yansımalardan gelen ışık

reManager.add('reflection')

# Kırılan ışık

reManager.add('refraction')

# Mükemmel ayna yansımalarından gelen ışık

reManager.add('specular')

# Yüzey altı dağınık ışık

reManager.add('sss')

# Kendiliğinden ışık yayan malzemelerden gelen ışık

reManager.add('self_illumination')

# Küresel aydınlatma, dolaylı aydınlatma

reManager.add('gi')

# Doğrudan aydınlatma

reManager.add('lighting')

# Tüm aydınlatmanın toplamı

reManager.add('total_light')

# Gölgeler, dağınık ışıkla birleştirildi. Gölgeli alanlar daha parlak.

reManager.add('shadow')

Yüzeyler tamamen yansıtıcı olsaydı yansıyan ışık

reManager.add('raw_reflection')

# Yüzeyler tamamen kırıcı olsaydı, ışığın kırılması

reManager.add('raw_refraction')

# Yansımalar için zayıflama faktörü. Refl = ReflFilter * RawRefl

reManager.add('reflection_filter')

# Kırılmalar için zayıflama faktörü. Refr = RefrFilter * RawRefr

reManager.add('refraction_filter')

# Yaygın filtre ile çarpılmadan önce GI'nin yoğunluğu

reManager.add('raw_gi')

# Dağınık renk içermeyen doğrudan aydınlatma

reManager.add('raw_light')

# Dağınık renk olmadan toplam ışık

reManager.add('raw_total_light')

# Dağılım faktörü olmayan gölgeler

reManager.add('raw_shadow')

# Gri tonlamalı malzeme parlaklık değerleri

reManager.add('reflection_glossiness')

# Sadece vurgular için parlaklık

reManager.add('reflection_hilight_glossiness')

# --- MATTE ÖĞELERİ ---

# Mat öğeler, kompozisyon sırasında karenin belirli bölümlerini maskelemek için kullanılır.

# Renk, malzeme kimliğine bağlıdır, MtlMaterialID eklentisine bakın.

reManager.add('material_id')

# Renk, her Düğümün objectID'sine göre belirlenir.

reManager.add('node_id')

# --- GEOMETRİK ELEMANLAR ---

# Normal ve derinlik gibi geometrik verilerin çeşitli uygulamaları vardır.

# Birleştirme ve son işlem aşamalarında.

# Saf geometrik normaller, R=X, G=Y, B=Z olarak kodlanmıştır.

reManager.add('normals')

# Kabartma haritalamasından sonraki normaller

reManager.add('bump_normals')

# Normalleştirilmiş gri tonlamalı derinlik tamponu

reManager.add('z_depth')

# Hareket eden nesnelerin kare başına hızı

reManager.add('velocity')

# Üretim render modu için bir VRayRenderer örneği oluşturun. `with` bloğundan sonra render işlemi otomatik olarak kapatılır.

vray.VRayRenderer() ile renderer olarak:

renderer.renderMode = 'production'

# Sahneyi dosyadan yükle.

renderer.load(os.path.join(SCENE_PATH, 'cornell_new.vrscene'))

 

# Bu işlem, sahneye gerekli kanal eklentilerini ekleyecektir.

addExampleRenderElements(renderer)

oluşturucu.startSync()

oluşturucu.bekleRenderSonu()

 

# Bu, dosya adlarında sonek bulunan tüm kanalları kaydedecektir.

print('>>> Tüm kanallar kaydediliyor')

renderer.vfb.saveImage('cornell_RE.png')

 

diffuseRE = renderer.renderElements.get('diffuse')

# Eğer diffuse render öğesi eksikse, değer false olarak değerlendirilecektir.

if diffuseRE:

diffusePlugin = diffuseRE.plugin

print('>>> Eklentiden ters çevrilmiş JPG kaydediliyor {0} {1}'.format(diffusePlugin.getType(), diffusePlugin.getName()))

resim = diffuseRE.getImage()

resim ise:

resim.negatifol()

resim.kaydet('cornell_inv_diffuse_VRayImage.jpg')

# Kapatıldıktan sonra kaynakları serbest bırakıldığı için oluşturucu nesne kullanılamaz hale gelir.

# Çöp toplama işlemi için serbest bırakılmalıdır.

#include "vraysdk.hpp"

#include "vrayplugins.hpp"

VRay ad alanını kullanarak;

VRay::Plugins ad alanını kullanarak;

std ad alanını kullanarak;

const char *BASE_PATH = getenv("VRAY_SDK");

string SCENE_PATH = (BASE_PATH ? string(BASE_PATH) : string(".")) + PATH_DELIMITER + "scenes";

void addExampleRenderElements(VRayRenderer &renderer) {

RenderElements reManager = renderer.getRenderElements();

// RGB kanalı her zaman mevcuttur. Kompozitörler tarafından genellikle "Güzellik" olarak adlandırılır.

// Alfa her zaman dahildir.

// Güzellik unsurları

// Dağıtıcı malzemelerden (katmanlardan) yansıyan ışık

reManager.add(RenderElement::DIFFUSE, NULL, NULL);

// Parlak yansımalardan gelen ışık

reManager.add(RenderElement::REFLECT, NULL, NULL);

// Kırılan ışık

reManager.add(RenderElement::REFRACT, NULL, NULL);

// Mükemmel ayna yansımalarından gelen ışık

reManager.add(RenderElement::SPECULAR, NULL, NULL);

// Yüzey altı saçılan ışık

reManager.add(RenderElement::SSS, NULL, NULL);

// Kendiliğinden ışık yayan malzemelerden gelen ışık

reManager.add(RenderElement::SELFILLUM, NULL, NULL);

// Genel aydınlatma, dolaylı aydınlatma

reManager.add(RenderElement::GI, NULL, NULL);

// Doğrudan aydınlatma

reManager.add(RenderElement::LIGHTING, NULL, NULL);

// Tüm aydınlatmanın toplamı

reManager.add(RenderElement::TOTALLIGHT, NULL, NULL);

// Gölgeler, dağınık ışıkla birleştirildi. Gölgeli alanlar daha parlak.

reManager.add(RenderElement::SHADOW, NULL, NULL);

// Yüzeyler tamamen yansıtıcı olsaydı yansıyan ışık

reManager.add(RenderElement::RAW_REFLECTION, NULL, NULL);

// Yüzeyler tamamen kırıcı olsaydı kırılan ışık

reManager.add(RenderElement::RAW_REFRACTION, NULL, NULL);

// Yansımalar için zayıflama faktörü. Refl = ReflFilter * RawRefl

reManager.add(RenderElement::REFLECTION_FILTER, NULL, NULL);

// Kırılmalar için zayıflama faktörü. Refr = RefrFilter * RawRefr

reManager.add(RenderElement::REFRACTION_FILTER, NULL, NULL);

// Difüz filtre ile çarpılmadan önceki GI yoğunluğu

reManager.add(RenderElement::RAWGI, NULL, NULL);

// Dağınık renk içermeyen doğrudan aydınlatma

reManager.add(RenderElement::RAWLIGHT, NULL, NULL);

// Dağınık renk olmadan toplam ışık

reManager.add(RenderElement::RAWTOTALLIGHT, NULL, NULL);

// Dağılım faktörü olmadan gölgeler

reManager.add(RenderElement::RAWSHADOW, NULL, NULL);

// Gri tonlamalı malzeme parlaklık değerleri

reManager.add(RenderElement::VRMTL_REFLECTGLOSS, NULL, NULL);

// Sadece vurgular için parlaklık ayarı

reManager.add(RenderElement::VRMTL_REFLECTHIGLOSS, NULL, NULL);

// Mat öğeler

// Renk, malzeme kimliğine bağlıdır, MtlMaterialID eklentisine bakın.

reManager.add(RenderElement::MTLID, NULL, NULL);

// Renk, her Düğümün objectID'sine göre belirlenir.

reManager.add(RenderElement::NODEID, NULL, NULL);

// Geometrik elemanlar

// Saf geometrik normaller, R=X, G=Y, B=Z olarak kodlanmıştır.

reManager.add(RenderElement::NORMALS, NULL, NULL);

// Kabartma haritalamasından sonraki normaller

reManager.add(RenderElement::BUMPNORMALS, NULL, NULL);

// Normalleştirilmiş gri tonlamalı derinlik arabelleği

reManager.add(RenderElement::ZDEPTH, NULL, NULL);

// Hareket eden nesnelerin kare başına hızı

reManager.add(RenderElement::VELOCITY, NULL, NULL);

}

int main() {

// Göreceli sahne kaynaklarını yükleyebilmek için işlem çalışma dizinini SCENE_PATH olarak değiştirin.

changeCurrentDir(SCENE_PATH.c_str());

VRayInit init(NULL, true);

VRayRenderer oluşturucu;

renderer.setRenderMode(VRayRenderer::RENDER_MODE_PRODÜKSİYON);

// Sahneyi dosyadan yükle.

renderer.load("cornell_new.vrscene");

// Bu, sahneye gerekli kanal eklentilerini ekleyecektir.

addExampleRenderElements(renderer);

oluşturucu.senkronizasyonubaşlat();

renderer.waitForRenderEnd();

// Bu, dosya adlarına sonek eklenmiş tüm kanalları kaydedecektir.

printf(">>> Tüm kanallar kaydediliyor\">

");

renderer.vfb.saveImage("cornell_RE.png");

RenderElement dağınıkRE = renderer.getRenderElements().get(RenderElement::DIFFUSE);

// Eğer diffuse render öğesi eksikse, değer false olarak değerlendirilecektir.

eğer (diffuseRE) {

Plugin diffusePlugin = diffuseRE.getPlugin();

printf(">>> Eklenti %s %s'den ters çevrilmiş JPG kaydediliyor\")

", diffusePlugin.getType(), diffusePlugin.getName());

VRayImage *image = diffuseRE.getImage();

eğer (resim) {

resim->negatifol();

resim->saveToJpeg("cornell_inv_diffuse_VRayImage.jpg");

Resmi sil;

}

}

0 döndür;

}

Sistem kullanılarak;

System.IO kullanarak;

VRay kullanarak;

VRay.Plugins kullanılarak;

ad alanı _render_elements

{

sınıf Programı

{

özel statik void addExampleRenderElements(VRayRenderer renderer)

{

RenderElements reManager = renderer.RenderElements;

/// --- "GÜZELLİK" UNSURLARI --- ///

/// "Güzellik" öğeleri, ana RGB kanalını oluşturan bileşenlerdir,

/// Doğrudan ve dolaylı aydınlatma, yansıma ve dağınık ışık katkıları vb. gibi.

// RGB kanalı her zaman mevcuttur. Kompozitörler tarafından genellikle "Güzellik" olarak adlandırılır.

// Alfa her zaman dahildir.

// Dağıtıcı malzemelerden (katmanlardan) yansıyan ışık

reManager.Add(RenderElementType.DIFFUSE, "", "");

// Parlak yansımalardan gelen ışık

reManager.Add(RenderElementType.REFLECT, "", "");

// Kırılan ışık

reManager.Add(RenderElementType.REFRACT, "", "");

// Mükemmel ayna yansımalarından gelen ışık

reManager.Add(RenderElementType.SPECULAR, "", "");

// Yüzey altı saçılan ışık

reManager.Add(RenderElementType.SSS, "", "");

// Kendiliğinden ışık yayan malzemelerden gelen ışık

reManager.Add(RenderElementType.SELFILLUM, "", "");

// Genel aydınlatma, dolaylı aydınlatma

reManager.Add(RenderElementType.GI, "", "");

// Doğrudan aydınlatma

reManager.Add(RenderElementType.LIGHTING, "", "");

// Tüm aydınlatmanın toplamı

reManager.Add(RenderElementType.TOTALLIGHT, "", "");

// Gölgeler, dağınık ışıkla birleştirildi. Gölgeli alanlar daha parlak.

reManager.Add(RenderElementType.SHADOW, "", "");

// Yüzeyler tamamen yansıtıcı olsaydı yansıyan ışık

reManager.Add(RenderElementType.RAW_REFLECTION, "", "");

// Yüzeyler tamamen kırıcı olsaydı kırılan ışık

reManager.Add(RenderElementType.RAW_REFRACTION, "", "");

// Yansımalar için zayıflama faktörü. Refl = ReflFilter * RawRefl

reManager.Add(RenderElementType.REFLECTION_FILTER, "", "");

// Kırılmalar için zayıflama faktörü. Refr = RefrFilter * RawRefr

reManager.Add(RenderElementType.REFRACTION_FILTER, "", "");

// Difüz filtre ile çarpılmadan önceki GI yoğunluğu

reManager.Add(RenderElementType.RAWGI, "", "");

// Dağınık renk içermeyen doğrudan aydınlatma

reManager.Add(RenderElementType.RAWLIGHT, "", "");

// Dağınık renk olmadan toplam ışık

reManager.Add(RenderElementType.RAWTOTALLIGHT, "", "");

// Dağılım faktörü olmadan gölgeler

reManager.Add(RenderElementType.RAWSHADOW, "", "");

// Gri tonlamalı malzeme parlaklık değerleri

reManager.Add(RenderElementType.VRMTL_REFLECTGLOSS, "", "");

// Sadece vurgular için parlaklık ayarı

reManager.Add(RenderElementType.VRMTL_REFLECTHIGLOSS, "", "");

/// --- MATTE ELEMANLARI --- ///

/// Mat öğeler, kompozisyon sırasında çerçevenin belirli bölümlerini maskelemek için kullanılır.

// Renk, malzeme kimliğine bağlıdır, MtlMaterialID eklentisine bakın.

reManager.Add(RenderElementType.MTLID, "", "");

// Renk, her Düğümün objectID'sine göre belirlenir.

reManager.Add(RenderElementType.NODEID, "", "");

/// --- GEOMETRİK ELEMANLAR --- ///

/// Normal ve derinlik gibi geometrik veriler, kompozisyon ve son işlemde çeşitli uygulamalara sahiptir.

// Saf geometrik normaller, R=X, G=Y, B=Z olarak kodlanmıştır.

reManager.Add(RenderElementType.NORMALS, "", "");

// Kabartma haritalamasından sonraki normaller

reManager.Add(RenderElementType.BUMPNORMALS, "", "");

// Normalleştirilmiş gri tonlamalı derinlik arabelleği

reManager.Add(RenderElementType.ZDEPTH, "", "");

// Hareket eden nesnelerin kare başına hızı

reManager.Add(RenderElementType.VELOCITY, "", "");

}

statik void Main(string[] args)

{

string SCENE_PATH = Path.Combine(Environment.GetEnvironmentVariable("VRAY_SDK"), "scenes");

// Göreceli sahne kaynaklarını yükleyebilmek için işlem çalışma dizinini SCENE_PATH olarak değiştirin.

Directory.SetCurrentDirectory(SCENE_PATH);

 

// Varsayılan seçeneklerle bir VRayRenderer örneği oluşturun. `using` bloğundan sonra oluşturucu otomatik olarak kapatılır.

(VRayRenderer renderer = new VRayRenderer()) kullanarak

{

renderer.RenderMode = RenderMode.PRODUCTION;

// Sahneyi dosyadan yükle.

renderer.Load("cornell_new.vrscene");

// Bu, sahneye gerekli kanal eklentilerini ekleyecektir.

addExampleRenderElements(renderer);

 

oluşturucu.Senkronizasyonu Başlat();

oluşturucu.RenderSonundaBekle();

// Bu, dosya adlarına sonek eklenmiş tüm kanalları kaydedecektir.

Console.WriteLine(">>> Tüm kanallar kaydediliyor");

renderer.Vfb.SaveImage("cornell_RE.png");

 

RenderElement diffüzRE = renderer.RenderElements.Get(RenderElementType.DIFFUSE);

Eklenti diffusePlugin = diffuseRE.Plugin;

Console.WriteLine(String.Format(">>> Eklentiden ters çevrilmiş JPG kaydediliyor {0} {1}\

", diffusePlugin.Gettype(), diffusePlugin.GetName()));

VRayImage image = diffuseRE.GetImage();

resim.NegatifYap();

image.SaveToJPEG("cornell_inv_diffuse_VRayImage.jpg");

}

// Kapatıldıktan sonra kaynakları serbest bırakıldığı için oluşturucu nesnesi kullanılamaz hale gelir.

// Çöp toplama işlemi için serbest bırakılmalıdır.

}

}

}

var yol = require('yol');

var vray = require(path.join(process.env.VRAY_SDK, 'node', 'vray'));

var SCENE_PATH = path.join(process.env.VRAY_SDK, 'scenes');

// Göreceli sahne kaynaklarını yükleyebilmek için işlem çalışma dizinini SCENE_PATH olarak değiştirin.

işlem.chdir(SCENE_PATH);

var addExampleRenderElements = işlev(oluşturucu) {

var reManager = renderer.renderElements;

// Python ve JS'de dizeler kullanırız:

console.log('Tüm render öğesi (kanal) tanımlayıcıları:');

console.log(reManager.getAvailableTypes());

// RGB kanalı her zaman mevcuttur. Kompozitörler tarafından genellikle "Güzellik" olarak adlandırılır.

// Alfa her zaman dahildir.

// --- GÜZELLİK UNSURLARI ---

// "Güzellik" öğeleri, ana RGB kanalını oluşturan bileşenlerdir.

// Doğrudan ve dolaylı aydınlatma, yansıma ve dağınık ışık katkıları gibi unsurlar.

// Dağıtıcı malzemelerden (katmanlardan) yansıyan ışık;

reManager.add('diffuse');

// Parlak yansımalardan gelen ışık

reManager.add('reflection');

// Kırılan ışık

reManager.add('refraction');

// Mükemmel ayna yansımalarından gelen ışık

reManager.add('specular');

// Yüzey altı saçılan ışık

reManager.add('sss');

// Kendiliğinden ışık yayan malzemelerden gelen ışık

reManager.add('self_illumination');

// Genel aydınlatma, dolaylı aydınlatma

reManager.add('gi');

// Doğrudan aydınlatma

reManager.add('lighting');

// Tüm aydınlatmanın toplamı

reManager.add('total_light');

// Gölgeler, dağınık ışıkla birleştirildi. Gölgeli alanlar daha parlak.

reManager.add('shadow');

// Yüzeyler tamamen yansıtıcı olsaydı yansıyan ışık

reManager.add('raw_reflection');

// Yüzeyler tamamen kırıcı olsaydı kırılan ışık

reManager.add('raw_refraction');

// Yansımalar için zayıflama faktörü. Refl = ReflFilter * RawRefl

reManager.add('reflection_filter');

// Kırılmalar için zayıflama faktörü. Refr = RefrFilter * RawRefr

reManager.add('refraction_filter');

// Difüz filtre ile çarpılmadan önceki GI yoğunluğu

reManager.add('raw_gi');

// Dağınık renk içermeyen doğrudan aydınlatma

reManager.add('raw_light');

// Dağınık renk olmadan toplam ışık

reManager.add('raw_total_light');

// Dağılım faktörü olmadan gölgeler

reManager.add('raw_shadow');

// Gri tonlamalı malzeme parlaklık değerleri

reManager.add('reflection_glossiness');

// Sadece vurgular için parlaklık ayarı

reManager.add('reflection_hilight_glossiness');

// --- MATTE ELEMANLARI ---

// Mat öğeler, kompozisyon sırasında çerçevenin belirli bölümlerini maskelemek için kullanılır.

// Renk, malzeme kimliğine bağlıdır, MtlMaterialID eklentisine bakın.

reManager.add('material_id');

// Renk, her Düğümün objectID'sine göre belirlenir.

reManager.add('node_id');

// --- GEOMETRİK ELEMANLAR ---

// Normal ve derinlik gibi geometrik verilerin çeşitli uygulamaları vardır.

// Birleştirme ve son işlem aşamalarında.

// Saf geometrik normaller, R=X, G=Y, B=Z olarak kodlanmıştır.

reManager.add('normals');

// Kabartma haritalamasından sonraki normaller

reManager.add('bump_normals');

// Normalleştirilmiş gri tonlamalı derinlik arabelleği

reManager.add('z_depth');

// Hareket eden nesnelerin kare başına hızı

reManager.add('velocity');

}

// Üretim render modu için bir VRayRenderer örneği oluşturun.

var oluşturucu = vray.VRayRenderer();

renderer.renderMode = 'production';

// Sahneyi dosyadan eşzamansız olarak yükle.

renderer.load('cornell_new.vrscene', function(err) {

Eğer (hata) varsa, hata fırlat;

// Bu, sahneye gerekli kanal eklentilerini ekleyecektir.

addExampleRenderElements(renderer);

oluşturucu.senkronizasyonubaşlat();

renderer.waitForRenderEnd(function() {

// Bu, dosya adlarına sonek eklenmiş tüm kanalları kaydedecektir.

console.log('>>> Tüm kanallar kaydediliyor');

renderer.vfb.saveImageSync('cornell_RE.png');

var diffuseRE = renderer.renderElements.get('diffuse');

// Eğer diffuse render öğesi eksikse, değer false olarak değerlendirilecektir.

eğer (diffuseRE) {

var diffüzPlugin = diffüzRE.plugin;

console.log('>>> Eklentiden ters çevrilmiş JPG kaydediliyor: ' + diffusePlugin.getType() + ' ' + diffusePlugin.getName());

resim = diffuseRE.getImage();

eğer (resim) {

resim.negatifol();

resim.kaydet('cornell_inv_diffuse_VRayImage.jpg');

}

}

 

// Oluşturucuyu kapatır.

// Olay döngüsünü serbest bırakmak için bu çağrı zorunludur.

// Kaynakları tükendiği için kapatıldıktan sonra oluşturucu nesnesi kullanılamaz hale gelir.

// Serbest bırakılıyor. Çöp toplama için serbest bırakılmalıdır.

oluşturucu.kapat();

});

});

XI. Eklentiler #


Eklentiler, 3B sahneyi oluşturan ışıkları, geometriyi, malzemeleri veya ayarları belirten nesnelerdir. Her V-Ray sahnesi bir dizi eklenti örneğinden oluşur. V-Ray Uygulama SDK’sı, ana VRayRenderer sınıfında, eklenti örnekleri oluşturmak veya sahnedeki mevcut olanları listelemek ve değiştirmek (veya silmek) için kullanılabilecek yöntemler sunar.

Eklenti nesneleri örnek adına göre alınabilir. Kullanıcı bir eklenti örneği edindikten sonra, eklentinin özellik (diğer adıyla parametre ) değerleri görüntülenebilir veya oluşturulan görüntüyü etkileyecek şekilde ayarlanabilir. Eklentinin özelliklerine adına göre erişilir. Etkileşimli modda, eklenti özellik değerlerindeki değişiklikler genellikle oluşturma sırasında hemen uygulanır ve değişiklikler neredeyse anında görünür hale gelir, ancak her değişiklik için görüntü örneklemesi sıfırlanır ve başlangıçta bazı gürültülü görüntüler elde edersiniz. Üretim modunda, eklenti özellik değerlerindeki değişiklikler, oluşturma işlemi başlamadan önce uygulanırsa etkili olur. Aşağıdaki örnek, bir sahnedeki oluşturma görünümünün (kamera) dönüşümünün Uygulama SDK’sı ile nasıl değiştirilebileceğini göstermektedir.

vray.VRayRenderer() ile renderer olarak:

renderer.load('cornell_new.vrscene')

# Sahnedeki RenderView eklentisini bulun

renderView = renderer.plugins.renderView

# Dönüştürme değerini değiştir

yeniTransform = renderView.transform

newTransform = newTransform.replaceOffset(newTransform.offset + vray.Vector(-170, 120, newTransform.offset.z))

renderView.transform = newTransform

oluşturucu.startSync()

renderer.waitForRenderEnd(6000)

#include "vraysdk.hpp"

// vrayplugins başlık dosyası, genel Plugin temel sınıfından türetilen, belirli eklenti türleri için özel sınıflar sağlar.

// Bu isteğe bağlıdır ve bunun yerine genel Eklenti API'si kullanılabilir.

#include "vrayplugins.hpp"

int main() {

VRayInit init(NULL, true);

VRayRenderer oluşturucu;

renderer.load("cornell_new.vrscene");

// Sahnedeki RenderView eklentisini bulun

RenderView renderView = renderer.getPlugin<RenderView>("renderView");

// Dönüştürme değerini değiştirin

Transform newTransform = renderView.getTransform("transform");

yeniTransform.offset += Vector(-170, 120, newTransform.offset.z);

renderView.set_transform(newTransform);

 

oluşturucu.senkronizasyonubaşlat();

renderer.waitForRenderEnd(6000);

 

0 döndür;

}

VRay kullanarak;

VRay.Plugins kullanılarak;

(VRayRenderer renderer = new VRayRenderer()) kullanarak

{

renderer.Load("cornell_new.vrscene");

// Sahnedeki RenderView eklentisini bulun

RenderView renderView = renderer.GetPlugin<RenderView>("renderView");

// Dönüştürme değerini değiştirin

Transform newTransform = renderView.Transform;

renderView.Transform = newTransform.ReplaceOffset(newTransform.Offset + new Vector(-170, 120, newTransform.Offset.Z));

oluşturucu.Senkronizasyonu Başlat();

renderer.WaitForRenderEnd(6000);

}

var oluşturucu = vray.VRayRenderer();

renderer.load('cornell_new.vrscene', function(err) {

Eğer (hata) varsa, hata fırlat;

// Sahnedeki RenderView eklentisini bulun

var renderView = renderer.plugins.renderView;

// Dönüştürme değerini değiştirin

var newTransform = renderView.transform;

newTransform = newTransform.replaceOffset(newTransform.offset.add(vray.Vector(-170, 120, newTransform.offset.z)));

renderView.transform = newTransform;

// Oluşturma işlemine başla.

oluşturucu.başlat(fonksiyon (hata) {

Eğer (hata) varsa, hata fırlat;

renderer.waitForRenderEnd(6000, function() {

oluşturucu.kapat();

});

});

});

Bir eklenti özelliğinin değerini alan bir metoda yapılan çağrı, her zaman yerel V-Ray motorunda depolanan dahili değerin bir kopyasını döndürür. Eklenti özelliğinin değerini, oluşturulan görüntüyü etkileyecek şekilde değiştirmek için, eklenti sınıfından setter metodu çağrılmalıdır. Getter metodu tarafından döndürülen değeri basitçe değiştirmek, sahnede değişikliklere yol açmaz, çünkü bu bir kopyadır, referans değildir.


Eklenti ekleme ve kaldırma #

Uygulama SDK’sı ile eklenti örnekleri dinamik olarak oluşturulabilir ve kaldırılabilir. Bir sonraki örnek, sahneye nasıl yeni bir ışık eklenebileceğini göstermektedir.

vray.VRayRenderer() ile renderer olarak:

renderer.load('cornell_new.vrscene')

 

# Yeni bir ışık eklentisi oluştur

lightOmni = renderer.classes.LightOmni('lightOmniBlue')

lightOmni.color = vray.AColor(0, 0, 1)

lightOmni.intensity = 60000.0

lightOmni.decay = 2.0

lightOmni.shadowRadius = 40.0

lightOmni.transform = vray.Transform(

vray.Matrix(vray.Vector(1.0, 0.0, 0.0), vray.Vector(0.0, 0.0, 1.0), vray.Vector(0.0, -1.0, 0.0)),

vray.Vector(-50, 50, 50))

 

oluşturucu.startSync()

renderer.waitForRenderEnd(6000)

#include "vraysdk.hpp"

#include "vrayplugins.hpp"

int main() {

VRayInit init(NULL, true);

VRayRenderer oluşturucu;

renderer.load("cornell_new.vrscene");

 

// Yeni bir ışık eklentisi oluştur

LightOmni lightOmni = renderer.newPlugin<LightOmni>("lightOmniBlue");

lightOmni.set_color(AColor(0.f, 0.f, 1.f));

lightOmni.set_intensity(60000.f);

lightOmni.set_decay(2.0f);

lightOmni.set_shadowRadius(40.0f);

lightOmni.set_transform(Transform(

Matris(Vektör(1.0, 0.0, 0.0), Vektör(0.0, 0.0, 1.0), Vektör(0.0, -1.0, 0.0)),

Vektör(-50, 50, 50)));

 

oluşturucu.senkronizasyonubaşlat();

renderer.waitForRenderEnd(6000);

0 döndür;

}

VRay kullanarak;

VRay.Plugins kullanılarak;

 

(VRayRenderer renderer = new VRayRenderer()) kullanarak

{

renderer.Load("cornell_new.vrscene");

 

// Yeni bir ışık eklentisi oluştur

LightOmni lightOmni = renderer.NewPlugin<LightOmni>("lightOmniBlue");

lightOmni.Color = new AColor(0, 0, 1);

lightOmni.Intensity = 60000.0f;

lightOmni.Decay = 2.0f;

lightOmni.ShadowRadius = 40.0f;

lightOmni.Transform = new Transform(

Yeni Matris(Yeni Vektör(1.0, 0.0, 0.0), Yeni Vektör(0.0, 0.0, 1.0), Yeni Vektör(0.0, -1.0, 0.0)),

Yeni Vektör(-50, 50, 50);

 

oluşturucu.Senkronizasyonu Başlat();

renderer.WaitForRenderEnd(6000);

}

var oluşturucu = vray.VRayRenderer();

renderer.load('cornell_new.vrscene', function(err) {

Eğer (hata) varsa, hata fırlat;

 

// Yeni bir ışık eklentisi oluştur

var lightOmni = renderer.classes.LightOmni('lightOmniBlue');

lightOmni.color = vray.AColor(0, 0, 1);

lightOmni.intensity = 60000.0;

lightOmni.decay = 2.0;

lightOmni.shadowRadius = 40,0;

lightOmni.transform = vray.Transform(

vray.Matrix(vray.Vector(1.0, 0.0, 0.0), vray.Vector(0.0, 0.0, 1.0), vray.Vector(0.0, -1.0, 0.0)),

vray.Vector(-50, 50, 50));

 

oluşturucu.senkronizasyonubaşlat();

renderer.waitForRenderEnd(6000, function() {

oluşturucu.kapat();

});

});

Aşağıdaki örnekte, bir küre eklentisini adına göre kaldırıyoruz:

vray.VRayRenderer() ile renderer olarak:

renderer.load('cornell_new.vrscene')

 

del renderer.plugins['Sphere0Shape4@node']

 

oluşturucu.startSync()

renderer.waitForRenderEnd(6000)

VRayInit init(NULL, true);

VRayRenderer oluşturucu;

renderer.load("cornell_new.vrscene");

 

Eklenti küresi = oluşturucu.getPlugin("Sphere0Shape4@node");

renderer.deletePlugin(sphere);

 

oluşturucu.senkronizasyonubaşlat();

renderer.waitForRenderEnd(6000);

(VRayRenderer renderer = new VRayRenderer()) kullanarak

{

renderer.Load("cornell_new.vrscene");

 

Eklenti küresi = oluşturucu.GetPlugin("Sphere0Shape4@node");

renderer.DeletePlugin(sphere);

 

oluşturucu.Senkronizasyonu Başlat();

renderer.WaitForRenderEnd(6000);

}

var oluşturucu = vray.VRayRenderer();

renderer.load('./cornell_new.vrscene', function(err) {

Eğer (hata) varsa, hata fırlat;

 

renderer.plugins['Sphere0Shape4@node'] öğesini sil;

 

oluşturucu.senkronizasyonubaşlat();

renderer.waitForRenderEnd(6000, function() {

oluşturucu.kapat();

});

});

Mülk değişikliklerinin otomatik olarak kaydedilmesi #

Üretim modunda render işlemi yapılırken, eklenti özelliklerinde yapılan tüm değişiklikler render işlemi başlamadan önce yapılmalıdır. Bundan sonra yapılan değişiklikler mevcut render işlemini etkilemez, ancak kaybolmazlar. Etkileşimli modda, render işlemi başladıktan sonra yapılan değişiklikler varsayılan olarak sahneye hemen uygulanır. Alternatif olarak, kullanıcı genellikle daha iyi performans için birlikte uygulanacak bir grup değişiklik yapmayı seçebilir. Bu, VRayRenderer sınıfının autoCommit özelliği kullanılarak yapılır. Aşağıdaki örnekte, bir grup değişikliğin nasıl gruplandırıldığını ve  bunları uygulamak için açıkça commit’in  nasıl çağrıldığını gösteriyoruz.

vray.VRayRenderer() ile renderer olarak:

renderer.autoCommit = False

renderer.load('cornell_new.vrscene')

 

# Bu değişiklik hemen uygulanmayacak

lightOmni = renderer.classes.LightOmni()

lightOmni.color = vray.AColor(0, 0, 1)

lightOmni.intensity = 60000.0

lightOmni.decay = 2.0

lightOmni.shadowRadius = 40.0

lightOmni.transform = vray.Transform(vray.Matrix(vray.Vector(1.0, 0.0, 0.0),

vray.Vector(0.0, 0.0, 1.0), vray.Vector(0.0, -1.0, 0.0)), vray.Vector(-50, 50, 50))

 

oluşturucu.startSync()

renderer.waitForRenderEnd(2000)

# Render işlemi başladıktan 2 saniye sonra bir grup değişiklik yapın

renderer.plugins.renderView.fov = 1.5

del renderer.plugins['Sphere0Shape4@node']

# Commit, 3 değişikliğin tamamını uygular

oluşturucu.commit()

renderer.waitForRenderEnd(4000)

#include "vraysdk.hpp"

#include "vrayplugins.hpp"

 

int main() {

VRayInit init(NULL, true);

VRayRenderer oluşturucu;

renderer.setAutoCommit(false);

renderer.load("cornell_new.vrscene");

 

// Bu değişiklik hemen uygulanmayacak

LightOmni lightOmni = renderer.newPlugin<LightOmni>();

lightOmni.set_color(Color(0.f, 0.f, 1.f));

lightOmni.set_intensity(60000.0f);

lightOmni.set_decay(2.0f);

lightOmni.set_shadowRadius(40.0f);

lightOmni.set_transform(Transform(Matrix(Vector(1.0, 0.0, 0.0), Vector(0.0, 0.0, 1.0), Vector(0.0, -1.0, 0.0)), Vector(-50, 50, 50)));

 

oluşturucu.senkronizasyonubaşlat();

renderer.waitForRenderEnd(2000);

 

// Oluşturma işlemi başladıktan 2 saniye sonra bir dizi değişiklik yapın

Eklenti küresi = oluşturucu.getPlugin("Sphere0Shape4@node");

renderer.deletePlugin(sphere);

RenderView renderView = renderer.getPlugin<RenderView>("renderView");

renderView.set_fov(1.5f);

// Commit işlemi tüm 3 değişikliği uygular

renderer.commit();

 

renderer.waitForRenderEnd(4000);

0 döndür;

}

VRay kullanarak;

VRay.Plugins kullanılarak;

(VRayRenderer renderer = new VRayRenderer()) kullanarak

{

renderer.AutoCommit = false;

renderer.Load("cornell_new.vrscene");

 

// Bu değişiklik hemen uygulanmayacak

LightOmni lightOmni = renderer.NewPlugin<LightOmni>();

lightOmni.Color = new Color(0, 0, 1);

lightOmni.Intensity = 60000.0f;

lightOmni.Decay = 2.0f;

lightOmni.ShadowRadius = 40.0f;

lightOmni.Transform = new Transform(

Yeni Matris(Yeni Vektör(1.0, 0.0, 0.0), Yeni Vektör(0.0, 0.0, 1.0), Yeni Vektör(0.0, -1.0, 0.0)),

Yeni Vektör(-50, 50, 50)

));

 

oluşturucu.Senkronizasyonu Başlat();

renderer.WaitForRenderEnd(2000);

 

// Oluşturma işlemi başladıktan 2 saniye sonra bir dizi değişiklik yapın

Eklenti küresi = oluşturucu.GetPlugin("Sphere0Shape4@node");

renderer.DeletePlugin(sphere);

RenderView renderView = renderer.GetPlugin<RenderView>("renderView");

renderView.Fov = 1.5f;

// Commit işlemi tüm 3 değişikliği uygular

oluşturucu.Commit();

renderer.WaitForRenderEnd(4000);

}

var oluşturucu = vray.VRayRenderer();

renderer.autoCommit = false;

 

renderer.load('cornell_new.vrscene', function(err) {

Eğer (hata) varsa, hata fırlat;

// Bu değişiklik hemen uygulanmayacak

var lightOmni = renderer.classes.LightOmni();

lightOmni.color = vray.AColor(0, 0, 1);

lightOmni.intensity = 60000.0;

lightOmni.decay = 2.0;

lightOmni.shadowRadius = 40,0;

lightOmni.transform = vray.Transform(vray.Matrix(vray.Vector(1.0, 0.0, 0.0), vray.Vector(0.0, 0.0, 1.0), vray.Vector(0.0, -1.0, 0.0)), vray.Vector(-50, 50, 50));

oluşturucu.senkronizasyonubaşlat();

// Oluşturma işlemi başladıktan 2 saniye sonra bir dizi değişiklik yapın

renderer.waitForRenderEnd(2000, function () {

renderer.plugins.renderView.fov = 1.5;

renderer.plugins['Sphere0Shape4@node'] öğesini sil;

// Commit işlemi tüm 3 değişikliği uygular

renderer.commit();

 

renderer.waitForRenderEnd(6000, function () {

oluşturucu.kapat();

});

});

});

XII. Mülk Türleri #


Aşağıda, mülk türleri için tanınan tipler yer almaktadır:

  • Temel veri tipleri: int, bool, float, Color (3 float RGB), AColor (4 float ARGB), Vector (3 float), string (UTF-8), Matrix (3 Vector), Transform (öteleme için bir Matrix ve bir Vector)

  • Nesneler:  diğer eklenti örneklerine yapılan referanslar

  • Türlü listeler:  App SDK’deki türlü listeler IntList, FloatList, ColorList ve VectorList’tir.

  • Genel heterojen listeler:  Uygulama SDK’sı, genel bir listedeki öğeler için Value adlı genel bir tür sınıfı kullanır. Genel listelerin iç içe geçebileceğini unutmayın.

  • Çıkış parametreleri:  Bunlar, belirli bir eklenti tarafından oluşturulan ve diğer eklentiler tarafından girdi olarak kullanılabilen ek değerlerdir. PluginRef türü, belirli bir çıkış parametresine sahip bir eklentiyi temsil eder.

Her bir türle çalışma hakkında ayrıntılı belgelere, dilsel nüanslar içerdiği için  API referans kılavuzlarında ulaşılabilir  . Tüm türler VRay  ad alanındadır.

XIII. Animasyonlar #


V-Ray Uygulama SDK’sı, animasyonlu sahnelerin işlenmesini destekler . Animasyonlu sahneler, animasyonlu eklenti özelliklerini içerir. Bir eklenti özelliği, belirli bir zaman veya kare numarası için bir dizi değere sahipse animasyonlu olarak kabul edilir. Bu, anahtar kareleri tanımlar ve örnekleme işleminde, değerler arasında enterpolasyon yapılır.

VRayRenderer’ın frame özelliğinden mevcut kare numarasını elde edebilirsiniz . Bir kare tamamlandığında ve ondan sonra daha fazla kare olduğunda, renderer IDLE_FRAME_DONE ara durumuna geçer. Son kareden sonra ise IDLE_DONE durumuna döner.

def onStateChanged(oluşturucu, oldState, newState, anlık):

Eğer oldState == vray.RENDERER_STATE_IDLE_INITIALIZED ve newState == vray.RENDERER_STATE_PREPARING ise:

print('Sıralama başladı.')

if newState == vray.RENDERER_STATE_IDLE_FRAME_DONE or newState == vray.RENDERER_STATE_IDLE_DONE:

print('Görüntü Hazır, kare ' + str(renderer.frame) + ' (sequenceEnd = ' + str(renderer.sequenceEnded) + ')')

if newState == vray.RENDERER_STATE_IDLE_FRAME_DONE:

# Eğer işlem dizisi HENÜZ bitmediyse, bir sonraki kareye geçin.

oluşturucu.devamlıDiziye()

başka:

print('Sıralama tamamlandı. Oluşturucu kapatılıyor...')

vray.VRayRenderer() ile renderer olarak:

# Oluşturucu durum değişikliği olayına bir dinleyici ekleyin.

# Bunu, bir karenin tamamlandığını tespit etmek ve bir sonrakinin başlamasına izin vermek için kullanacağız.

renderer.setOnStateChanged(onStateChanged)

 

# Sahneyi dosyadan yükle.

renderer.load('animation.vrscene')

# Etkileşimli mod için piksel başına maksimum yol sayısı. İşlemeyi daha hızlı tamamlamak için düşük bir örnekleme seviyesi ayarlayın.

# Varsayılan değer sınırsızdır. Bunu sahneyi yükledikten *sonra* çağırmamız gerekiyor.

oluşturucu.setInteractiveSampleLevel(1)

# Kare dizisinin (animasyonun) oluşturulmasına başla.

oluşturucu.oluşturmaSırası()

# Tüm işlem dizisi tamamlanana kadar bekleyin.

oluşturucu.bekleSequenceEnd()

void onStateChanged(VRayRenderer &renderer, RendererState oldState, RendererState newState, double instant, void* userData) {

eğer (eski durum == BOŞTA_BAŞLATILMIŞ ve yeni durum == HAZIRLANIYOR) {

printf("Sıralama başladı.\")

");

}

if (newState == IDLE_FRAME_DONE || newState == IDLE_DONE) {

printf("Görüntü Hazır, kare %d (sequenceEnded = %d)\")

", renderer.getCurrentFrame(), renderer.isSequenceEnded());

if (newState == IDLE_FRAME_DONE) {

// Eğer işlem dizisi HENÜZ bitmediyse, bir sonraki kareye geçin.

oluşturucu.devamlılıkDizisi();

} başka {

printf("Sıralama tamamlandı. Oluşturucu kapatılıyor...\")

");

}

}

}

int main() {

VRayInit init(NULL, true);

VRayRenderer oluşturucu;

// Oluşturucu durum değişikliği olayına bir dinleyici ekleyin.

// Bu kodu, bir karenin tamamlandığını tespit etmek ve bir sonrakinin başlamasına izin vermek için kullanacağız.

renderer.setOnStateChanged(onStateChanged);

// Sahneyi dosyadan yükle.

renderer.load("animation.vrscene");

// Etkileşimli mod için piksel başına maksimum yol sayısı. İşlemeyi daha hızlı tamamlamak için düşük bir örnekleme seviyesi ayarlayın.

// Varsayılan değer sınırsızdır. Bunu sahne yüklendikten *sonra* çağırmamız gerekiyor.

oluşturucu.setInteractiveSampleLevel(1);

// Kare dizisinin (animasyonun) oluşturulmasına başla.

oluşturucu.oluşturmaSırası();

// Tüm işlem dizisi tamamlanana kadar bekleyin.

oluşturucu.sekanssonunubekle();

0 döndür;

}

(VRayRenderer renderer = new VRayRenderer()) kullanarak

{

// Durum değişiklikleri için bir dinleyici ekleyin.

// Bu fonksiyon, render işlemi için hazırlık yapıldığında, render işlemi tamamlandığında, bittiğinde veya başarısız olduğunda çağrılır.

renderer.StateChanged += new EventHandler<StateChangedEventArgs>((source, e) =>

{

eğer (e.OldState == VRayRenderer.RendererState.IDLE_INITIALIZED)

&& e.NewState == VRayRenderer.RendererState.PREPARING)

{

Console.WriteLine("Sıralama başladı.");

}

if (e.NewState == VRayRenderer.RendererState.IDLE_FRAME_DONE)

{

Console.WriteLine("Görüntü Hazır, kare " + renderer.Frame + " (sequenceEnded = " + renderer.IsSequenceEnded + ")");

// Eğer işlem dizisi HENÜZ bitmediyse, bir sonraki kareye geçin.

oluşturucu.DevamDizisi();

}

if (e.NewState == VRayRenderer.RendererState.IDLE_DONE)

{

Console.WriteLine("Sıralama tamamlandı. (sequenceEnded = " + )

renderer.IsSequenceEnded + ") İşleyici kapatılıyor...");

}

});

 

// Sahneyi dosyadan yükle.

renderer.Load("animation.vrscene");

// Etkileşimli mod için piksel başına maksimum yol sayısı. İşlemeyi daha hızlı tamamlamak için düşük bir örnekleme seviyesi ayarlayın.

// Varsayılan değer sınırsızdır. Bunu sahne yüklendikten *sonra* çağırmamız gerekiyor.

oluşturucu.SetInteractiveSampleLevel(1);

// Kare dizisinin (animasyonun) oluşturulmasına başla.

oluşturucu.RenderSequence();

// Tüm işlem dizisi tamamlanana kadar bekleyin.

oluşturucu.SequenceEnd'i Bekle();

}

var oluşturucu = vray.VRayRenderer();

// Oluşturucu durum değişikliği olayına bir dinleyici ekleyin.

// Bu kodu, bir karenin tamamlandığını tespit etmek ve bir sonrakinin başlamasına izin vermek için kullanacağız.

renderer.on('stateChanged', function(oldState, newState, instant) {

if (newState == 'idleFrameDone' || newState == 'idleDone') {

console.log('Görüntü Hazır, kare ' + renderer.frame + ' (sequenceEnd = ' + renderer.sequenceEnded + ')');

// Dizinin işlenmesinin tamamlanıp tamamlanmadığını kontrol edin.

if (newState == 'idleDone') {

// Oluşturucuyu kapatır. Olay döngüsünü serbest bırakmak için bu çağrı zorunludur.

// Kapatıldıktan sonra render nesnesi kullanılamaz hale gelir çünkü kaynakları serbest bırakılır. Çöp toplama işlemi için serbest bırakılmalıdır.

oluşturucu.kapat();

} başka {

// Eğer işlem dizisi HENÜZ bitmediyse, bir sonraki kareye geçin.

oluşturucu.devamlılıkDizisi();

}

} aksi takdirde (newState.startsWith('idle')) {

console.log('Beklenmeyen render dizisi sonu: ', newState);

oluşturucu.kapat();

}

});

// Sahneyi dosyadan eşzamansız olarak yükle.

renderer.load('animation.vrscene', function(err) {

Eğer (hata) varsa, hata fırlat;

// Etkileşimli mod için piksel başına maksimum yol sayısı. İşlemeyi daha hızlı tamamlamak için düşük bir örnekleme seviyesi ayarlayın.

// Varsayılan değer sınırsızdır. Bunu sahne yüklendikten *sonra* çağırmamız gerekiyor.

oluşturucu.setInteractiveSampleLevel(1);

// Kare dizisinin (animasyonun) oluşturulmasına başla.

oluşturucu.oluşturmaSırası();

// Oluşturucu kapatılana kadar çöp toplama işlemini ve Node.js'den çıkışı engelleyin.

oluşturucu.canlıtut();

});

XIV. V-Ray Sunucusu #


Bir V-Ray sunucusu, bir sahnenin işlenmesi sırasında uzaktan işleme sunucusu olarak kullanılır. Sunucu, belirli bir ağ portunda işleme isteklerini dinleyen bir işlemdir ve VRayRenderer sınıfının örnekleri gibi istemciler, görüntü işlemenin bir kısmını devretmek için sunucuya bağlanabilir. V-Ray bağımsız işleme sunucuları da kullanılabilir. Sunucu, tek başına bir işleme sürecini başlatmak için kullanılamaz, ancak istemciler tarafından başlatılan dağıtılmış görevleri tamamlamada önemli bir rol oynar. V-Ray’in dağıtılmış işleme yeteneklerinden yararlanmak için, bu tür sunucuların çalıştırılması ve isteklere açık olması gerekir.

V-Ray Uygulama SDK’sı, dağıtılmış render işlemlerinde kullanılabilen V-Ray sunucu süreçlerinin kolayca oluşturulmasına olanak tanır. API, sunucu süreçlerini başlatma ve durdurma yöntemlerini sunan VRayServer sınıfını içerir. Ayrıca, VRayServer sınıfı, kullanıcıların V-Ray sunucusuna özgü olaylara abone olmalarını ve bu olayların gerçekleşmesi üzerine özel mantığın yürütülmesini sağlar.

Sunucu olayları şu durumlarda meydana gelir:

  • Sunucu işlemi başlatılır ve render isteklerini kabul etmeye hazırdır.

  • Bir render istemcisi, dağıtılmış bir render görevi talep etmek için sunucuya bağlanır.

  • Bir render istemcisi sunucudan bağlantısını kesiyor.

  • Sunucu durumundaki bir değişiklik nedeniyle veya mevcut işin ilerlemesini takip etmek için sunucu tarafından bir metin mesajı oluşturulur.


Aşağıdaki kod parçası, VRayServer’ın nasıl örneklendirilebileceğini ve bir sunucu işlemini başlatmak için nasıl kullanılabileceğini göstermektedir.

from __future__ import print_function

# Vray paylaşımlı nesnesini içeren dizin, PYTHONPATH ortam değişkeninde bulunmalıdır.

# VRAY_SDK/python dizininden vray modülünü içe aktarmayı deneyin, eğer PYTHONPATH'te yoksa.

import sys, os

VRAY_SDK = os.environ.get('VRAY_SDK')

VRAY_SDK ise:

sys.path.append(os.path.join(VRAY_SDK, 'python'))

vray'i içe aktar

denemek:

# Python 2.7 ile uyumluluk.

giriş = ham_giriş

NameError hariç:

geçmek

def printStarted(server, instant):

print('Sunucu başlatıldı. Devam etmek için Enter tuşuna basın...')

def printRendererConnect(sunucu, ana bilgisayar, anlık):

print('Host {0} connected to server.'.format(host))

def printRendererDisconnect(server, host, instant):

print('Host {0} sunucudan bağlantısını kesti.'.format(host))

# VRay sunucusu için dinleme portu. Varsayılan değer 20207'dir.

seçenekler = { 'portNumarası': 20207 }

# Özel seçeneklerle bir VRayServer örneği oluşturun.

# `with` bloğundan sonra sunucu otomatik olarak kapatılır.

vray.VRayServer(**options) ile sunucu olarak:

# Sunucu başlatma olayına bir dinleyici ekleyin. Bu dinleyici, görüntü oluşturma işlemi tamamlandığında tetiklenir.

sunucu.setOnStart(printStarted)

# Bağlantı olayına bir dinleyici ekleyin. Bu dinleyici, bir oluşturucu sunucuya bağlandığında tetiklenir.

sunucu.setOnConnect(printRendererConnect)

# Sunucudan bağlantı kesildiğinde tetiklenen bağlantı kesme olayını dinleyen bir dinleyici ekleyin.

sunucu.setOnDisconnect(printRendererDisconnect)

# Belirtilen port üzerinden bağlantıları dinlemeye başlayın.

sunucu.başlat()

# Çıkmak için bir tuşa basın.

giriş('')

#include "vraysrv.hpp"

VRay ad alanını kullanarak;

std ad alanını kullanarak;

void printStarted(VRayServer &server, double instant, void* userData) {

printf("Sunucu başlatıldı.\")

");

}

void printRendererConnect(VRayServer &server, const char* host, double instant, void* userData) {

printf("Ana bilgisayar %s sunucuya bağlandı.\")

", ev sahibi);

}

void printRendererDisconnect(VRayServer &server, const char* host, double instant, void* userData) {

printf("Ana bilgisayar %s sunucuyla bağlantısını kesti.\")

", ev sahibi);

}

int main() {

VRayServerInit init(NULL);

Sunucu Seçenekleri;

// VRay sunucusu için dinleme portu. Varsayılan değer 20207'dir.

seçenekler.portNumarası = 20207;

// Özel seçeneklerle bir VRayServer örneği oluşturun.

// Sunucu, geçerli kapsamın sonunda otomatik olarak kapatılır.

VRayServer sunucu(seçenekler);

// Sunucu başlatma olayına bir dinleyici ekleyin. Görüntü oluşturma işlemi tamamlandığında çağrılır.

sunucu.setOnServerStart(printStarted);

// Bağlantı olayına bir dinleyici ekleyin. Bu dinleyici, bir oluşturucu sunucuya bağlandığında tetiklenir.

sunucu.setOnConnect(printRendererConnect);

// Sunucudan bağlantı kesilmesi olayına bir dinleyici ekleyin. Bu dinleyici, bir oluşturucu sunucudan bağlantısını kestiğinde tetiklenir.

sunucu.setOnDisconnect(printRendererDisconnect);

// Belirtilen port üzerinden bağlantıları dinlemeye başlayın.

sunucu.çalıştır();

0 döndür;

}

VRay kullanarak;

ServerOptions options = new ServerOptions();

// VRay sunucusu için dinleme portu. Varsayılan değer 20207'dir.

Seçenekler.PortNumarası = 20207;

// Özel seçeneklerle bir VRayServer örneği oluşturun.

// Sunucu, `using` bloğundan sonra otomatik olarak kapatılır.

(VRayServer sunucusunu kullanarak = new VRayServer(seçenekler))

{

// Sunucu başlatma olayına bir dinleyici ekleyin. Görüntü oluşturma işlemi tamamlandığında çağrılır.

sunucu.Başlatıldı += yeni Olay İşleyici((kaynak, e) =>

{

Console.WriteLine("Sunucu başlatıldı. Devam etmek için Enter tuşuna basın...");

});

// Bağlantı olayına bir dinleyici ekleyin. Bu dinleyici, bir oluşturucu sunucuya bağlandığında tetiklenir.

sunucu.HostConnected += yeni EventHandler<HostEventArgs>((kaynak, e) =>

{

Console.WriteLine(String.Format("Host {0} sunucuya bağlandı.", e.Host));

});

// Sunucudan bağlantı kesilmesi olayına bir dinleyici ekleyin. Bu dinleyici, bir oluşturucu sunucudan bağlantısını kestiğinde tetiklenir.

sunucu.HostDisconnected += new EventHandler<HostEventArgs>((source, e) =>

{

Console.WriteLine(String.Format("Host {0} sunucuyla bağlantısını kesti.", e.Host));

});

// Belirtilen port üzerinden bağlantıları dinlemeye başlayın.

sunucu.Başlat();

// Çıkmak için bir tuşa basın.

Konsol.AnahtarıOku();

}

var vray = require(path.join(process.env.VRAY_SDK, 'node', 'vray'));

// VRay sunucusu için dinleme portu. Varsayılan değer 20207'dir.

seçenekler = { 'portNumber': 20207 };

// Özel seçeneklerle bir VRayServer örneği oluşturun.

var sunucu = vray.VRayServer(seçenekler);

// Sunucu başlatma olayına bir dinleyici ekleyin. Görüntü oluşturma işlemi tamamlandığında çağrılır.

sunucu.on('başlat', function(anlık) {

console.log('Sunucu hazır');

console.log('Çıkmak için bir tuşa basın');

});

// Bağlantı olayına bir dinleyici ekleyin. Bu dinleyici, bir oluşturucu sunucuya bağlandığında tetiklenir.

sunucu.bağlan', fonksiyon(sunucu, anlık) {

console.log('Ana bilgisayar ' + host + ' sunucuya bağlandı.');

});

// Sunucudan bağlantı kesilmesi olayına bir dinleyici ekleyin. Bu dinleyici, bir oluşturucu sunucudan bağlantısını kestiğinde tetiklenir.

sunucu.on('bağlantıyı kes', function(host, instant) {

console.log('Ana bilgisayar ' + host + ' sunucudan bağlantısı kesildi.');

});

// Belirtilen port üzerinden bağlantıları dinlemeye başlayın.

sunucu.başlat();

işlem.on('çıkış', fonksiyon() {

sunucuyu kapat();

});

// Çıkmak için herhangi bir tuşa basın.

işlem.stdin.setRawMode(true);

işlem.stdin.devam et();

process.stdin.on('data', process.exit.bind(process, 0));

XV. Dağıtılmış İşleme #


V-Ray Uygulama SDK’sı, üçüncü taraf entegratörlerin V-Ray dağıtılmış işleme motorundan tam olarak yararlanmasını sağlar . Dağıtılmış işleme, görüntünün parçalarını birden fazla işleme sunucusunda paralel olarak işlemenize olanak tanır. İşlemeyi başlatan istemci işlemi, işleme sunucuları tarafından üretilen sonuçları senkronize eder. Tüm işleme modları dağıtılmış işlemeyi destekler.

Render sunucuları, render işlemi sırasında herhangi bir anda dinamik olarak eklenebilir ve kaldırılabilir. Render istemcisi, etkin sunucular listesine eklemeye çalıştığında, render sunucularında bir V-Ray sunucusu çalışıyor olmalıdır, çünkü istemci o anda dağıtılmış bir görev için bağlantı kurulup kurulamayacağını doğrular.

Her bir render sunucusu, V-Ray sunucusunun bulunduğu makinenin IP veya DNS adresini ve bu sunucunun render isteklerini dinlediği portu belirten bir adres:port çiftiyle tanımlanır. VRayRenderer sınıfı, sunucuların dinamik olarak eklenmesi ve kaldırılması için yöntemler sunar. İstemcideki ana render işleminin ilerlemesinden bağımsız olarak, uzak makineler, çalışan V-Ray sunucularına sahip oldukları sürece render işlemine başarıyla katılmaya başlayabilirler.

def printDRStatus(renderer):

print('Aktif sunucular: ', renderer.getActiveHosts())

print('Etkin olmayan sunucular: ', renderer.getInactiveHosts())

print('Tüm sunucular: ', renderer.getAllHosts())

vray.VRayRenderer() ile renderer olarak:

# Sahneyi dosyadan yükle.

renderer.load('cornell_new.vrscene')

# Öncelikle DR'yi açıkça etkinleştirmemiz gerekiyor.

renderer.setDREnabled(True)

# Oluşturma işlemine başla.

oluşturucu.startSync()

# Birkaç saniye sonra birden fazla sunucu ekleyin

renderer.waitForRenderEnd(6000)

# Bağlantı noktası belirtilmezse varsayılan olarak 20207 kullanılır.

# NOT: Bu adresi VRayServer çalıştıran bir sunucunun adresiyle değiştirin.

renderer.addHosts('10.0.0.132:20207;10.0.0.132:20208')

print('=== Sunucular eklendikten sonra ===')

printDRStatus(renderer)

# Oluşturma işlemi tamamlanana veya 6 saniye geçene kadar bekleyin.

renderer.waitForRenderEnd(6000)

void printDRStatus(VRayRenderer &renderer) {

printf("Aktif sunucular: %s\")

", renderer.getActiveHosts().c_str());

printf("Etkin olmayan sunucular: %s\")

", renderer.getInactiveHosts().c_str());

printf("Tüm sunucular: %s\")

", renderer.getAllHosts().c_str());

}

int main() {

VRayInit init(NULL, true);

VRayRenderer oluşturucu;

// Sahneyi dosyadan yükle.

renderer.load("cornell_new.vrscene");

// Öncelikle DR'yi açıkça etkinleştirmemiz gerekiyor.

renderer.setDREnabled(true);

// Oluşturma işlemine başla.

oluşturucu.senkronizasyonubaşlat();

// Birkaç saniye sonra birden fazla sunucu ekleyin

renderer.waitForRenderEnd(6000);

// Bağlantı noktası belirtilmezse varsayılan olarak 20207 kullanılır.

// NOT: Bu adresi VRayServer çalıştıran bir sunucunun adresiyle değiştirin.

renderer.addHosts("10.0.0.132:20207;10.0.0.132:20208");

printf("=== Sunucular eklendikten sonra ===\

");

printDRStatus(renderer);

// Oluşturma işlemi tamamlanana veya 6 saniye geçene kadar bekleyin.

renderer.waitForRenderEnd(6000);

0 döndür;

}

static void PrintDRStatus(VRayRenderer renderer)

{

Console.WriteLine("Aktif sunucular: ", renderer.ActiveHosts);

Console.WriteLine("Etkin olmayan sunucular: ", renderer.InactiveHosts);

Console.WriteLine("Tüm sunucular: ", renderer.AllHosts);

}

statik void Main(string[] args)

{

(VRayRenderer renderer = new VRayRenderer()) kullanarak

{

// Sahneyi dosyadan yükle.

renderer.Load("cornell_new.vrscene");

// Öncelikle DR'yi açıkça etkinleştirmemiz gerekiyor.

renderer.SetDREnabled(true);

// Oluşturma işlemine başla.

oluşturucu.Senkronizasyonu Başlat();

// Birkaç saniye sonra birden fazla sunucu ekleyin

renderer.WaitForRenderEnd(6000);

// Bağlantı noktası belirtilmezse varsayılan olarak 20207 kullanılır.

// NOT: Bu adresi VRayServer çalıştıran bir sunucunun adresiyle değiştirin.

renderer.AddHosts("10.0.0.132:20207;10.0.0.132:20208");

Console.WriteLine("=== Sunucular eklendikten sonra ===");

PrintDRStatus(renderer);

// Oluşturma işlemi tamamlanana veya 6 saniye geçene kadar bekleyin.

renderer.WaitForRenderEnd(6000);

}

}

fonksiyon printDRStatus(renderer) {

console.log('Aktif sunucular: ', renderer.getActiveHostsSync());

console.log('Etkin olmayan sunucular: ', renderer.getInactiveHostsSync());

console.log('Tüm sunucular: ', renderer.getAllHostsSync());

}

var oluşturucu = vray.VRayRenderer();

// Sahneyi dosyadan eşzamansız olarak yükle.

renderer.load('cornell_new.vrscene', function(err) {

Eğer (hata) varsa, hata fırlat;

// Öncelikle DR'yi açıkça etkinleştirmemiz gerekiyor.

renderer.setDREnabled(true);

// Oluşturma işlemine başla.

oluşturucu.başlat(işlev(hata) {

Eğer (hata) varsa, hata fırlat;

// Birkaç saniye sonra birden fazla sunucu ekleyin

renderer.waitForRenderEnd(6000, function() {

// Bağlantı noktası belirtilmezse varsayılan olarak 20207 kullanılır.

// NOT: Bu adresi VRayServer çalıştıran bir sunucunun adresiyle değiştirin.

renderer.addHosts('10.0.0.132:20207;10.0.0.132:20208', function() {

console.log('=== Sunucular eklendikten sonra ===');

printDRStatus(renderer);

// Oluşturma işlemi tamamlanana veya 6 saniye geçene kadar bekleyin.

renderer.waitForRenderEnd(6000, function() {

oluşturucu.kapat();

});

});

});

});

});

Render sunucularının kaldırılması, eklenmesi kadar kolaydır. Tüm uzak render sunucuları bağlantıyı kesse veya render sunucu listesinden silinse bile, render işlemi, onu başlatan istemci makinede devam edecektir.

def printDRStatus(renderer):

print('Aktif sunucular: ', renderer.getActiveHosts())

print('Etkin olmayan sunucular: ', renderer.getInactiveHosts())

print('Tüm sunucular: ', renderer.getAllHosts())

vray.VRayRenderer() ile renderer olarak:

# Sahneyi dosyadan yükle.

renderer.load('cornell_new.vrscene')

# Öncelikle DR'yi açıkça etkinleştirmemiz gerekiyor.

renderer.setDREnabled(True)

# Oluşturma işlemine başla.

oluşturucu.startSync()

# Birkaç saniye sonra birden fazla sunucu ekleyin

renderer.waitForRenderEnd(6000)

# Bağlantı noktası belirtilmezse varsayılan olarak 20207 kullanılır.

# NOT: Bu adresi VRayServer çalıştıran bir sunucunun adresiyle değiştirin.

renderer.addHosts('10.0.0.132:20207;10.0.0.132:20208')

print('=== Sunucular eklendikten sonra ===')

printDRStatus(renderer)

# Oluşturma işlemi tamamlanana veya 6 saniye geçene kadar bekleyin.

renderer.waitForRenderEnd(6000)

 

# Dağıtılmış işleme işleminden uzak bir sunucuyu kaldırın.

# NOT: Bu adresi, dağıtılmış işleme için önceden eklenmiş bir sunucunun adresiyle değiştirin.

renderer.removeHosts('10.0.0.132:20208')

print('=== Bir sunucuyu kaldırdıktan sonra ===')

printDRStatus(renderer)

void printDRStatus(VRayRenderer &renderer) {

printf("Aktif sunucular: %s\")

", renderer.getActiveHosts().c_str());

printf("Etkin olmayan sunucular: %s\")

", renderer.getInactiveHosts().c_str());

printf("Tüm sunucular: %s\")

", renderer.getAllHosts().c_str());

}

int main() {

VRayInit init(NULL, true);

VRayRenderer oluşturucu;

// Sahneyi dosyadan yükle.

renderer.load("cornell_new.vrscene");

// Öncelikle DR'yi açıkça etkinleştirmemiz gerekiyor.

renderer.setDREnabled(true);

// Oluşturma işlemine başla.

oluşturucu.senkronizasyonubaşlat();

// Birkaç saniye sonra birden fazla sunucu ekleyin

renderer.waitForRenderEnd(6000);

// Bağlantı noktası belirtilmezse varsayılan olarak 20207 kullanılır.

// NOT: Bu adresi VRayServer çalıştıran bir sunucunun adresiyle değiştirin.

renderer.addHosts("10.0.0.132:20207;10.0.0.132:20208");

printf("=== Sunucular eklendikten sonra ===\

");

printDRStatus(renderer);

// Oluşturma işlemi tamamlanana veya 6 saniye geçene kadar bekleyin.

renderer.waitForRenderEnd(6000);

// Dağıtılmış işleme işleminden uzak bir sunucuyu kaldırın.

// NOT: Bu adresi, dağıtılmış işleme için önceden eklenmiş bir sunucunun adresiyle değiştirin.

renderer.removeHosts("10.0.0.132:20208");

printf("=== Bir sunucuyu kaldırdıktan sonra ===\

");

printDRStatus(renderer);

 

0 döndür;

}

static void PrintDRStatus(VRayRenderer renderer)

{

Console.WriteLine("Aktif sunucular: ", renderer.ActiveHosts);

Console.WriteLine("Etkin olmayan sunucular: ", renderer.InactiveHosts);

Console.WriteLine("Tüm sunucular: ", renderer.AllHosts);

}

statik void Main(string[] args)

{

(VRayRenderer renderer = new VRayRenderer()) kullanarak

{

// Sahneyi dosyadan yükle.

renderer.Load("cornell_new.vrscene");

// Öncelikle DR'yi açıkça etkinleştirmemiz gerekiyor.

renderer.SetDREnabled(true);

// Oluşturma işlemine başla.

oluşturucu.Senkronizasyonu Başlat();

// Birkaç saniye sonra birden fazla sunucu ekleyin

renderer.WaitForRenderEnd(6000);

// Bağlantı noktası belirtilmezse varsayılan olarak 20207 kullanılır.

// NOT: Bu adresi VRayServer çalıştıran bir sunucunun adresiyle değiştirin.

renderer.AddHosts("10.0.0.132:20207;10.0.0.132:20208");

Console.WriteLine("=== Sunucular eklendikten sonra ===");

PrintDRStatus(renderer);

// Oluşturma işlemi tamamlanana veya 6 saniye geçene kadar bekleyin.

renderer.WaitForRenderEnd(6000);

// Dağıtılmış işleme işleminden uzak bir sunucuyu kaldırın.

// NOT: Bu adresi, dağıtılmış işleme için önceden eklenmiş bir sunucunun adresiyle değiştirin.

renderer.RemoveHosts("10.0.0.132:20208");

Console.WriteLine("=== Bir sunucuyu kaldırdıktan sonra ===");

PrintDRStatus(renderer);

}

}

fonksiyon printDRStatus(renderer) {

console.log('Aktif sunucular: ', renderer.getActiveHostsSync());

console.log('Etkin olmayan sunucular: ', renderer.getInactiveHostsSync());

console.log('Tüm sunucular: ', renderer.getAllHostsSync());

}

var oluşturucu = vray.VRayRenderer();

// Sahneyi dosyadan eşzamansız olarak yükle.

renderer.load('cornell_new.vrscene', function(err) {

Eğer (hata) varsa, hata fırlat;

// Öncelikle DR'yi açıkça etkinleştirmemiz gerekiyor.

renderer.setDREnabled(true);

// Oluşturma işlemine başla.

oluşturucu.başlat(işlev(hata) {

Eğer (hata) varsa, hata fırlat;

// Birkaç saniye sonra birden fazla sunucu ekleyin

renderer.waitForRenderEnd(6000, function() {

// Bağlantı noktası belirtilmezse varsayılan olarak 20207 kullanılır.

// NOT: Bu adresi VRayServer çalıştıran bir sunucunun adresiyle değiştirin.

renderer.addHosts('10.0.0.132:20207;10.0.0.132:20208', function() {

console.log('=== Sunucular eklendikten sonra ===');

printDRStatus(renderer);

// Oluşturma işlemi tamamlanana veya 6 saniye geçene kadar bekleyin.

renderer.waitForRenderEnd(6000, function() {

// Dağıtılmış işleme işleminden uzak bir sunucuyu kaldırın.

// NOT: Bu adresi, dağıtılmış işleme için önceden eklenmiş bir sunucunun adresiyle değiştirin.

renderer.removeHosts('10.0.0.132:20208', function() {

console.log('=== Bir sunucuyu kaldırdıktan sonra ===');

printDRStatus(renderer);

oluşturucu.kapat();

});

});

});

});

});

});

Tarafından desteklenmektedir BetterDocs

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir