XNA “Burn” Etkisi ile Krater Ekleme (GPU ile)


11

Şu anda XNA'da bir 2D "Solucanlar" klonu üzerinde çalışıyorum ve özelliklerden biri "deforme edilebilir" arazi (örneğin bir roket araziye çarptığında, bir patlama ve arazinin bir kısmı yok oluyor).

Şu anda bunu nasıl yaptığım, merkeze yaklaştıkça giderek daha yüksek bir Kırmızı değerine sahip bir doku kullanmaktır. Bu "Deforme" dokusunun her pikselinde dolaşıyorum ve mevcut piksel bir arazi pikseliyle örtüşüyorsa ve yeterince yüksek bir kırmızı değere sahipse, araziyi temsil eden renk dizisini saydam olarak değiştiririm. Geçerli pikselin yeterince yüksek bir Kırmızı değeri yoksa, arazi rengini karartırım (Kırmızı değeri eşik değerine yaklaştıkça kararır). Bu işlemin sonunda arazi yapımı güncellemek için SetData kullanıyorum.

Bunun, sadece boru hattı tezgahları ve benzerlerini okuduğum için değil, aynı zamanda birçok krater eklenirse oldukça tembel olabileceği için bunu yapmanın iyi bir yolu olmadığını anlıyorum. Krater Üretimimi GPU'da yeniden oluşturmak istiyorum, bunun yerine hedef ile değiştirilecek doku olmak arasında "ping-ponging" Oluşturma Hedefleri'ni kullanmak istiyorum. Sorun bu değil, bunu nasıl yapacağımı biliyorum. sorun, bu yöntemi kullanarak yanma efektimi nasıl koruyacağımı bilmiyorum.

Yakma efekti şu anda şöyle görünüyor:

Yanma Etkisi

Herkes nasıl benzer bir yanık efekti oluşturmak için bir fikrim var mı (oluşan krater çevresindeki kenarları koyulaştırma)? Shaders'ı tamamen bilmiyorum, ancak gerektiriyorsa, birisinin bana nasıl yapılacağına dair bana gerçekten minnettar olurum. Eğer harika olabilecek başka yollar da varsa.


Yanıtlar:


7

Bunu yapmanın bir yolu yaptığınız şeye benzer. Bir "Hasar" dokusuna ve gerçek arka plan dokusuna sahip olun, ancak verileri her seferinde kopyalamak yerine, ikisini iki ayrı doku olarak tutun.

Bir patlama yapıldığında, Hasar dokusu üzerinde biraz şeffaf bir kenara sahip bir daire çizin. Bu "yanma" alanı olacak.

Araziyi her çizdiğinizde, GPU'ya her iki dokuyu da verin ve gölgelendiricinizin arka plan piksellerinin rengini (.rgb) 1 - hasar dokusunun alfa değeri ile çarpmasını sağlayın. Tamamen siyah piksellerden kurtulun (bunları 0 olarak alfalayın veya yarı saydam yanık alanlara bağlı olarak bunu alfa ile de (.rgb yerine .rgba) çarpabilirsiniz) ve voila!

Bunun en iyi çözüm olduğundan şüpheliyim , ancak daha önce yaptığınızla oldukça benzer ve aktarımı kolaylaştırabilir. Muhtemelen Vector3'lerden (x, y, yarıçap) bir dizi geçerek ve bu patlama noktalarına dayanarak gölgelendiricide biraz matematik yapmakla da kurtulabilirsiniz, ancak bunun verimliliğinden emin değilim.

Bu yardımcı olur umarım!


Teşekkürler! Bu da bunu yapmanın havalı bir yolu ve söylediğin gibi şimdi yaptığım gibi. HLSL hakkında hiçbir şey bilmiyorum ama kesinlikle bakacağım. Yapabileceğim başka bir yol, krater kenarına yaklaşırken onu karartmak, ama ben de bu şekilde deneyeceğim.
Benixo
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.