Küp eşleme - Cube mapping

Sol alttaki resim, siyah nokta ile işaretlenmiş bir bakış açısına sahip bir sahneyi göstermektedir. Üstteki resim, o bakış açısından görüldüğü gibi küp eşlemesinin ağını gösterir ve sağ alttaki resim, orijinal sahneye bindirilmiş küpü gösterir.

Gelen bilgisayar grafikleri , küp haritalama yöntemidir çevre haritalama haritası şekil olarak bir küpün altı yüzü kullanır. Ortam, bir küpün kenarlarına yansıtılır ve altı kare doku olarak depolanır veya tek bir dokunun altı bölgesine açılır. Küp haritası, ilk önce sahnenin bir bakış açısından altı kez oluşturulmasıyla oluşturulur ve görünümler her bir küp yüzünü temsil eden 90 derecelik bir görünüm kesikliği ile tanımlanır .

Çoğu durumda, küp eşleme, eski küre eşleme yöntemine göre tercih edilir, çünkü görüntü bozulması, bakış açısı bağımlılığı ve hesaplama verimsizliği gibi küre eşlemenin doğasında bulunan birçok sorunu ortadan kaldırır. Ayrıca, küp haritalama desteklemek için çok daha büyük bir kapasite sağlar gerçek zamanlı render ait yansımaları sürekli değişen bakış açısı varken verimsizlik ve bakış açısı bağımlılık kombinasyonu ciddi uygulanacak küre haritalama yeteneğini sınırlar, çünkü küre haritalama göre.

Küp eşlemenin çeşitleri de 360 video projeksiyonunda yaygın olarak kullanılmaktadır .

Tarih

Küp haritalama ilk olarak 1986 yılında Ned Greene tarafından “Çevre Haritalaması ve Dünya Projeksiyonlarının Diğer Uygulamaları” başlıklı makalesinde önerildi, çevre haritalamanın ilk kez Jim Blinn ve Martin Newell tarafından ortaya atılmasından on yıl sonra . Bununla birlikte, altı doku görüntüsüne aynı anda erişme yeteneğindeki donanım sınırlamaları, daha fazla teknolojik gelişme olmadan küp eşlemenin uygulanmasını olanaksız hale getirdi. Bu sorun 1999'da Nvidia GeForce 256'nın piyasaya sürülmesiyle giderildi . Nvidia, donanımda küp eşlemeyi "GeForce 256'nın geliştiricilerin doğru, gerçek zamanlı yansımalar oluşturmasına olanak sağlayacak çığır açan bir görüntü kalitesi özelliği" olarak lanse etti. Donanımda hızlandırılmış küp ortam eşleme, geliştiricilerin yaratıcılığını, ilginç, sürükleyici ortamlar oluşturmak için yansımaları ve aynasal aydınlatma efektlerini kullanma konusunda serbest bırakacak.” Bugün, küp eşleme hala çeşitli grafik uygulamalarda tercih edilen bir çevre eşleme yöntemi olarak kullanılmaktadır.

Avantajlar

Küp haritalama, göreceli basitliği nedeniyle diğer çevre haritalama yöntemlerine göre tercih edilir. Ayrıca, küp eşleme, ışın izleme ile elde edilenlere benzer , ancak hesaplama açısından çok daha verimli sonuçlar üretir - kalitedeki orta derecede azalma, verimlilikteki büyük kazançlarla telafi edilir.

Küp eşlemeden önce gelen küre eşleme , çoğu uygulama için pratik olmayan birçok doğal kusura sahiptir. Küre haritalama görünüme bağlıdır, yani her bakış açısı için farklı bir doku gereklidir. Bu nedenle, bakış açısının mobil olduğu uygulamalarda, her yeni bakış açısı için dinamik olarak yeni bir küre haritası oluşturmak (veya her bakış açısı için önceden bir harita oluşturmak) gerekli olacaktır. Ayrıca, bir kürenin yüzeyine eşlenen bir doku, gerilmeli ve sıkıştırılmalıdır ve eğrilme ve bozulma (özellikle kürenin kenarı boyunca) bunun doğrudan bir sonucudur. Bu görüntü kusurları, "ön-gerdirme" gibi belirli hileler ve teknikler kullanılarak azaltılabilse de, bu, küre haritalamaya başka bir karmaşıklık katmanı ekler.

