Oyuncuların renk kalitesini kaybetmeden görüntüleri "Boyamasını" Sağlamanın En İyi Yolu?


41

Bir 2.5D izometrik (2D görüntü) oyunu yaratıyorum.

Oyuncuların zırhlarını, kıyafetlerini ve diğer şeylerini "boyamasını" istiyorum. Her şeyin gri tonlamalı olmasının, daha "doğal" renklenmelerden bazılarını kaybetmeye yol açtığını biliyorum. Örneğin, kırmızı / sarı gri tonlamalı bir ejderha yapmak ve daha sonra bindirme rengini uygulamak, ikincil rengin tüm kaybıyla tamamen kırmızı bir ejderhaya yol açar. Bu arada, aynı Kırmızı / Sarı Ejder Mavisi'ni ölmek onu harika görünen Mavi / Beyaz yapar.

Oyunumdaki karakterlerin çok çeşitli donanımları yok. Oyun League of Legends'ın karakterleri ve grafikleri nasıl ele aldığına daha yakın. Tek tip bir karakter olabilir (örn. Kahraman) ancak karakter için seçenek olarak çoklu kıyafetler olabilir. Oyuncuların sınırlı sayıda "kıyafet" ve karakterlerde mümkün olduğunca fazla kişiselleştirme yapabilmelerini istiyorum.

Bu yüzden oyuncuların bir karakter seçmesini, birkaç silahtan birini seçmesini, bir dizi kostüm seçeneğinden birini (karakterlerin üzerine yerleştirilmiş) seçmesini ve ardından her şeyin çoğunu boyamasını istiyorum (silahlar için belirli bir metalik renk seçin, herhangi bir rengi seçin) hiç giyim için).

Bazı renkleri kaybetmeden gri tonlamayı kullanabilseydim, yapardım.

İşte neden bahsettiğime dair bir örnek:

görüntü tanımını buraya girin görüntü tanımını buraya girin görüntü tanımını buraya girin

Photoshop'un "Renk Yerleşimi" seçeneklerinde ne kullanırsam kullanın, Dragon'u "boyamak" bile mümkün değil. Açıkçası, gri tonlamalı kullanarak daha iyi renklendirmek mümkün olduğunda yanlış yapıyorum. Yeşil veya Sarı veya Açık Mor gibi bir renk için bu işe yarar. Başka bir renk için, sanatı yok eder.

Ancak, gri tonlama DEĞİLDİR ve daha sonra orijinal (Kırmızı / Sarı) görüntüye "HUE" renk uygularsam çok daha iyi görünüyor.

Kırmızı Ton görüntü tanımını buraya girin

Mor Tonu görüntü tanımını buraya girin

Şimdi oyuncular Ejderha HERHANGİ rengini boyayabilir ve yine de harika görünür! (Sarı, gökkuşağının herhangi bir rengine dönüşürken sarı, beyaz olur.)

Bu, BEYAZ veya SİYAH'ın en iyi ikincil renk olduğu anlamına mı geliyor? O zaman beyaz (ikincil) rengi farklı bir şeye değiştirmek için bir çeşit yöntem veya gölgelendirici kullanın.

Tek bir görüntü çekmenin ve renklendirmeye bağlı olarak farklı pikselleri boyamanın bu karmaşık yönteminde herhangi bir makale var mı?

Ejderha için, Beyaz / Siyah yüksek Kontrast Ejderha olarak en iyi şekilde çalışır mı? Kırmızı / Sarı en iyi renk kümesi midir? Görüntüler için denediğim birkaç renkten daha iyi çıkıyor. Gri Tonlama hala üstün mü?

Photoshop'un "Karıştırma Seçenekleri", bir video oyunu için görüntüleri uygun şekilde "boyama" yöntemini içermiyor mu? Daha iyi bir başarı elde etmeme izin veren karmaşık Shaderlar / Yöntemler var mı?

