Mapping ve Hammer

GMod için özel texture oluşturma: VTF ve VMT nedir

Hammer ve GMod için özel texture'lar: görseli VTF olarak kaydet, VMT'yi yaz, dosyaları materials altında doğru yere koy ve tipik hataları düzelt.

Kendi görselin, onu VTF olarak kaydedip yanına materyali tanımlayan küçük bir .vmt metin dosyası eklediğinde bir texture'a dönüşür. İki dosya da garrysmod/materials/ altındaki bir alt klasöre konur. Hammer ve oyun her zaman materyalle, yani VTF'ye işaret eden VMT ile çalışır. Görsel boyutu, shader ve yol doğruysa texture hem Texture Browser'da hem de oyunda görünür.

İki dosya: VTF ve VMT

VTF (Valve Texture Format) görsel verisini tutar: pikselleri ve mipmap'leri, yani uzaktan kullanılmak üzere küçültülmüş sürümleri. VMT ise bir metin script'idir. Yüzeyi hangi shader'ın çizeceğini, bu shader'ın hangi texture'ları kullanacağını ve yüzeyin fiziksel olarak nasıl davranacağını, örneğin ayak sesini belirler.

Motor bir VTF'ye doğrudan erişmez, yalnızca bir materyal üzerinden erişir. Bu yüzden Hammer'da görsel dosyalarını değil, materyalleri seçersin. Birden fazla VMT aynı VTF'yi kullanabilir, örneğin biri brush'lar, biri modeller için.

Görseli hazırlama: boyut ve format

Genişlik ve yüksekliğin her biri ikinin kuvveti olmalıdır, örneğin 256, 512, 1024 ya da 2048 piksel, normalde en fazla 4096. Görselin kare olması gerekmez, 512 × 256 da çalışır. Kaynak görseli kayıpsız kaydet, örneğin TGA ya da PNG olarak. JPG, dönüştürme sırasında bir kez daha sıkıştırılan artefaktları beraberinde getirir.

VTF olarak kaydederken bir görsel formatı seçersin. Bunlardan dördü neredeyse her şeyi karşılar:

FormatPiksel başına bitAlfa kanalıNe için uygun
DXT14en fazla 1 bitsıradan opak texture'lar
DXT58varsaydamlık içeren texture'lar
BGR88824yokçok ince renk geçişleri, normal map'ler
BGRA888832varalfa kanallı ince renk geçişleri

DXT formatları kayıplı sıkıştırma yapar, diğer ikisi yapmaz. Bunun bedeli boyuttur: mipmap'ler olmadan 1024 × 1024'lük bir texture DXT1 olarak yarım megabayt, BGR888 olarak üç megabayt yer kaplar. Bu yüzden varsayılan olarak DXT1 ya da DXT5 kullan, sıkıştırılmamış formatları ise yalnızca sıkıştırmanın gözle görülür biçimde rahatsız ettiği yerlerde seç. 3D dünyadaki texture'lar için mipmap oluşturulmasını sağla.

Görseli VTF'ye dönüştürme

İki yol yaygındır:

  • VTFEdit ve ardılları. VTFEdit grafik arayüzlü bir programdır. Görseli File > Import ile yükler, formatı da içe aktarma penceresinde "Normal format" ve "Alpha format" altında ayarlarsın. Valve Developer Community'ye göre orijinalin bakımı artık yapılmıyor. Topluluk onu VTFEdit Reloaded ve VTFEdit++ adlarıyla sürdürüyor.
  • vtex. Valve'ın komut satırı programı, GMod ile birlikte bin klasöründe gelir. TGA dosyalarını dönüştürür ve onları garrysmod/materialsrc/ altında bekler. VTF, materials/ altındaki aynı adlı alt klasöre düşer. nocompress 1 gibi ayarlar, görselle aynı adı taşıyan bir metin dosyasına yazılır.

Kaydederken VTF sürümüne dikkat et: 7.4 ya da daha eskisi güvenli tercihtir. 7.5 sürümü daha yeni bir motor dalından gelir ve Valve Developer Community, GMod için yalnızca desteğin mümkün olduğunu söyler.

VMT'yi yazma

Bir VMT'yi herhangi bir metin editörüyle oluşturabilirsin. Anlamlı en küçük duvar materyali şöyle görünür:

LightmappedGeneric
{
	$basetexture "myname/mymap/wall_concrete01"
	$surfaceprop concrete
	%keywords "mymap"
}

İlk satır shader'ın adını verir, süslü parantezlerin arasındaki her satırda ise bir parametre ve değeri bulunur. Tırnak işaretleri yalnızca bir değer boşluk içerdiğinde gerekir. İlk önce şu parametrelere ihtiyacın olur:

  • $basetexture: VTF'nin yolu, materials/ klasörüne göre ve dosya uzantısı olmadan.
  • $surfaceprop: yüzey türü, örneğin concrete, metal, wood, dirt, glass ya da tile. Ayak seslerini, mermi isabet efektlerini ve diğer fiziksel özellikleri belirler.
  • $bumpmap: yüzeye ışık altında doku kazandıran bir normal map. Sonradan eklersen haritayı yeniden derle, çünkü bu tür yüzeyler ek lightmap'ler alır.
  • $envmap env_cubemap: en yakın env_cubemap entity'sinden gelen yansımalar. Ancak cubemap'ler oluşturulduktan sonra görünürler. Daha fazlası cubemap yansımalarını düzeltme yazısında.
  • $translucent 1 ya da $alphatest 1: ikisi de texture'ın alfa kanalını kullanır. $translucent camdaki gibi yumuşak geçişlere izin verir, ama üst üste binen yüzeyler arasında sıralama hatalarına yol açabilir. $alphatest yalnızca görünür ya da görünmez ayrımını bilir, çok daha hızlıdır ve çitlere, ızgaralara uygundur.
  • %keywords: Hammer'ın Texture Browser'ındaki "Keywords" alanı için virgülle ayrılmış anahtar kelimeler.

