Bir kart oyunundaki kartlar için alt gölge efekti çizmek için hangi oluşturma tekniklerini kullanırım?


13

Bunun gibi gölgeler oluşturmak için ne tür gölgeleme algoritması kullanılabilir? resim açıklamasını buraya girin

yaptığım benzer ama hepsi OpenGL tarafından desteklenen bir 2D çizim API ile yapılır, bu yüzden Z koordinatı yoktur.

Buna ek olarak, elin kendisi için, burada görüldüğü gibi gölgeli bir his almak istiyorum: resim açıklamasını buraya girin

Buna yakın gölgeli bir görünüme nasıl ulaşacağımdan emin değilim.

Kartların sayısı değişmek zorunda ve kartlar masaya atılıyor, bu yüzden herhangi bir tür hafif harita kullanamıyorum.

Ne tür algoritmalara bakmalıyım (yapmam gerektiğini bildiğim bulanıklık dışında)?

Teşekkürler

Güncelleme

2D kart oyunu yapıyorum. Biraz gibi kartlardan ofset dropdowdows eklemek istiyorum:

resim açıklamasını buraya girin

Bunu yapmayı düşündüğüm yol:

  • Backbuffer ile aynı boyutta bir doku tutun.
  • Bu dokuya geçici kartlar olarak koyu dikdörtgenler çizin.

  • O dokuyu bulanıklaştırın.

  • Kartlarımı o dokuya çiz.
  • Kartlara ek aydınlatma yapın.
  • Bu dokuyu backbuffer'a çiz.