Not: GrayScale, görüntülerimin RAM tüketimini azaltmama veya kayıplı sıkıştırma sırasında kalite kaybını önlememe izin veriyorsa, bu ciddi bir şekilde düşünürdüm.


5
Bu yasal olarak ilginç. Bunu oylayacağım ve biraz daha dikkat çekeceğini umuyorum. Renk teorisi harika bir konudur.
Evan,

Ton dönüşü 2B'ye rağmen bir olasılıktır - 3B olarak çalışıp çalışmadığını bilmiyorum.
ashes999

Teşekkürler Evan. Bunun son derece ilginç olduğunu ve kendi zamanımda araştırdığım en iyi konulardan birinin de aynı fikirdeyim. Bu tür bir çalışma, sanırım nadiren yapılır çünkü bir sanatçıya ihtiyaç duyar, fakat sadece herhangi bir sanatçıya değil - renk teorisi, video oyunu gölgelendiricileri, hatta bir sanatçı kodlayıcısı ile ilgilenen bir sanatçı. Hem sanatta hem de programlamada üstün olan birini bulmanın nadir olduğunu hayal edebiliyorum. Bu konuda google'da hiçbir araştırma yapılmayacak. Özellikle hangi anahtar terimlerin araştırılacağına dair bir fikri olmayan biri için. Ben kesinlikle bir sanatçı değilim.
Carter81

Yanıtlar:


19

Ton değiştirme, renk ayrıntılarını kaybetmeden bir dizi renk elde etmenizi sağlayan bir olasılıktır. Temel fikir, her pikseli RGB'den HSV alanına dönüştürmek, ardından tonu kullanıcı tanımlı bir miktarla dengelemek ve ardından RGB'ye geri dönüştürmektir. Aslında bu, RGB değerlerine bir dönme matrisi uygulanarak daha verimli şekilde yapılabilir: kullanıcı tanımlı ton açısına göre (1, 1, 1) ekseni etrafında dönen bir matris oluşturun. Sonra bu matrisi, piksel gölgelendiricinizdeki her RGB değerine uygulayabilirsiniz.

Bu, kırmızı-sarı ejderhanın sarı-yeşil, yeşil-mavi, mavi-mavi, mavi-kırmızı veya kırmızı-kırmızı bir ejderhaya geçmesine izin verecektir. İki renk bu yaklaşımla bağımsız olarak değiştirilemediğinden, bu biraz kısıtlayıcıdır. Orijinal görüntüde oluşturuldukları gibi göreceli renk tonlarını koruyacaklar. Ayrıca erişemediğiniz bazı renkler de vardır, örneğin, bu şekilde siyah beyaz bir ejderha yapamazsınız. Yine de, bu amaçlarınız için yeterli olabilir.

Başka bir olasılık, modelleriniz iki veya üç "ana renge" sahipse (burada kırmızı ve sarı), orijinal resmi her bir ana renk için ayrı bir renk kanalı kullanarak yazabilirsiniz. Bu durumda, ejderhayı kırmızı ve sarı yerine yeşil ve kırmızıya yazardınız ve eğer üçüncü bir renge sahipseniz mavi renkte yazabilirsiniz. Ardından, kullanıcının üç ana rengi seçmesine izin verebilir ve görüntüdeki kırmızı, yeşil ve mavi değerlerini harmanlanması gereken kullanıcı tanımlı renklerin miktarları olarak kullanabilirsiniz. Böylece piksel gölgelendiriciniz şunun gibi görünür

finalColor = image.r * userColor1 + image.g * userColor2 + image.b * userColor3;

Bu, kullanıcıların siyah beyaz veya mor ve altın gibi şeyler de dahil olmak üzere istedikleri renk kombinasyonunu seçmelerine izin verir.


1
+1 sadece iyi bir cevap için değil, aynı zamanda nadir bir konuyla ilgili bir cevap için (renk teorisi). Bunu daha önce neden düşünmediğimi bilmiyorum. RGB. Kırmızı yeşil mavi. YAA! Tek tek kanalları manipüle etme kabiliyeti nedeniyle kullanılacak en iyi renkler muhtemelen tam üç renktir.
Carter81