Paraboloid eşleme , küre eşlemenin sınırlamalarında bir miktar iyileştirme sağlar, ancak özel görüntü çarpıtma işlemlerine ve daha kapsamlı hesaplamaya ek olarak iki işleme geçişi gerektirir.

Tersine, küp eşleme yalnızca tek bir işleme geçişi gerektirir ve basit doğası nedeniyle geliştiricilerin anlaması ve oluşturması çok kolaydır. Ayrıca, küp eşleme, küre ve paraboloid eşlemelere kıyasla doku görüntüsünün tüm çözünürlüğünü kullanır, bu da aynı kaliteyi elde etmek için daha düşük çözünürlüklü görüntüler kullanmasına izin verir. Küp haritasının dikişlerini işlemek bir sorun olsa da, dikiş davranışını ele almak ve kusursuz bir yansıma ile sonuçlanmak için algoritmalar geliştirilmiştir.

Dezavantajları

Sahneye yeni bir nesne veya yeni bir aydınlatma eklenirse veya ona yansıyan bir nesne hareket ediyor veya bir şekilde değişiyorsa, yansıma değişir ve küp haritası yeniden oluşturulmalıdır. Küp haritası sahnede hareket eden bir nesneye yapıştırıldığında, küp haritası da bu yeni konumdan yeniden oluşturulmalıdır.

Uygulamalar

Kararlı aynasal vurgular

Bilgisayar destekli tasarım (CAD) programları , 3B nesneleri işlerken yüzey eğriliği hissini iletmek için görsel ipuçları olarak aynasal vurguları kullanır . Bununla birlikte, birçok CAD programı, aynasal aydınlatma hesaplamaları yalnızca nesneyi temsil etmek için kullanılan ağın köşelerinde gerçekleştirildiğinden ve nesnenin yüzeyi boyunca aydınlatmayı tahmin etmek için enterpolasyon kullanıldığından, aynasal vurguları örneklemede problemler sergiler. Ağ köşeleri yeterince yoğun olmadığında problemler ortaya çıkar ve bu da aynasal aydınlatmanın yetersiz örneklenmesine neden olur. Bu da, sonuçta eğriliği gösteren görsel ipuçlarından ödün vererek, ağ tepe noktalarından uzaklıkla orantılı parlaklığa sahip parlak noktalara neden olur. Ne yazık ki, bu sorun daha yoğun bir ağ oluşturarak çözülemez, çünkü bu, nesne oluşturmanın verimliliğini büyük ölçüde azaltabilir.

Küp haritalar, sabit aynasal vurgular oluşturmak için oldukça basit ve verimli bir çözüm sunar. Çoklu aynasal vurgular, bir küp harita dokusuna kodlanabilir ve daha sonra koordinatları sağlamak için yüzeyin yansıma vektörü boyunca enterpolasyon yapılarak erişilebilir . Bireysel tepe noktalarındaki aydınlatma hesaplamasına kıyasla, bu yöntem eğriliği daha doğru temsil eden daha temiz sonuçlar sağlar. Bu yöntemin bir başka avantajı, iyi ölçeklenmesidir, çünkü ek aynasal vurgular, işleme maliyetinde herhangi bir artış olmaksızın dokuya kodlanabilir. Bununla birlikte, bu yaklaşım, ışık kaynaklarının ya uzak ya da sonsuz ışıklar olması gerektiği için sınırlıdır, ancak neyse ki bu genellikle CAD programlarında geçerlidir.

Skybox'lar

Yüzleri etiketlenmiş bir kübik gökyüzü kutusunun yüzleriyle eşlenebilen bir doku örneği

Küp haritalamanın belki de en gelişmiş uygulaması, daha sonra grafik motor tarafından küpün merkezinde bulunan görüş noktası ile pratik olarak sonsuz mesafede bir küpün yüzleri olarak işlenen önceden oluşturulmuş panoramik gökyüzü görüntüleri oluşturmaktır . Perspektif projeksiyon küp grafik motoru geri alır yapılır yüzlerin böylece gözlemci skybox üretmek için kullanıldı sahnesi çevrili bir yanılsama deneyimleri, küp haritası oluşturmak için çevreyi projelendirme etkileri. Bu teknik, tasarımcıların bir oyuna neredeyse hiç performans maliyeti olmadan karmaşık (keşfedilemez olsa da) ortamlar eklemesine izin verdiği için video oyunlarında yaygın bir kullanım bulmuştur .