Klasörler ve yollar

garrysmod/materials/myname/mymap/wall_concrete01.vmt
garrysmod/materials/myname/mymap/wall_concrete01.vtf
garrysmod/materials/myname/mymap/wall_concrete01_normal.vtf

Materyalin Hammer'daki adı, VMT'nin materials/ klasöründen itibaren yoludur, burada myname/mymap/wall_concrete01. $basetexture oraya işaret ettiği sürece VTF'nin nerede durduğu ve adının ne olduğu teknik olarak önemli değildir. Adların aynı olması yalnızca alışılmış düzendir.

İki kural seni dertten kurtarır:

  1. Her şeyi kendine ait bir alt klasöre koy. Böylece başkasının materyallerinin üzerine yazmazsın ve paketleme sırasında dosyalarını yeniden bulursun.
  2. Klasör ve dosya adlarını küçük harfle, boşluk ve özel karakter kullanmadan yaz. Linux sunucuları büyük ve küçük harfleri ayırt eder.

GMod ayrıca garrysmod/addons/<name>/materials/ altındaki her şeyi yükler. Yeni bir materyal Texture Browser'da görünmüyorsa pratikte Hammer'ı yeniden başlatmak işe yarar.

Brush'lar ve modeller: doğru shader

LightmappedGeneric, brush'lar ve displacement'lar için tasarlanmıştır. Bu yüzeyler VRAD'ın hesapladığı lightmap'lerle aydınlatılır. VertexLitGeneric ise ışığı vertex başına belirlenen modellerin shader'ıdır.

İkisini karıştırırsan ışıklandırma yanlış olur. Valve Developer Community'ye göre brush üzerindeki bir VertexLitGeneric materyali; tamamen siyah olan, titreyen ya da bakış açısına göre parlaklığı değişen bir yüzey olarak görünür. Bu yüzden models/ klasöründeki materyallerin brush'larda işi yoktur. Tersine, modeller de LightmappedGeneric kullanamaz. Aynı görseli hem bir brush'ta hem bir modelde kullanmak için aynı VTF'ye işaret eden iki VMT yaz. Genellikle yalnızca ilk satır farklıdır.

Tipik hatalar ve nedenleri

BelirtiNedenÇözüm
Pembe-siyah dama deseniVMT eksik ya da $basetexture hiçbir VTF'ye işaret etmiyormaterials/ klasöründen itibaren yolu ve yazımı kontrol et
Beyaz tel kafesİlk satırdaki shader mevcut değilShader adını düzelt
Sende görünüyor, başkalarında görünmüyorDosyalar yalnızca senin bilgisayarında varMateryali haritayla birlikte dağıt
Yüzey siyah ya da titriyorBrush üzerinde VertexLitGenericLightmappedGeneric kullan
Yüzey gölgesiz parlıyorIşıklandırma olmadan çizen UnlitGeneric shader'ıShader'ı değiştir
Yanlış ayak sesi$surfaceprop eksik ya da uygun değilUygun bir değer gir

Tek bir yüzey değil de haritanın tamamı eşit biçimde parlaksa ışıklandırma verisi eksiktir. Bu konu Source Engine ışıklandırma rehberinde ele alınıyor. Oyun çalışırken bir VMT'yi değiştirdiysen mat_reloadmaterial konsol komutu, yanına VMT'nin adını yazınca onu yeniden yükler.

"Başkalarında görünmüyor" durumu en sık karşılaşılanıdır. Özel materyaller, sen onları dağıtana kadar yalnızca senin oyun klasöründe vardır. Bunun nasıl yapılacağı özel içeriği BSP içine paketleme yazısında, oyuncu tarafı ise eksik texture'ları ve ERROR modellerini düzeltme yazısında anlatılıyor. Yalnızca haklarına sahip olduğun görselleri kullan: kendi fotoğrafların ve grafiklerin ya da lisansı yeniden dağıtıma izin veren kaynaklar. Temel bilgiler GMod haritalarında telif hakkının temelleri yazısında.

Sık sorulan sorular

Bir texture'ın çözünürlüğü ne olmalı?

Bu, yüzeye bağlıdır. Hammer yeni texture'ları 0,25 ölçekle uygular; yani bir piksel çeyrek birimi kaplar ve 512 piksel genişliğindeki bir texture her 128 birimde bir tekrar eder. Daha yüksek çözünürlükler yakından daha keskin görünür ama bellek ve dosya boyutuna mal olur.

Bir çitin ya da ızgaranın arkasını nasıl görünür yaparım?

Görselin, boşlukların siyah olduğu bir alfa kanalına, VTF'nin de bu kanalı saklayan bir formata ihtiyacı vardır; bu genellikle DXT5'tir. VMT'ye $alphatest 1 yazarsın. Valve Developer Community'deki örnek, görünür ile görünmez arasındaki eşik olarak ayrıca $alphatestreference 0.5 değerini de ayarlar. Yüzey iki taraftan da görünecekse $nocull 1 ekle.

Her texture'a normal map gerekir mi?

Hayır. Bir materyal $basetexture ve $surfaceprop ile çalışır. Normal map fazladan bir VTF'ye mal olur, $bumpmap içeren yüzeyler de bir yerine dört lightmap alır. Yüzeyi yalayarak geçen ışığın dokuyu ortaya çıkarması gereken yerlerde karşılığını verir.