1
Renk değişimi çok zor bir konudur çünkü görüntü bilgilerinin çoğu parlaklıkla iletilir ve basit ton değişimi parlaklığı korumaz. Farklı tonlar, farklı doğal parlaklık değerlerine sahiptir. Bunun için daha gelişmiş algoritmalara ihtiyacınız var.
API-Beast

10

Karşılaştığınız sorun, görüntünün tamamını sadece bir temel renkten öte, görüntünün tamamında “renklendirmeyeceğiniz” dir. Birinde, bir malzemeden diğerine ince degradeleriniz var, ancak daha da önemlisi temel renkten etkilenmeyen yansımalar, vurgulamalar ve gölgeler var. (Bunlar temel olarak üstüne eklenir.)

Bu yüzden görüntüyü bileşenlerine ayırmanız gerekiyor.

Bir örnek :

Bozulmuş Görüntü Renkli Örnekler

Bu durumda 3 katmanımız var:

  • Arka Plan - Bu, renklendirilmemesi gereken unsurları içerir.
  • Renkli olması gereken kısım - Bu renkle çarpılır. (Beyaz dışında bir renk belirtirseniz, OpenGL varsayılan olarak çoğalır.)
  • Önemli Noktalar - Bunlar tüm görüntünün üzerine eklenir. Ton değişimini taklit etmek için beyaz değil sarıdır. Nesneler sadece tek bir renk değildir, renk parlaklığı ile birlikte değişir.

+1. Ama "basitçe tüm görüntüyü" tonlayamazsınız "biraz yanıltıcıdır. Her şey onun oyunu için OP seçimine bağlı. Mesela Diablo II yaptı. Bu yüzden, "ihtiyaç duyamayacaksın / ihtiyacın olmaz" bölümleriyle o kadar katı olmayacağım. Bu seçeneklerden sadece biri, daha iyi görünümlü fakat daha fazla RAM tüketiyor.
Kromster,

1
@KromStern Point, her zaman yaparsanız, korkunç görünüyor.
API-Beast

Mükemmel cevap. Yine de bu otomasyonla mümkün mü? Tek bir karakter için binlerce animasyonlu görüntü varsa, her katmanı elle seçmek veya görüntüyü bir kerede ayrı ayrı çözmek mümkün değildir. Yine de, maskeleme kullanarak 3B'den görüntü oluştururken otomatikleştirmeye yardımcı olacak bazı geçici çözümler görebiliyorum, ancak yine de harika bir cevap.
Carter81

Baskın renkleri bularak ve bunları ayıklayarak otomatikleştirmek mümkündür (tersten "alfa renk" algoritması kullanarak). Ama böyle bir şeyi hiç uyguladım.
API-Beast

Vurguları çıkarmak için, daha önce çıkardığınız maskeyi alıp filtreleyebilirsiniz, böylece sadece en parlak bileşenlere sahip olabilirsiniz.
API-Canavar

3

Kişisel olarak istediğinizi elde etmek için maske dokularını kullanmanızı tavsiye ederim. Bu, ana RGB24 dokunuzun herhangi bir hassasiyetten ödün vermeden orijinal renk kalitesini korumasını sağlar. Ayrıca, ana dokunuzu renk maskenizle karıştırmanız için size bol miktarda sanatsal özgürlük sağlayacaktır.

Her maske, temel dokunuzun rengini özel renginizle doğrusal olarak enterpolasyon yapacak gri tonlamalı bir doku olarak görülebilir. Kullanıcılarınızın iki rengi özelleştirmelerine izin verdiğinizi varsayalım; piksel gölgelendiricisi şöyle görünür:

girişler: MainTexture (RGB), Mask1Texture (A), Mask2Texture (A), Colour1 (float), Colour2 (float)