ışıklık aydınlatma

Küp haritalar, dış mekan aydınlatmasını doğru bir şekilde modellemek için faydalı olabilir. Güneş ışığını tek bir sonsuz ışık olarak basitçe modellemek, dış mekan aydınlatmasını aşırı derecede basitleştirir ve gerçekçi olmayan aydınlatma ile sonuçlanır. Güneşten bol miktarda ışık gelmesine rağmen, ışınların atmosfere saçılması, tüm gökyüzünün bir ışık kaynağı olarak hareket etmesine neden olur (genellikle ışıklık aydınlatması olarak adlandırılır). Ancak, bir küp haritası kullanılarak, ışıklık aydınlatmasının yaygın katkısı yakalanabilir. Yansıma vektörünün kullanıldığı çevre haritalarının aksine, bu yöntem, ışıklıktan yayılan dağınık aydınlatmanın hızlı bir tahminini sağlamak için yüzey normal vektörüne dayalı küp haritasına erişir. Bu yöntemin bir dezavantajı, bir çatı penceresini düzgün bir şekilde temsil etmek için küp haritalarını hesaplamanın çok karmaşık olmasıdır; Son zamanlardaki bir süreç, küp haritasından düşük frekanslı dağınık aydınlatmayı en iyi temsil eden küresel harmonik temeli hesaplamaktır. Bununla birlikte, ışıklık aydınlatmasını etkili bir şekilde modellemek için önemli miktarda araştırma yapılmıştır.

dinamik yansıma

Küp haritalı yansımalar iş başında

Temel ortam eşlemesi, statik bir küp eşlemi kullanır - nesne hareket ettirilebilir ve bozulabilir, ancak yansıtılan ortam tutarlı kalır. Bununla birlikte, bir küp haritası dokusu, dinamik olarak değişen bir ortamı temsil etmek için tutarlı bir şekilde güncellenebilir (örneğin, rüzgarda sallanan ağaçlar). Dinamik yansımalar oluşturmanın basit ama maliyetli bir yolu, her kare için çalışma zamanında küp haritaları oluşturmayı içerir. Bu, ek işleme adımları nedeniyle statik eşlemeden çok daha az verimli olsa da, yine de etkileşimli oranlarda gerçekleştirilebilir.

Ne yazık ki, bu teknik, birden fazla yansıtıcı nesne mevcut olduğunda iyi ölçeklenmez. Her yansıtıcı nesne için genellikle benzersiz bir dinamik ortam haritası gerekir. Ayrıca, eğer yansıtıcı nesneler birbirini yansıtabiliyorsa başka komplikasyonlar da eklenir - dinamik küp haritaları, ışın izleme kullanılarak normal olarak oluşturulan etkilere yaklaşık olarak yinelemeli olarak oluşturulabilir.

Küresel aydınlatma

ICCVG 2002'de bir küp harita veri yapısı kullanılarak etkileşimli oranlarda küresel aydınlatma hesaplaması için bir algoritma sunuldu . [1]

Projeksiyon dokuları

Video oyunlarında yaygın olarak kullanılan bir başka uygulama da projektif doku haritalamadır . Bir ortamın görüntülerini çevreleyen sahneye yansıtmak için küp haritalarına dayanır; örneğin, bir nokta ışık kaynağı, bir fener kafesinin veya içinden ışığın filtrelendiği bir pencere çerçevesinin içinden çekilen panoramik bir görüntü olan bir küp haritasına bağlanır. Bu, bir oyun geliştiricisinin sahne geometrisini karmaşıklaştırmadan veya pahalı gerçek zamanlı gölge hacmi hesaplamalarına başvurmadan gerçekçi aydınlatma elde etmesini sağlar .

Bellek adresleme

Bu çizim, bir küp haritasının nasıl indekslendiğini ve adreslendiğini gösterir.

Bir küp dokusu, Positive X, Negative X, Positive Y, Negative Y, Positive Z, Negative Z olmak üzere 0'dan 5'e kadar altı doku haritasını indeksler. Pozitif X ve Y yüzleri Z koordinatını tersine çevirmeli ve Negatif Z yüzü X koordinatını olumsuzlamalıdır. Yüz ve doku koordinatları verilirse, normalleştirilmemiş vektör şu fonksiyonla hesaplanabilir:

