Nighthawk.dk

Textures og Materials i Unity

Skrevet d. 1. March 2022 af Claus Nielsen.

Her ser vi på hvad textures og materials er, og hvordan de bruges i Unity.
Til sidst prøver vi at tilføje normal maps til vores materials.

I sidste artikel kom vi i gang med at bruge Unity, men den lille bane vi lavede så ikke super spændende ud. Nu vil vi prøve at gøre banen lidt mere spændende ved at bruge nogle materials!

Koncept: Material

Et Material består af en shader (se næste boks) samt information til shaderen om, hvordan et objekt skal renderes (dvs. tegnes på skærmen).

F.eks. kan et material indeholde en farve, en eller flere textures (kommer vi til senere), eller f.eks. information om hvordan objektet påvirkes af lys. Hvilke indstillinger, som kan sættes på et material, afhænger af den valgte shader.

Læs mere her.

Koncept: Shader

En shader er program skrevet til grafikkortet, som fortæller det hvordan noget (typisk trekanter) skal tegnes på skærmen.

En shader består af flere dele - altid en vertex shader og en fragment/pixel shader, og nogle gange også f.eks. en geometry shader eller tesselation shader. Unity har også en speciel form for shader kaldet surface shader, men den bliver i virkeligheden bare lavet om til vertex og fragment shaders af Unity.

Unity indeholder en række forskellige shaders, som du kan bruge, men her vil vi bare bruge standard-shaderen.

Navnet shader kommer af, at shaders oprindeligt brugt til at lave beregninger af belysningen af overflader, men de har siden fundet meget bred anvendelse. Prøv f.eks. at undersøge begreberne per-pixel lighting, bump mapping og parallax mapping, som altsammen laves vha. shaders.

Læs mere her.

Materials i Unity

I Project-panelet havde vi lavet en mappe der hedder Materials. Gå ind i den mappe, højreklik i højre del af Project-panelet og vælg Create -> Material. Giv det nye material navnet Gulv.

Når du vælger (trykker på) det nye material nede i Project-panelet, kan du se dets egenskaber i Properties-panelet. En af de øverste indstillinger (under overskriften Main Maps) hedder Albedo - her kan du vælge en farve til dit material.

Sæt Albedo-farven på det nye material.

Nu kan du "trække" dit material fra Project-panelet og ud i scene view, hvor du kan "slippe" det på gulvet. Når du gør dette fortæller du gulvet i din bane, at det skal bruge dette material, og gulvet skulle nu have samme farve som du valgte på dit material (albedo-farven).

Prøv nu at lave endnu et material, og kald det "Væg". Vælg en anden Albedo-farve end til gulvet, og træk det ud på alle fire mure i banen.

Der er nu to materials, og det ene er brugt på alle fire mure rundt om banen.

Prøv nu at vælge materialet "Væg" (klik på det i Project-panelet), og prøv at ændre Albedo-farven - så kan du se at alle fire mure skifter farve!

Det er fordi alle fire mure bruger det samme material, så når du ændrer dette ene material, ændres alle de objekter som bruger det.

Prøv at ændre indstillingerne Metallic og Smoothness på et material og se hvordan de påvirker udseendet af gulvet eller væggene.

Textures

Nu fik vi lidt farver på banen, men den er stadig lidt kedelig at se på - vi har brug for textures.

Koncept: Texture

En texture er 2D-grafik, som bliver brugt i 3D-verdenen. Typisk (og til alt hvad vi skal bruge her), er det bare et almindeligt billede, selvom der også findes andre slags textures (f.eks. cubemaps).

Textures på 3D-modeller (figurer/objekter, ikke f.eks. mure) bliver også tit kaldet skins.

Læs mere her.

Du kan finde textures til dit spil mange steder, f.eks.:

  • Unity's Asset Store, f.eks. denne pakke.
  • Diverse tutorials, jeg bruger her textures fra denne side
  • Søg på nettet
  • Tag et billede med et kamera
  • Lav et selv et billede

Her vil jeg bruge textures fra denne side: Under "Tutorial 002" er der et link til at downloade en zip-fil med fire billeder i. Billederne kan pakkes ud i mappen Spiludvikling/Textures.

Hvis du åbner Stifinder i Windows (eller tilsvarende på Mac/Linux), kan du trække billedfilerne ned i Project-panelet i Unity - sørg for først at vælge Textures-mappen i Project-panelet.

Træk billederne fra Stifinder ind i Project-panelet i Unity.

For at se hvordan du selv kan lave textures, så lad os bare prøve at åbne Paint (i Windows), og lave en simpel tegning. Gem tegningen i Spiludvikling/Textures (f.eks. som en 24-bit Bitmap, .bmp), åbn Windows Stifinder og træk igen billedfilen over i Unity's Project-panel (Textures-mappen).

Du kan lave din egen texture i f.eks. Paint på Windows.

Hvis du downloader et billede fra en webside, eller har et billede fra dit kamera, som Unity ikke kan åbne, kan du evt. prøve at åbne det i Paint og gemme det som f.eks. en .bmp- eller .png-fil. Det er nemlig ikke alle filtyper som Unity kan bruge.

Generelt er det dog bedre at bruge et program som Adobe Photoshop (dyrt men godt) eller GIMP (gratis men sværere at lære at bruge) til billedbehandling. Jeg vil anbefale at lære at bruge et af disse programmer, for man har jævnligt brug for lidt 2D-grafik til sit spil (textures, sprites, menuer/knapper, andet UI/HUD).

Nu hvor vi har nogle textures kan vi prøve at bruge dem: Lav et nyt material (jeg har kaldt det "GulvTexture"), og tryk på den lille cirkel til venstre for teksten "Albedo" i Properties-panel. Så får du et vindue, hvor du kan vælge en texture:

Tryk på den lille cirkel ud for Albedo og vælg en texture.

Du kan nu trække det nye material ud på gulvet - så får det texturen på. Lav på samme måde et nyt material med en texture til murerne, og træk det ud på murene. Bemærk at Albedo-farven stadig har betydning for hvordan overfladen ser ud.

Her har jeg også lavet en ny Plane (ligesom gulvet) med et material som viser min tegning. Den er drejet og flyttet hen til en væg:

Så er der textures på gulv, vægge, og en ny plane hvor jeg har brugt den texture jeg lavede i Paint.

Vi er desværre ikke helt færdige endnu. Måske har du allerede lagt mærke til at nogle textures er strukket (på langs af murene), og texturen på gulvet ser heller ikke godt ud.

Lige nu bliver vores textures kun vist én gang per overflade, og er strukket så de dækker det hele. I stedet vil vi have texture-billederne til at gentage sig fremfor at blive strukket.

For at gøre dette kan du ændre Main Maps tiling-værdierne på dine materials:

Brug tiling-indstillingerne for at få textures til at se bedre ud.

Fordi murene er aflange skal tiling X-værdien sættes meget højere end Y-værdien. Jeg bruger Main map tiling X=10, Y=1 til murene. Dette gør at texture-billedet bliver gentaget 10 gange henad langs muren, men kun vises 1 gang i højden.

Mit gulv er kvadratisk, så jeg sætter begge tiling-værdier til det samme: X=20, Y=20.

Prøve at lege med tiling-indstillingerne - også negative tiling-værdier!

Mure i forskellige størrelser

Hvis du laver forskellige 3D-objekter (f.eks. cubes og planes i forskellige størrelser) bliver du nok nødt til at lave forskellige materials til dem, for at du kan tilpasse tiling-indstillingerne til hver enkelt objekt.

Omvendte textures på bagsiden

Hvis du bruger en cube (som til murene), så vil du se at din texture vender spejlvendt og på hovedet på bagsiden. Dette kan være et problem hvis du f.eks. har en mur, som man kan gå rundt om og se fra begge sider, og hvis du samtidig bruger en texture, der skal vende på en bestemt måde.

Det er der ikke så meget at gøre ved, udover at bruge noget andet end en simpel cube fra Unity. En løsning kunne være at bruge planes i stedet for Cubes, fordi planes altid kun har én side, så her kan du bedre styre hvordan det skal se ud (du skal så bare lave flere planes).

Alternativt kan du placere to cubes (f.eks. to mure) op ad hinanden, så man ikke kan se at der er to - og så det ser rigtigt ud fra begge sider.

Normal maps

Når vi sætter en texture på en cube eller plane, tager vi bare et simpelt 2D-billede og sætter på en helt flad overflade, men ofte vil vi gerne have det til at se ud som om der er mere dybde i overfladerne.

Til dette kan vi bruge bump mapping, eller normal mapping, som giver en illusion af dybde. Det kræver bare at vi bruger et ekstra billede, et normal map, sammen med vores texture.

Et normal map er et billede, der indeholder information omkring hvordan dybden i billedet ændrer sig henover en overflade (hver pixel angiver en normal-vektor vha. RGB-farvekomponenterne), og Unity's standard-shader kan bruge dette. Bemærk at ikke alle shaders understøtter normal maps.

Lad os starte med gulvet - gå ind i Assets/Textures-mappen i Project-panelet, og find den texture du bruger til gulvet. Markér/tryk på den, og tryk på Ctrl + D for at duplikere den, dvs. lave en kopi af din texture.

Giv kopien af din texture et nyt navn, f.eks. N_Tile001 hvis din oprindelige texture hed Tile001 ("N_" for at fortælle os, at det er en normal map).

Vælg den nye texture. I Properties-panelet kan du sætte Texture Type til Normal map, og derefter trykke på Apply længere nede i Properties-panelet.

Kopiér din texture med Ctrl+D, omdøb den (sæt f.eks. N_ foran navnet), skift Texture Type til Normal map, og tryk Apply.

Unity har nu lavet et normal map til din gulv-texture, så nu skal vi bare bruge det. Find dit gulv-material (med texture) i Project-panelet, og se på Properties-panelet: Ligesom du tidligere har valgt en texture til dit material, ved at trykke på den lille cirkel ved Albedo, kan du nu sætte et normal map ved at trykke på den lille cirkel ved Normal Map.

Vælg den normal map Unity har lavet til dig ud fra din texture.

Nu skulle dit gulv gerne se ret anderledes ud, når du starter spillet! Prøv evt. at skrue lidt på "Metallic" og "Smoothness" igen i Properties-panelet for dit material, efter du har sat et normal map på.

På samme måde kan du tilføje et normal map til dit material til murene, eller til andre materials du laver i fremtiden.

Banen med materials med og uden normal maps. Bemærk hvordan lyset får muren til at se ud som om den har en ru overflade pga. normal mapping.

Bemærk at normal maps ændrer den måde, som overflader påvirkes af lys på. Du kan evt. prøve at dreje det Directional Light du har i scene-hierarkiet, for at se hvordan det påvirker overfladerne.

Relaterede ressourcer
Unity Engine

Game-engine til udvikling af 3D-spil.

Se mere her

Unity Asset Store

Markedsplads for ressourcer til Unity. Indeholder også mange gratis assets.

Se mere her

Foundations of Game Engine Development, Volume 2: Rendering

Eric Lengyel,
Terathon Software LLC, 2019

Se mere her

×