Çıktı: (Mask1Texture + Mask2Texture) -MainTexture + Renk1 * Mask1Texture + Renk2 * Mask2Texture

Bu, bir maskenin bir piksel için ne kadar büyük bir değeri olduğuna göre, ana dokunuz o pikselin çıkış rengini o kadar az etkileyecektir. Örneğin, ejderha dokunuzu gri tonlamaya dönüştürebilir ve gövde renginden bağımsız olarak özel kanat rengine sahip olmak için kanatlarınız dışındaki her şeyi silebilirsiniz.

Bu tekniği mobil oyunlar için kullandım ve genel performansınızı etkilemeyecek. Doku başına% 33 daha fazla RAM'e mal olabilir, ancak kalite takası muhtemelen buna değer.

Ps Yalnızca bir özel renk kullanmayı düşünüyorsanız, RGBA32 ana dokunuzun Alfa kanalını maskeniz olarak kullanabilirsiniz.


2

renk paletlerini kullanabilir ve oynatıcının paleti düzenlemesine izin verebilirsiniz. Gölgelendiriciler kullanıyorsanız, 1D dokuları palet olarak ve orijinal gri değerini dizin olarak kullanabilirsiniz.

Gerçek renkli bir görüntüyü 255 renkli bir görüntüye dönüştürmek için tüm piksel renk değerlerinizi alabilir ve k-means algoritmasıyla 3B renk uzayında 255 kümeye gruplayabilirsiniz. Veya genel resim dönüştürme araçlarını kullanın. O zaman gri değer dokusunun enterpolasyonunun renkli dokularınızdaki indekslerin enterpolasyonu olacağını belirtmek önemlidir. Bu, orijinal görüntünüzün iki tekeri arasında birkaç rengin olduğu sonuca yol açabilir. Bu, enterpolasyonu devre dışı bırakarak (bunu yapmak istemediğinizi düşünüyorum) ya da renk paletinizi faydalı bir şekilde sıralayarak çözülebilir.


Bu temelde benim de düşündüğüm şeydi. Cevabı biraz daha eksiksiz bir şeye genişletmek isteyebilirsiniz. Temel olarak, kullanıcının iki renk seçmesine izin verdiniz (veya daha fazla veya daha az, ancak argüman uğruna, 2), iki renkten soluk bir 1D doku yapın. 1D dokusunda referans olarak kullanılan geometri üzerinde gri tonlamalı bir doku kullanın. Kullanıcının çirkin renkleri ayarlaması hala mümkündür, ancak en azından güzel kontrast renk seçimleri yapma seçeneğine sahiptir.
wrosecrans

evet, 255 renk paletinin tamamını daha az kullanıcı renginden de elde edebilirsiniz, ancak burada sadece denemenizi tavsiye ederim. Birçok eski oyunun renk paletindeki değişiklikleri canavarlarında değişiklik yapmak için kullandığını biliyorum. Sanırım Diablo yaptı.
Arne,

1

görüntüyü gri görüntüye dönüştürebilirsiniz, ancak yine de rgba kanallarıyla kaydedebilirsiniz. Bir ağırlık değerini alfa kanalında saklayın ve daha sonra, bir piksele ne kadar boya uygulanacağına karar vermek için bunu kullanın. bu ağırlık, rengin beyaza ne kadar yakın olduğuna bağlı olarak hesaplanabilir. beyaza ne kadar yakınsa piksel o kadar az boya uygulanmalı ya da ağırlık o kadar düşük olmalıdır. bu, çoğu parlaklığı orijinal hafifliği ile bırakacaktır, ancak boyaya biraz uygulayacaktır. Son piksel rengi daha sonra Ro + (Rd * Ao) her kanalın hesaplanmasıyla bulunabilir; burada Ro, orijinal kırmızıdır, Rd, boya rengindeki kırmızıdır ve Ao, orijinalin Alfa'sıdır. bu nedenle tüm beyaz pikseller yeni renk almaz ve tüm siyah pikseller boya rengini alır.

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.