void convert_cube_uv_to_xyz(int index, float u, float v, float *x, float *y, float *z)
{
  // convert range 0 to 1 to -1 to 1
  float uc = 2.0f * u - 1.0f;
  float vc = 2.0f * v - 1.0f;
  switch (index)
  {
    case 0: *x =  1.0f; *y =    vc; *z =   -uc; break;	// POSITIVE X
    case 1: *x = -1.0f; *y =    vc; *z =    uc; break;	// NEGATIVE X
    case 2: *x =    uc; *y =  1.0f; *z =   -vc; break;	// POSITIVE Y
    case 3: *x =    uc; *y = -1.0f; *z =    vc; break;	// NEGATIVE Y
    case 4: *x =    uc; *y =    vc; *z =  1.0f; break;	// POSITIVE Z
    case 5: *x =   -uc; *y =    vc; *z = -1.0f; break;	// NEGATIVE Z
  }
}

Benzer şekilde, bir vektör şu fonksiyonla yüz indeksine ve doku koordinatlarına dönüştürülebilir :

void convert_xyz_to_cube_uv(float x, float y, float z, int *index, float *u, float *v)
{
  float absX = fabs(x);
  float absY = fabs(y);
  float absZ = fabs(z);
  
  int isXPositive = x > 0 ? 1 : 0;
  int isYPositive = y > 0 ? 1 : 0;
  int isZPositive = z > 0 ? 1 : 0;
  
  float maxAxis, uc, vc;
  
  // POSITIVE X
  if (isXPositive && absX >= absY && absX >= absZ) {
    // u (0 to 1) goes from +z to -z
    // v (0 to 1) goes from -y to +y
    maxAxis = absX;
    uc = -z;
    vc = y;
    *index = 0;
  }
  // NEGATIVE X
  if (!isXPositive && absX >= absY && absX >= absZ) {
    // u (0 to 1) goes from -z to +z
    // v (0 to 1) goes from -y to +y
    maxAxis = absX;
    uc = z;
    vc = y;
    *index = 1;
  }
  // POSITIVE Y
  if (isYPositive && absY >= absX && absY >= absZ) {
    // u (0 to 1) goes from -x to +x
    // v (0 to 1) goes from +z to -z
    maxAxis = absY;
    uc = x;
    vc = -z;
    *index = 2;
  }
  // NEGATIVE Y
  if (!isYPositive && absY >= absX && absY >= absZ) {
    // u (0 to 1) goes from -x to +x
    // v (0 to 1) goes from -z to +z
    maxAxis = absY;
    uc = x;
    vc = z;
    *index = 3;
  }
  // POSITIVE Z
  if (isZPositive && absZ >= absX && absZ >= absY) {
    // u (0 to 1) goes from -x to +x
    // v (0 to 1) goes from -y to +y
    maxAxis = absZ;
    uc = x;
    vc = y;
    *index = 4;
  }
  // NEGATIVE Z
  if (!isZPositive && absZ >= absX && absZ >= absY) {
    // u (0 to 1) goes from +x to -x
    // v (0 to 1) goes from -y to +y
    maxAxis = absZ;
    uc = -x;
    vc = y;
    *index = 5;
  }

  // Convert range from -1 to 1 to 0 to 1
  *u = 0.5f * (uc / maxAxis + 1.0f);
  *v = 0.5f * (vc / maxAxis + 1.0f);
}

İlgili

Deneme için geniş bir ücretsiz küp haritası seti: http://www.humus.name/index.php?page=Textures

Mark VandeWettering, MC Escher'in ünlü Yansıtıcı Küreli kendi otoportresini aldı ve bu küp eşleme görüntülerini elde etmek için eşlemeyi tersine çevirdi: sol , sağ , yukarı , aşağı , arka , ön . İşte bu görüntüleri kullanan bir üç.js demosu (en iyi şekilde geniş tarayıcı penceresinde görüntülenir ve demoyu görüntülemek için sayfayı yenilemeniz gerekebilir): https://web.archive.org/web/20140519021736/http:// threejs.org /examples/webgl_materials_cubemap_escher.html

Diğer çevresel projeksiyonları da bir küp haritasına dönüştürebilirsiniz (örneğin , eşkenar dörtgen projeksiyondan küp haritasına )

Referanslar

Ayrıca bakınız