Sorularım:

  • Bunu yapmanın doğru yolu bu mu?


  • Dokuya render olmadan yapmanın bir yolu var mı (bir bitmap'i backbuffer kadar büyük tutmak )?

  • Maksimum doku boyutunun
    , arka tampon boyutu tarafından aşılmayacağını varsaymak güvenli midir? (Demek istediğim, backbuffer
    2000x3000 ise, o zaman
    video belleğinde bir doku oluşturabildiğimi söylemek güvenli mi?

Teşekkürler


1
İkinci sayınızda estetik bir nokta: Bu kartları elinizde tutuyorsanız, bu gerçekten mümkün değil . Yan yana bastırılan kartlar birbirini gölgede bırakmıyor. Eğer bir tutuyorsun sürece olmaz çok onlardan. Kartları gerçekten bu resimde gösterildiği gibi tutamazsınız; bu kartlar birkaç milimetre ile ayrılmış gibi görünüyor; birbirlerine karşı düz değiller. Sadece bunun için endişelenmezdim.
Nicol Bolas

Yanıtlar:


18

Herkesin bu soruna çok karmaşık çözümler verdiğini düşünüyorum.

resim açıklamasını buraya girin

İlk olarak, burada (a) ile tasvir edilen kartımız (veya çizmek istediğiniz her şey) var. Ardından, bir kopyasını alıyoruz, siyahla dolduruyoruz ve üzerinde bir gauss bulanıklığı yapıyoruz (b). Tüm bunlar photoshop'ta veya favori sanat aracınız ne olursa olsun gerçekleşir.

Daha sonra, oyun içinde, kartı çizmek istediğimizde, önce bulanık siyah görüntüyü çarpımsal (veya alfa) harmanla çizin, bir yönde biraz kaydırın ve ardından kartı bunun üzerine çizin. Voila.

Daha fazla hile için, (d) gibi etki elde etmek için gölge ve kart render arasında geçiş yapabilir veya önce tüm gölgeleri ve ardından kartları (e) (örneğin) ( hala ayrı =)

Daha ince, saydam gölgeler oluşturmak için gölgede saf siyah (veya tam alfa) kullanmamak da en iyisidir.


2
Gölgeleri oyun dışında yapmak için +1. Ayrıca bir adım daha ileri gidebilir ve sahnede bir ışık varsa gölgenin nereye yerleştirileceğini değiştirebilirsiniz.
FrenchyNZ

+1, güzel illüstrasyon. Ayrıca, E'nin olması durumunda masaya koyu gölgeler ve şablonlu kartlarda yarı parlak kullanabilirsiniz. Bu daha karmaşık olacak, ancak etkisi daha da güzel olacak :)
Kromster

2

İlki çok zor değil. Kart eliniz için bir alfa kanalı oluşturursanız (içinde bir kart bulunan bir piksel için siyah ve saydam için beyaz olan kadar basit olabilir), yalnızca alfa kanalında istediğiniz herhangi bir bulanıklığı gerçekleştirebilirsiniz ve sonra ofset ve tablonun ışık kontrol etmek için kullanın. (Eğer Z-tampon yoksa Tahminen, sen, o zaman maske ile tablo yapmak, ilk yerde ekran dışında alfa kanalı dışarı işlemek olurdu o zaman gerçek kartları kılmak.)

İkincisi biraz SSAO'ya (ekran alanı ortam tıkanıklığı) benziyor. Bu teknik bir Z koordinatı gerektirir. Ancak, kartlar arasında değişen açılara sahip değilseniz (Z tamponunuz yoksa tahmin edebileceğim şey budur), muhtemelen her biri için bir alt gölge (ilk gibi) oluşturarak oldukça iyi bir yaklaşım yapabilirsiniz. kartı. Performans biraz zor olabilir - her düzlemin üstündeki tüm uçaklar için bulanık bir alfa kanalına ihtiyacı vardır ve masada bir grup kart varsa, bu birkaç render geçişi olabilir.


SSAO aşırıya kaçmış =) Örneği animasyonlu görmeden hangi gölgeleme tekniğinin kullanıldığını söylemek çok zor. Kartlar her zaman bu sırayla ve üst üste yerleştirilirse, gölgeleri önceden oluşturmak en kolayı olurdu, ancak oyunu çalışırken gördüğünüzü asla bilemezsiniz.
Patrick Hughes

0

Gölge haritası yapamaz mısın? Sahneyi bir fbo'ya dönüştürün. Sadece derinlik değerlerini kaydedin ve gölgenin oluşturulup oluşturulmayacağını görmek için gölgelendiricideki normal derinlik değeri kontrolünü yapın.


Z Tampon kullanmıyorum, 'derinlik' yok.
jmasterx

0

Aşağıdaki işlem, ekran dışı oluşturma hedefi gerektirmez. Bununla birlikte, ilk önce tablonun çizilmesi zorunluluğu kazanır . Veya en azından, tablo çizilmeden önce tablonun kaplayacağı piksellerin üzerine hiçbir şey çizilmez. Ayrıca tablonun kendisinin tek, üst üste binmeyen bir parça olmasını gerektirir: bir görüntü.

Ayrıca, çerçeve aracınızın bir alfa bileşenine ihtiyacı vardır.

  1. Kartın gri tonlamalı görüntüsünü alın. Büyük olasılıkla boyutunu genişleterek kenarların etrafında bulanık hale getirin. Bu sizin gölge kartınızın görüntüsü. Bunun tek kanallı bir görüntü olduğunu unutmayın. Gölgelendiricinizde bu dokuya eriştiğinizde, tek bir değeri alfa bileşenine koyduğunuzdan emin olmalısınız. Bu, gölgelendiricinizde veya başka bir yerde yapılabilir.

    Görüntüdeki 0.0 değeri gölge olmadığı anlamına gelir. Görüntüdeki 1.0 değeri toplam gölge anlamına gelir . Yani, tamamen zifiri karanlık. Muhtemelen en koyu rengin olarak 0,5 ya da daha fazla bir değer istersiniz.

  2. Alfa sıfıra ayarlanacak şekilde ekranı temizleyin .

  3. Herhangi bir şey (veya en azından tablonun altında " oluşturulacak herhangi bir şey) oluşturmadan önce , her bir kart için, bulanık dokuyu, kartın gerçek konumundan uzaklaştırarak (ancak aynı yönde) yapın. Gölgelendiricinin renk çıktısı şu olmalıdır: Bunun için karışım yapılandırması (OpenGL ifadesinde) olmalıdır:

    glBlendEquation(GL_MAX);

    Bu karışım modu, çakışan gölgelerin daha koyu veya daha açık büyümesini önlemek için kullanılır. Bu piksele yazılan en koyu değeri alır. Yeterince iyi görünmeli.

    Renk yazmalarını kapatmak için renk yazma maskesini de kullanmalısınız.

  4. Tabloyu işleyin. Bunu yaparken Karışım aşağıdaki gibi ayarlanmalıdır:

    glBlendEquation(GL_ADD);
    glBlendFunc(GL_ONE_MINUS_DST_ALPHA, GL_ZERO);

Kısıtlamalar sizin için çok kısıtlayıcıysa, bir oluşturma hedefi kullanmanız gerekir. Bu aşağıdaki gibi yapılır:

  1. Gölge kartı görüntüsünü önceki gibi oluşturun.

  2. İlk önce gölgeleri oluşturun. Gölge çerçeve tamponunu bağlayın (donanımınız bunlardan birine işleyebiliyorsa, yalnızca tek kanallı bir resim olması gerekir). Değerini sıfıra getirin.

  3. Her kart için gölge kartı görüntüsünü önceki gibi kaydırın. Gölgelendiriciniz, çıktı renginin dört bileşenine de aynı değeri yazmalıdır. Karışım modu tekrar olmalıdır glBlendEquation(GL_MAX).

  4. Normal çerçeve arabelleğine geri dönün. Gölgelenmek istediğiniz her şeyi çizin.

  5. Şimdi oluşturduğumuz gölge görüntüsüyle tam ekran dörtlü çizin. Gölgelendirici, gölge görüntüden getirilen texeli çıktının alfasında saklamalıdır; RGB önemsizdir. Karışım modu şöyle olmalıdır:

    glBlendEquation(GL_ADD);
    glBlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_ALPHA);

İlk yöntemde, adım 5'i unuttuğunuzu düşünüyorum: harmanlamayı devre dışı bırakın ve kartları oluşturun. Ayrıca, ilk yöntemin OP'nin ikinci ekran görüntüsünde görüldüğü gibi kartlar arası gölgeler elde etmenize izin vermediğini belirtmek gerekir.
Nathan Reed

@NathanReed: Şeyleri nasıl kapatacağını bildiğini düşündüm. Ayrıca, sorunun altındaki yorumumda belirttiğim gibi, "kartlar arası gölgeler" hiçbir anlam ifade etmiyor.
Nicol Bolas

1
Kartları gerçekten nasıl tutacağınızı gerçekçi bir şekilde temsil etmeyebilir, ancak havalı görünüyor! İlk atışta olduğu gibi kartların masanın üzerinde yüzmesi de gerçekten mantıklı değil ...
Nathan Reed

0

Şablon tamponunu kullanırdım. 1'e kadar temizleyin (tercihen derinliği temizlerken aynı anda), masanızı çizin. Sonra şablon testini etkinleştirin, bulanık bir dikdörtgen doku kullanarak gölgeleri çizin, şablon ve derinlik geçişi arttıkça, şablon başarısız olursa hiçbir şey yapmayın, derinlik başarısız olursa hiçbir şey yapmayın ve şablon fonunuzu GL_EQUAL (ref 1, maske 0xff) olarak ayarlayın, şablon testini devre dışı bırakın . (Bunu tam olarak test etmedim, ancak benzer olan ve iyi çalışması gereken koddan türetilmiştir; parametreleri değiştirmeniz gerekebilir ). Sonra her şeyi çizin.

Aramalar:

glEnable (GL_STENCIL_TEST);
glStencilFunc (GL_EQUAL, 1, 2);
glStencilOp (GL_KEEP, GL_KEEP, GL_INCR);

// draw shadow textures

glDisable (GL_STENCIL_TEST);

Bu sorun yaratabilecek tek zaman, hafifçe örtüşen iki bulanık kenarınız varsa; Aksi takdirde, temel OpenGL 1.1'in sunduklarının ötesinde hiçbir şeye ihtiyaç duymaz ve tüm donanımlarda çalışır (belki de eski 3DFX kartlarını bekliyoruz, destekleme konusunda gerçekten endişelenmediğinizi varsayıyorum ...)

Performansı kritik olmayan bir oyunda çok iyi çalışması gereken ikinci bir alternatif ise glCopyTexSubImage2D. Bu, backbuffer'dan daha küçük bir doku ile de çalışacak ve tüm donanımlarda da iyi bir şekilde desteklenecektir (OpenGL 1.1 ve Doom 3'ün bir parçası kullanmıştır, böylece desteğin çok iyi olmasını bekleyebilirsiniz).

Temel kurulum şu şekilde olur:

  • Açık renk siyah.
  • Derinlik yazmayı devre dışı bırakın (bu yöntemin bir derinlik arabelleğine ihtiyacı olmamasına rağmen, kullanmadığınız için bu parçayı yoksayabilirsiniz).
  • Dokunuzla aynı boyutlarda bir görünüm ayarlayın.
  • Kartları beyaz dolgulu geometri olarak çizin.
  • dokularınız için glCopyTexSubImage2D.
  • Görünüm penceresini tam pencere boyutuna geri getirin.
  • Tabloyu normal şekilde çizin.
  • Bulanıklaştırmak ve rengi tersine çevirmek için bir gölgelendirici kullanarak tam ekran harmanlanmış dörtlü olarak doku çizin.
  • Diğer her şeyi çizin.

Bu da çok iyi çalışmalı, şablon tampon yönteminden biraz daha fazla GPU yoğun ama örtüşen davayı doğru bir şekilde ele alıyor ve - dediğim gibi - sizin gibi bir oyunun düşük uçta bile GPU gücüne sahip olacağını düşünüyorum kartı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.