Bir modelin belirli bölümlerini nasıl renklendirirsiniz - RTS oyunları gibi bu takım renkleri var?


16

RTS oyunlarında gördüğümüz bir şeyi uygulamaya ihtiyacım var: takım renkleri. Temel olarak, bir modelin belirli kısımlarını renklendirmenin bir yolunu arıyorum. Bunu nasıl başarabilirim? Nereden başlayacağımı bile bilmiyorum. Önce 3d modelde bazı ayarlamalar yapmam gerekir mi?

Yanıtlar:


18

Bunu nasıl yapacağım, birimlere uyguladığınız doku haritalarına dayanır. Çoğu şey için, renklendirilmesi gereken bazı bölgeler ve bazılarında olmayan. Örneğin, normal bir tankınız olabilir, ancak bazı bayrakların rengini değiştirmek istersiniz.

Dokuyu renkli bölgeler gri tonlamalıymış gibi boyarsanız, hangi bölgelerin renklendirilmesi gerektiğini belirtmek için alfa kanalını kullanabilirsiniz.

Böylece gölgelendiricinizde gidebilirsiniz (en basit şekilde):

float3 finalColor;
if (colorFromTex.a > 0)
 finalColor = colorFromTex.rgb;
else
 finalColor = colorFromTex.rgb*myTintColor.rgb;

Zor bir geçişiniz olacak ve gölgelendiricinizde bir dal olacak. Bunun yerine gitmek daha iyidir:

float3 finalColor = lerp(colorFromTex.rgb, 
    colorFromTex.rgb*myTintColor.rgb, colorFromTex.a);

DirectX gölgelendiriciyi 3ds Max'te 3B modellere nasıl getireceğinizi biliyor musunuz? Bir tür gölgelendirici ile bir malzeme ayarlamaya ve gölgelendiriciyi ReplaceColor.fx'e ayarlayıp modeli dışa aktarmaya çalıştığımda sonuç çıktı Error 1 Missing asset "C:\Users\Kai\AppData\Local\Temp\fbx.shader.temp.1064.2756\ReplaceColor.fx". Bunu nasıl düzeltebileceğimi anlamıyorum.
rFactor

Yüklediğinizde mi? FBX'teki yolun geçici bir klasöre işaret etmesi garip görünüyor. Bu dosya var mı? FBX'i 3ds Max'ten dışa aktarmaya çok aşina değilim ama belki yolları göreli hale getirmek için dosyaları düzenlemeniz (veya bir seçenek belirlemeniz) gerekebilir.
Lucas

İyi bir teknik, ancak alfa kanalını "tintability" yi belirtmek için kullanıyorsanız, finalColor'ınızdaki alfa bileşenini sıfırlamayı unutmayın.
charstar

3

Bir teknik, her model için iki doku setine sahip olmaktır - biri kırmızı, diğeri mavi. Daha sonra karakterin hangi takıma atandığına bağlı olarak, bu doku kümesini uygular.

Açıkçası bu sadece iki ekibiniz varsa işe yarar. Eğer ikiden fazla ile kaçabilirken, verimsiz olmaya başlar.

Başka bir yol, iki dokuyu karıştırmaktır - ilki model için temel doku, ikincisi çalışma zamanında üretebileceğiniz renkli bir kaplamadır.

Üçüncü yol, temel modelin rengini değiştirmek ve takımın renklerini göstermek istediğiniz modelin parçaları üzerinde hiçbir dokuya (veya kısmen saydam dokulara) sahip olmamak olabilir.


2

Takım rengine bir doku alfa kanalı ayırmak DXT dokularını 2 kat büyütür, bu yüzden takım rengini hesaplamak için chroma key kullanmayı tercih ederim . Tek bir rengi (örn. Yeşil, mavi, macenta) dokularınızda "ayrılmış renk" olarak belirleyin.

Motor açıldığında, her bir takım rengi için "ayrılmış rengi" takım rengine döndüren bir matris yapın. Bir takım nesnesi çizmeden hemen önce, bu matrisi piksel gölgelendirici sabiti olarak ayarlayın.

Piksel gölgelendiricide, piksel rengini takım renk matrisine dönüştürün. Dönüştürülmemiş piksel rengini, dönüştürülen piksel rengiyle, pikselin renk değerinin "ayrılmış rengin" renk değerine göre orantılı bir miktarda ekleyin.

Bu size bazı ALU komutlarına ve piksel gölgelendiricisinde tetiklemeye mal olacak, ancak bu, doku önbelleğinizi 2 kat büyük dokularla şişirmekten çok daha ucuz.

Ayrıca, her renge bir doku kanalı ayırmadan birden fazla chroma key (örn. Macenta ve mavi, birincil ve ikincil takım rengine eşleştirilebilir) özelliğine sahip olabilirsiniz.


1

Benim tekniğim: 2 dokuya sahip olmak: bir ana doku, ana üzerine üst üste binen ikinci bir doku ama sadece renklendirmek istediğiniz parçalar. İkinci dokunun rengini istediğiniz gibi değiştirin.

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.