Vector Displacement Mapping

Relevanta dokument
Grafiska pipelinens funktion

Grafiska pipelinen. Edvin Fischer

Shaders. Renderingssystem. Renderingssystem. Renderingssystem. Hårdvara för 3D-rendering. Hårdvara för 3D-rendering

Shaders. Gustav Taxén

Procedurell grottgenerator och eld i GLSL. Marcus Widegren

Procedurell Terräng med LOD i OpenGL 4

LUNDS UNIVERSITET. Parallell exekvering av Float32 och INT32 operationer

PROCEDUELL TERRÄNG. Proceduella metoder för bilder (TNM084) Jimmy Liikala Institutionen för teknik och naturvetenskap

Geometry shaders! och Tesselation shaders!

Procedurell renderingsmotor i Javascript och HTML5

I rastergrafikens barndom...gjorde man grafik genom att skriva i ett videominne. Operationer på buffert och pixlar. Idag... Varför grafikkort?

Geometry shaders! och Tesselation shaders!

Procedurell 3D-eld på grafikkortet

A comparison study between OpenGL 4.3, OpenGL ES 3.0 and WebGL 1.0 With focus on rendering pipeline and texture handling

Spelutveckling 3d-grafik och modellering. Grunder för 3d-grafik Blender Animering

Tentamen TNM061, 3D-grafik och animering för MT2. Tisdag 3/ kl 8-12 TP51, TP52, TP54, TP56, TP41, TP43. Inga hjälpmedel

Kravspecifikation för hårdvaruprojekt i kursen Datorsystemteknik, HT2005. Temperaturvakt med loggningsfunktion

HAND TRACKING MED DJUPKAMERA

Koordinatsystem och Navigation

EXAMENSARBETE. Tesselering och Displacement. Ökad realism inom realtidsgrafik. Jonas Malm Teknologie kandidatexamen Datorgrafik

Tentamen TNM061, 3D-grafik och animering för MT2. Onsdag 20/ kl SP71. Inga hjälpmedel

Skinning and Animation

Teknik för avancerade datorspel!

Repetition + lite av varje. Ulf Assarsson Department of Computer Engineering Chalmers University of Technology

Information Coding / Computer Graphics, ISY, LiTH. Bump mapping!

Teknik för avancerade datorspel!

Försättsblad till skriftlig tentamen vid Linköpings Universitet

Bemästra verktyget TriBall

Teknik bakom tredimensionella datorgrafiken Direct3D

Lunds Tekniska Högskola Datorarkitektur med operativsystem EITF60. Superscalar vs VLIW. Cornelia Kloth IDA2. Inlämningsdatum:

Rastrering och displayalgoritmer. Gustav Taxén

Hantering av hazards i pipelines

Programmering B med Visual C

Ansiktsigenkänning med MATLAB

TBSK 03 Teknik för Advancerade Datorspel

Avalanche Studios. OpenGL. Vår teknik. Våra spel. Lite inspiration... Stora, öppna spelvärldar. Sandbox-gameplay. Hög audiovisuell standard

Bemästra verktyget TriBall

RTG-formatet Gustav Taxén,

Spekulativ exekvering i CPU pipelining

Grafik raytracing. Mattias Axblom.

Procedurella Grottor TNM084. Sammanfattning. Alexander Steen

Grunderna i C++ T A. Skapad av Matz Johansson BergströmLIMY

C-UPPSATS. Revitalizing classic art using real-time game technology

Föreläsning 1: Intro till kursen och programmering

Bakgrund och motivation. Definition av algoritmer Beskrivningssätt Algoritmanalys. Algoritmer. Lars Larsson VT Lars Larsson Algoritmer 1

Inledning. Kapitel Bakgrund. 1.2 Syfte

GRUNDER I VHDL. Innehåll. Komponentmodell Kodmodell Entity Architecture Identifierare och objekt Operationer för jämförelse

Värmedistribution i plåt

Alla datorprogram har en sak gemensam; alla processerar indata för att producera något slags resultat, utdata.

TNM022 Proceduella Bilder Rendering av proceduell päls i realtid

EXAMENSARBETE. Tekniker för optimering av modellering och texturering av spelmodeller. Anders Lorentzen. Teknologie kandidatexamen Datorgrafik

The Awakening Short Film

Parallellism i NVIDIAs Fermi GPU

Texturerade 3D-modeller

Översikt Introduktion DST 1. Nicholas Wickström. IDE, Högskolan i Halmstad. N. Wickström

Robin Wahlstedt Datavetenskap / Spel Vetenskapsmetodik rwt07001@student.mdh.se. Datorgrafik i spel

Universe Engine Rapport

Här är två korta exempel på situationer då vi tillämpar den distributiva lagen:

I rastergrafikens barndom...gjorde man grafik genom att skriva i ett videominne. Operationer på buffert och pixlar. Idag... Varför grafikkort?

Grafik. För enklare datorsystem

Transparens i en deferred pipeline Stefan Hanna

Föreläsning 1: Intro till kursen och programmering

Spelutveckling - Scenegrafer. Scenegrafer Optimeringar Culling

Digitalitet. Kontinuerlig. Direkt proportionerlig mot källan. Ex. sprittermometer. Elektrisk signal som representerar ljud.

Magnus Nielsen, IDA, Linköpings universitet

Kort introduktion till POV-Ray, del 3

Konvexa höljet Laboration 6 GruDat, DD1344

Classes och Interfaces, Objects och References, Initialization

Användarhandledning Version 1.2

Realtidsskuggalgoritmer för virtuella 3D-världar på modern grafikhårdvara M A R C U S B E A U S A N G

Realtidsalgoritmer för ljusets spridning och absorption mot partiklar i luften P E T E R L Ö N N Q U I S T

Grafisk Teknik. Rastrering. Övningar med lösningar/svar. Sasan Gooran (HT 2013)

Innehåll. Kamerabaserad interaktion Del 3 3D och AR. Världen genom datorn. Vad är AR? AR vs. VR. Potential

TDDC74 Lab 04 Muterbara strukturer, omgivningar

Bézierkurvor och parametriska objektrepresentationer

TAIU07 Matematiska beräkningar med Matlab

Pipelining i Intel Pentium II

Introduktion. Klasser. TDP004 Objektorienterad Programmering Fö 2 Objektorientering grunder

Grafik. För enklare datorsystem

Dynamiskt minne. Vad är dynamiskt minne Motivering Hur gör man i C Övningar

TEM Projekt Transformmetoder

Labbrapport svängande skivor

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Labb i Datorsystemteknik och programvaruteknik Programmering av kalkylator i Visual Basic

Skinning. Ännu fler koordinatsystem att hålla reda på. SUPPLEMENT 2 till "So How Can We Make Them Scream?" 1. Olika metoder för kroppsanimation

Inledning. Vad är ett datorprogram, egentligen? Olika språk. Problemlösning och algoritmer. 1DV433 Strukturerad programmering med C Mats Loock

Fotorealistiska bilder 1 PV360 kap 1 7: Grunder samt material och dekaler i Photoview 360

Laboration - Shaders

VRay för Max Camilla Ravenna / André Ravenna Alto Punto 2012 Alto Punto Askims Stationsväg Askim

TANA17 Matematiska beräkningar med Matlab

F5: Högnivåprogrammering

Displaysystem. Hans Brandtberg Saab Avitronics SAAB AVITRONICS

Tynker gratisapp på AppStore

F5: Högnivåprogrammering

729G75: Programmering och algoritmiskt tänkande. Tema 1, föreläsning 1 Jody Foo

Kort introduktion till POV-Ray, del 1

Analys av BI-system och utveckling av BIapplikationer

Pre-Test 1: M0030M - Linear Algebra.

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design Alex Gerdes, 2016

Grundläggande programmering med C# 7,5 högskolepoäng

Transkript:

Thesis no: BCS-2014-02 Vector Displacement Mapping En Prestandajämförelse med Displacement Mapping i Realtid Emrik Lundström Faculty of Computing Blekinge Institute of Technology SE-371 79 Karlskrona, Sweden

This thesis is submitted to the Faculty of Computing at Blekinge Institute of Technology in partial fulfillment of the requirements for the degree of Bachelor of Science in Computer Science. The thesis is equivalent to 10 weeks of full time studies. Contact Information: Author: Emrik Lundström E-mail: emlp11@student.bth.se University advisor: Stefan Petersson Department of Creative Technologies Faculty of Computing Blekinge Institute of Technology SE-371 79 Karlskrona, Sweden Internet : www.bth.se Phone : +46 455 38 50 00 Fax : +46 455 38 50 57 ii

Abstrakt Kontext: Displacement Mapping är en teknik som används inom 3D-spel för att skapa detaljrikedom i geometri utan att behöva triangelobjekt bestående av oönskad geometrikomplexitet. Tekniken har även andra användningsområden i 3D-spel, till exempel terränggeometri. Tekniken skänker detaljrikedom genom att i samband med tesselering förskjuta geometri i en normalriktning eller längs annan specificerad riktning. Vector Displacement Mapping är en teknik liknande Displacement Mapping där skillnaden är att Vector Displacement Mapping förskjuter geometri i tre dimensioner. Mål: Syftet med arbetet är utforska Vector Displacement Mapping i sammanhanget 3D-Spel och att antyda att tekniken kan användas i 3D-spel likt Displacement Mapping. Arbetet jämför Vector Displacement Mapping med Displacement Mapping för att urskilja skillnader i exekveringstid mellan teknikernas centrala skillnader. Skillnaderna i exekveringstid ställs i kontrast mot diskussion av teknikernas grafikminnesanvändning. Metoder: Jämförelsen baseras på en implementation av de båda teknikerna tillsammans med tesselering. Prestandamätningar genereras med implementationen som grund. Implementationen använder sig av Direct3D 11. Resultat: Resultatet som erhålls genom jämförelsen visar att exekveringstiderna mellan teknikernas centrala skillnader varierar svagt. Grafikminnesanvändningen mellan teknikerna skiljer sig med en faktor 3 eller en faktor 4 där Vector Displacement Mapping använder mer grafikminne. Slutsatser: Slutsatser som dras baserat på resultatet är att Vector Displacement Mapping i situationer där överhängande geometri är ett önskat resultat kan ersätta Displacement Mapping. Vidare diskussion förs kring slutsatser, avgränsningar och framtida forskning som arbetet berör. Nyckelord: Rendering, Geometriförskjutning, Direct3D 11, Tesselering, exekveringstid

Tack Ett särskilt tack riktas åt min handledare Stefan Petersson för all konstruktiv kritik som i första hand har hjälpt mig att forma ett konkret arbete och planen för att genomföra det men som även har hjälpt mig att skapa och finslipa uppsatsen. Jag vill även tacka Sanna Widell för det stöd som hon alltid visar men även för att ha hjälpt mig att putsa lite extra på uppsatsen.

Abstrakt... i 1 Introduktion... 4 1.1 BAKGRUND... 4 1.2 SYFTE... 5 1.3 FORSKNINGSFRÅGA... 5 1.4 METODIK... 5 2 3D-Programmering... 6 2.1 DIRECT3D 11 PIPELINE... 6 2.2 INPUT ASSEMBLER... 7 2.3 VERTEX SHADER... 7 2.4 HULL SHADER... 7 2.5 FIXED FUNCTION TESSELLATOR... 7 2.6 DOMAIN SHADER... 8 2.7 GEOMETRY SHADER... 8 2.8 STREAM-OUTPUT STAGE... 8 2.9 RASTERIZER STAGE... 8 2.10 PIXEL SHADER... 8 2.11 OUTPUT MERGER... 8 3 Displacement Mapping... 9 4 Vector Displacement Mapping... 10 5 Prestandamätningar... 11 5.1 TESTDESIGN... 11 5.2 TESSELERING... 12 5.3 DISPLACEMENT MAPPING... 12 5.4 VECTOR DISPLACEMENT MAPPING... 13 5.5 JÄMFÖRELSE OCH ANALYS AV MÄTDATA... 13 6 Grafikminnesanvändning... 14 7 Slutsats, Diskussion och Framtida Arbete... 16 7.1 SLUTSATS OCH DISKUSSION... 16 7.2 FRAMTIDA ARBETE... 16 8 Referenser... 18 8.1 LITTERATUR... 18 8.2 WEBB... 18 8.3 BILDER... 18 9 Ordlista... 20 10 Bilagor... 21 10.1 TESSELERING... 21 10.2 DISPLACEMENT MAPPING... 24 10.3 VECTOR DISPLACEMENT MAPPING... 26 3

1 Introduktion Denna del ger bakgrund till arbetet och till teknikerna som arbetet omfattar. Här förklaras även syftet med arbetet och frågeställningen som arbetet ställer i sammanhanget introduceras. Här ges även en kort beskrivning av hur arbetet går till väga för att svara på frågeställningen. 1.1 Bakgrund I 3D-spel försöker utvecklare ofta eftersträva hög realism och detaljrikedom genom många varierande tekniker. För att uppnå hög realism och detaljrikedom i aspekter av spel så som karaktärsmodeller och terräng används i vissa exempel Displacement Mapping [Luna 2012]. Displacement Mapping uppnår ökad realism genom förskjutning av geometri längs med en normal eller annan riktning. Figur 1.1 visar ett resultat av att applicera Displacement Mapping på en plan yta. Figur 1.1 En plan yta (vänster) förskjuts via Displacement Mapping enligt en Displacement-textur (mitten) och resulterar i en mer detaljerad modell (höger) [Dario Lanza a 2013]. Inom animering används Vector Displacement Mapping vars genomföring och användning är likt det som gäller för Displacement Mapping [Pixar a 2014]. Vector Displacement Mapping har även andra tillämpningsområden vilket [Hanyoung Jang och JungHyun Han 2012] ger exempel på. Vector Displacement Mapping förskjuter geometri i tre dimensioner och kan på så vis uppnå andra resultat än vad Displacement Mapping kan. Figur 1.2 visar ett resultat av att applicera Vector Displacement på en plan yta. Detta resultat kan inte uppnås genom Displacement Mapping. Figur 1.2 En plan yta (vänster) förskjuts via Vector Displacement Mapping enligt en Vector Displacement-textur (mitten) och resulterar i en mer detaljerad modell (höger) [Dario Lanza b 2013]. Båda teknikerna är till stor grad beroende av tesselering som erbjuds i Direct3D 11 [MSDN a 2014] och implementeras med fördel tillsammans med detta [Hanyoung Jang och JungHyun Han 2012]. Utöver möjlighet till Displacement Mapping-tekniker introducerar Direct3D 11 även, via tesselering, möjlighet till dynamisk nivå av detalj i triangelobjekt, utjämning av triangelobjekt och reducerad grafikminnesanvändning då lågupplösta triangelobjekt kan hållas i grafikminnet men ändå uppnå hög detaljnivå [Eimandar 2013]. Då tesselering introduceras med Direct3D 11 som används mer och mer för att skapa nya 3D-spel blir det relevant att utforska de nya möjligheter som medföljer tesselering och Direct3D 11. En av dessa möjligheter är Vector Displacement Mapping. Bristen på relevant, vetenskapligt och publicerat material tyder på att tekniken inte är lika utforskad vad gäller 3D-spel och därav blir det relevant att undersöka tekniken i sammanhanget 3D-spel. 4

Detta arbete ämnar undersöka en specifik aspekt av Vector Displacement Mapping i sammanhanget 3D-spel, nämligen prestanda. I arbetet utvärderas exekveringstid men även grafikminnesanvändning diskuteras och ställs i kontrast mot utvärderingen. Utvärderingen och diskussionen görs också kring Displacement Mapping vars exekveringstid och grafikminnesanvändning antyds vara lägre [Hanyoung Jang och JungHyun Han 2012]. 1.2 Syfte Syftet med detta arbete är att utforska prestandaaspekter av Vector Displacement Mapping samtidigt som inriktning mot sammanhanget 3D-spel erhålles. Ett annat syfte som arbetet uppfyller är att det antyder att Vector Displacement Mapping kan användas likt Displacement Mapping i sammanhanget 3D-spel. En del val som gjorts i samband med olika delar av arbetet motiveras av det förstnämnda syftet och dessa val beskrivs i stycke 1.4 samt stycke 6. Ett annat syfte som arbetet uppfyller är att tillhandahålla vetenskapliga prestandamätningar av Vector Displacement Mapping i 3D-spel sammanhang medan få andra vetenskapliga och publicerade arbeten berör dessa två aspekter i samband med prestandamätningar. Detta gör arbetet unikt då andra arbeten som berör Vector Displacement Mapping ofta placerar tekniken i andra sammanhang eller inte lika starkt understryker Vector Displacement Mapping eller 3D-spel. Av denna anledning används referenser av andra anledningar än att jämföra prestandamätningar. 1.3 Forskningsfråga Den centrala forskningsfråga som detta arbete besvarar lyder, Vad skiljer Displacement Mapping och Vector Displacement Mapping åt avseende prestanda? Prestanda avser huvudsakligen exekveringstid men även grafikminnesanvändning i mindre omfattning. Fokus ligger på de huvudsakliga skillnaderna som uppenbarar sig i form av att Vector Displacement Mapping kräver ett texturformat med tre färgkanaler och förskjuter positioner i tre dimensioner. Motsvarande använder Displacement Mapping ett texturformat med en färgkanal och förskjuter i positioners normalriktning eller annan specificerad riktning. Denna slags fokus eftersträvas då implementationer av teknikerna alltid kan variera i olika grad men de nämnda huvudsakliga skillnaderna är konstanta. Mindre centrala aspekter och skillnader mellan teknikerna diskuteras i samband med slutsatserna i stycke 7. Genom att svara på forskningsfrågan återfås även en indikation av Vector Displacements användningsmöjligheter inom realtidsapplikationer och om det motsvarar de användningsmöjligheter som Displacement Mapping erbjuder. Resultatet som förväntas är att svaret på forskningsfrågan kommer att antyda och förstärka tanken att Vector Displacement Mapping är användbart för 3D-spel likt det sätt som Displacement Mapping är. 1.4 Metodik För att besvara forskningsfrågan implementeras de relevanta teknikerna tesselering, Displacement Mapping och Vector Displacement Mapping i en gemensam implementation, tillsammans med ett system för att mäta exekveringstiden som respektive teknik upptar på grafikkortet. Detta mätningssystem använder sig av GPU Queries. Implementationen är gjord i C++ och använder sig av Direct3D 11. Då programmeringsspråket C++ är vedertaget och används omfattande inom 3D-spel är det relevant att använda i detta arbete som riktar sig mot just 3D-spel. I samma syfte är även Direct3D 11 ett lämpligt val då även det är vedertaget i sammanhanget. Exempel på detta är de populära spelmotorerna, som används för att skapa 3D-spel bland annat, CryEngine [Crytek 2013] och Unreal Engine 4 [Epic Games 2014] som använder sig av C++ och har stöd för Direct3D 11 i senaste iterationer av respektive spelmotor. 5

2 3D-Programmering Denna del ger läsaren en inblick i hur 3D-programmering med hjälp av Direct3D 11 ser ut. Då tesselering är en central del av pipelinen i Direct3D 11 får läsaren även förståelse för tesselering vilket är en förutsättning för att fullt ut kunna förstå Displacement Mapping och Vector Displacement Mapping. Många av termerna förklaras av ordlistan i stycke 9. 2.1 Direct3D 11 Pipeline Följande stycke baseras till stor del på MSDN-dokumentationen [MSDN b 2014] samt förklaringarna som ges av [Petersson 2011] och [Holmertz Liljekvist och Zsigmond 2013]. Pipelinen utgörs av ett antal programmerbara delar samt ett antal icke programmerbara delar. De programmerbara delarna utgörs av Vertex shader, Hull shader, Domain shader, Geometry shader och Pixel shader. Dessa delar programmeras i så kallad High Level Shader Language-kod [MSDN c 2014]. De icke programmerbara delarna utgörs av Input Assembler, Tessellator, Stream-Output, Rasterizer och Output-Merger. Figur 2.1 visar de olika steg som utgör pipelinen. De icke programmerbara delarna kan konfigureras till viss del genom att använda sig av Render States. Figur 2.1 Direct3D 11 pipelinen med tillhörande topologier [Petersson 2011]. 6

2.2 Input Assembler Input Assembly utgör det första steget och som namnet antyder är dess centrala uppgift att läsa data från buffrar genererade av programmeraren och översätta dessa till geometriska primitiver som sedan används av efterföljande steg. Typen av geometrisk primitiv som Input Assembly genererar kontrolleras av programmeraren och kan vara av typen vertex, linje, triangel eller kontroll-patch. Varje geometrisk primitivtyp kan behandlas på olika sätt genom att använda olika geometriska topologier, se Figur 2.1. Programmeraren väljer även en Input Layout som tillsammans med övrig data definierar vad som skall behandlas i Vertex Shadern. Input Assembly är icke fullt kontrollerat av programmeraren. I samband med tesselering används geometriska primitiver av typen kontroll-patch. En kontroll-patch utgörs av olika antal kontrollpunkter. 2.3 Vertex Shader Vertex Shadern utgör den första programmerbara delen i pipelinen. Steget är det enda obligatoriska och måste användas även om ingen behandling sker i steget. Indata och utdata för steget är av typen vertex. I detta steg sker vanliga per-vertex-operationer som transformationer och animering. I sammanhanget tesselering kan en prestandaökning utvinnas genom att lågupplösta triangelobjekt passerar Vertex shadern som via tesseleringen blir högupplösta. Behandlingen som sker i Vertex shadern utförs alltså på det lågupplösta triangelobjektet, istället för på det tesselerade och därav kan en prestandaökning uppnås. 2.4 Hull Shader Hull shadern är det första steget av tesseleringen i Direct3D 11 och består av två delar. Användning av en Hull shader innebär att det icke programmerbara tesseleringssteget initieras samt att en Domain shader kommer krävas. Hull shadern har som input en kontroll-patch som i sin tur kan bestå av olika antal kontrollpunkter. Den ena delen av Hull shadern, som ofta benämns den konstanta delen, används för att beräkna faktorer som sedan används som indata i den icke programmerbara delen av tesselering. Ett exempel kan vara att uppnå variation i graden av tesselering baserat på avståndet till kameran i en spelvärld. Om en kamera är nära geometrin som tesseleras kan det vara önskvärt att tesselera mer detaljerat än om geometrin är långt ifrån. Via den konstanta delen av Hull shadern blir detta möjligt. Den andra delen av Hull shadern anropas per kontrollpunkt i aktuell kontroll-patch och används för att göra beräkningar per kontrollpunkt och ger även som utdata en behandlad kontrollpunkt. 2.5 Fixed Function Tessellator Detta steg är icke programmerbart och har som huvuduppgift att utföra själva uppdelningen av geometri som tekniken tesselering innebär. Denna uppdelning innebär att linjer, trianglar eller rektanglar delas upp i ett större antal vertiser, linjer eller trianglar. Indata från den konstanta delen av Hull shadern används här för att dela upp geometrin i olika grad och i olika mönster, Figur 2.3 illustrerar detta. Utdata från detta steg kommer i form av normerade koordinatorer som behandlas vidare i Domain shadern. Figur 2.3 En triangel (vänster) som tesseleras med yttre och inre faktor 2 (mitten) respektive yttre och inre faktor 3 (höger). I samtliga fall används heltalspartitionering. 7

2.6 Domain Shader Domain shadern är den slutgiltiga delen av tesseleringen och anropas för varje genererad utdata från tesselatorn. Indata till detta steg är kontrollpunkten från Hull shadern samt barycentriska koordinatorer från tesselatorn. Med hjälp av kontrollpunkten och de barycentriska koordinatorerna kan Domain shadern generera de nya vertiserna och tesseleringen är färdigställd. I detta steget blir det relevant att utnyttja tekniker som Displacement Mapping och Vector Displacement Mapping. Detta kan åstadkommas genom att extrahera värden från respektive textur med hjälp av den genererade vertisens texturkoordinater och sedan förskjuta vertisen enligt det genererade värdet, eventuellt enligt en skala som programmeraren själv kan bestämma. Den slutliga vertisen skickas sedan antingen vidare till Geometry shadern eller till rastreringssteget. 2.7 Geometry Shader Denna shader är alternativ och anropas per primitiv som i sin tur utgörs av ett antal vertiser. Via Geometry shadern finns möjlighet att generera nya primitiver vars typ kan skilja sig från typen av indatan. Med eller utan information från närliggande vertiser kan beräkningar per primitiv göras i detta steg. Nya primitiver genereras genom att adderas till en Stream-Output, men primitiver kan också avfärdas genom utebliven addering till en Stream-Output. Vad som avgör om primitiver ska avfärdas eller inte är upp till programmeraren. Med Geometry shadern finns möjlighet att skicka vidare de vertiserna som utgör aktuella primitiver till en buffer i minnet eller att skicka vidare vertiserna till rastreringssteget. 2.8 Stream-Output Stage Detta steg är icke programmerbart och ser till att utdata från Geometry shadern eller från Vertex shadern strömmas vidare till buffrar i minnet. 2.9 Rasterizer Stage I detta steg översätts primitiverna som befinner sig i en 3D-rymd till en motsvarande 2D-bild som utgörs av pixlar. För att skapa ett djupperspektiv genomförs en dividering med vertisens djupvärde. Per-vertex-data interpoleras och hålls av resulterande pixel. I steget kan pixlar som ligger utanför det som kameran ser avfärdas. Steget är icke programmerbart men kan konfigureras med hjälp av Rasterizer States. 2.10 Pixel Shader Pixel shadern ansvarar för att göra operationer per pixel. Dessa operationer kan exempelvis vara ljussättning eller textursampling. Till förfogande i sina operationer och beräkningar har pixel shadern interpolerad per-vertex-data från rastreringssteget. Utdatan blir i form av fyra flyttalsvärden som representerar färgkanalerna röd, grön, blå samt alfa-värde. Pixel shadern är programmerbar. 2.11 Output Merger Detta är det sista steget i pipelinen som tillsammans med utdatan från Pixel shadern och med olika Render States sammanställer den slutgiltiga pixelfärgen. Här avgörs också om pixlar ska avfärdas baserat på djuptester och om flera pixlars färg ska sammansättas. Steget är icke programmerbart. 8

3 Displacement Mapping Displacement Mapping använder sig av en bild innehållande en färgkanal och utifrån denna extraheras ett flyttalsvärde som används för att förskjuta geometri längs en normalriktning eller en annan specificerad riktning. Efter att tesselering har utförts kan Displacement Mapping appliceras genom förskjutning av den tesselerade geometrin, se Figur 3.1. Figur 3.1 En lågupplöst modell (vänster) jämnas ut genom tesselering (mitten) varpå Displacement Mapping appliceras och resulterar i en högt detaljerad modell (höger) [Nvidia 2014]. På detta sätt utvinnes en utjämning av annars kantig geometri via tesselering för att sedan skapa ytterligare detaljrikedom via Displacement Mapping. Displacement Mapping kan på detta sätt användas för att skapa springor, knölar, gropar, kanter och dylikt i geometri i 3D-spel. Tekniken skiljer sig från Normal Mapping och Bump Mapping, se Figur 3.2, som istället approximerar dessa egenskaper genom att ljussätta geometri på ett sätt så att ett plan eller en mindre detaljerad yta uppfattas ha dessa egenskaper [Mikkelsen 2008]. Detta är ytterligare en fördel med Displacement Mapping som gör att geometri, som tekniken verkar på, kan sätta annan geometri i skugga och även täcka annan geometri. Detta i sin tur har potential att öka realismen och är en bra anledning att använda tekniken i 3D-spel. Figur 3.2 En jämförelse av resultat mellan Normal Mapping och Displacement Mapping. Sillhuetten och skuggan på modellen till vänster illustrerar tydligt att ingen geometri har ändrats [GDallimore 2010]. 9

4 Vector Displacement Mapping I andra sammanhang används Vector Displacement Mapping där förskjutning av geometri på ett sätt liknande Displacement Mapping sker. På grund av detta erhåller även Vector Displacement Mapping möjligheten att geometri som tekniken verkar på kan skuggsätta och skymma annan geometri. Den centrala skillnaden är att en bild med tre färgkanaler används för att extrahera tre flyttalsvärden för att sedan förskjuta geometri i tre dimensioner istället för att bara förskjuta geometri i en specificerad riktning. Denna metod möjliggör andra resultat än vad som är möjligt med Displacement Mapping. Genom förskjutning i tre riktningar istället för enbart en kan överhängande geometri skapas, skillnaden illustreras av Figur 4.1 i kombination med Figur 4.2. Den plana ursprungsytan i Figur 4.1 förskjuts längs dess normalriktningar varpå den nya ytan är genererad och den nya ytans normalriktningar kan beräknas. I Figur 4.2 förskjuts den plana ursprungsytan istället längs vektorer, där dessa vektorer kan korsa varandra, vilket resulterar i att den nya ytan kan skymma andra delar av den nya ytan. Figur 4.1 En beskrivning av vanlig Displacement Mapping som illustrerar hur en ytas geometri förskjuts i dess normals riktning [Pixar b 2014]. Figur 4.2 En beskrivning av Vector Displacement Mapping som illustrerar hur en yta förskjuts i tre dimensioner med hjälp av en vektor [Pixar c 2014]. 10

5 Prestandamätningar Detta kapitel presenterar hur prestandmätningarna har genomförts samt resultatet som genererats och en analys av detta. All mätdata är angiven i millisekunder (ms). 5.1 Testdesign Ett antal åtgärder har åtagits för att göra testerna så objektiva som möjligt. Fokus har varit på att testernas variabler som samplingsfilter, triangelobjekt och partitioneringsmetod vid tesselering ska vara lika för de olika testerna. Mindre fokus har varit på vilka värden dessa variabler faktiskt har haft då inget specifikt värde på variablerna har fastställts att vara mer relevant eller lämpligt vid implementation av teknikerna. De tester som utförts har alla använt sig av den systemspecifikation som beskrivs i tabell 5.1. Alla tester har genomförts utan rastrering aktiverad då detta är aktuellt för samtliga tekniker, rastreringsprocessen beskrivs i kapitel 2.9. Vid varje mätning är inre och yttre tesseleringsfaktorer lika och heltalspartitionering används. Båda teknikerna använder sig av samma samplingsfilter. Alla tester har använt samma triangelobjekt som representerar ett plan bestående av 960 vertiser. Vid generering av Displacement Map och Vector Displacement Map har verktyget Pixologic ZBrush 1 använts enligt dess dokumentation [Pixologic a 2013] med skillnaden att triangelobjektet istället har tagits fram i och exporterats från Autodesk Maya 2014 2. Samma skulptur i Pixologic ZBrush har använts för de två texturerna. Texturerna som har använts för Displacement Mapping och Vector Displacement Mapping är båda 1024x1024 pixlar stora och är av filformatet TIFF, se Figur 5.1. Figur 5.1 Vector Displacement texturen (vänster) som använts och Displacement texturen (höger) som använts. Det som har uppmätts är tiden det tar att ladda in resurser till respektive shader samt shaderkoden för respektive teknik. All mätdata är angiven i millisekunder (ms). En mätning avser i sammanhanget ett medelvärde av 1000 olika frames respektive exekveringstid, där dessa frames har kommit i följd i en egen körning av implementationen. Mätdatan för varje nivå av tesselering i Tabellerna 5.2, 5.3 och 5.4 är medelvärdet av 10 olika mätningar. Tabell 5.1 Beskrivning av systemspecifikationen som användes under genomförande av tester. 1 Beskrivs på http://pixologic.com/zbrush/features/overview/ 2 Beskrivs på http://www.autodesk.com/products/autodesk-maya/overview 11

5.2 Tesselering Tabell 5.2 innehåller den mätdata, avrundad till 5 värdesiffror, som genererades vid mätning av enbart tesselering aktiverad. Figur 5.2 visar denna mätdata i form av ett linjediagram som bättre avslöjar hur stigningen ser ut då tesseleringsfaktorn ökar. Tabell 5.2 Mätdatan i ms för tesselering enbart. Figur 5.2 Linjediagram som visualiserar hur mätdatan stiger då tesseleringsfaktorn ökar. 5.3 Displacement Mapping Tabell 5.3 innehåller den mätdata som genererades vid mätning av tesselering och Displacement Mapping aktiv. Figur 5.3 visar denna mätdata i form av ett linjediagram som bättre avslöjar hur stigningen ser ut då tesseleringsfaktorn ökar. Tabell 5.3 Mätdatan för implementationen av Displacement Mapping i ms. Figur 5.3 Linjediagram som visualiserar hur mätdatan stiger då tesseleringsfaktorn ökar. 12

5.4 Vector Displacement Mapping Tabell 5.4 innehåller den mätdata som genererades vid mätning av tesselering och Vector Displacement Mapping aktiv. Figur 5.4 visar denna mätdata i form av ett linjediagram som bättre avslöjar hur stigningen sker då tesseleringsfaktorn ökar. Vid dessa mätningar användes ett texturformat med fyra färgkanaler istället för ett texturformat med tre färgkanaler vilket kan påverka mätresultaten. Detta diskuteras vidare i kapitel 6. Tabell 5.4 Mätdatan för implementationen av Vector Displacement Mapping i ms. Figur 5.4 Linjediagram som visualiserar hur mätdatan stiger då tesseleringsfaktorn ökar. 5.5 Jämförelse och Analys av Mätdata Figur 5.5 avslöjar att Displacement Mapping och enbart Tesselering delar liknande exekveringstider medan Vector Displacement Mapping skiljer sig mer, särskilt då tesseleringsfaktorerna ökar. Den största skillnaden mellan Displacement Mapping och Vector Displacement Mapping uppenbarar sig vid en tesseleringsfaktor på 8 med skillnaden 0,041159 ms. Den största skillnaden mellan Tesselering och Vector Displacement Mapping uppenbarar sig även den vid en tesseleringsfaktor på 8 med skillnaden 0,053452 ms. Vid tesseleringsfaktor 8 står tekniken tesselering för 0,098372 ms av exekveringstiden, vilket är ca 68% av exekveringstiden för Vector Displacement Mapping vid tesseleringsfaktor 8. Vid övriga nivåer av tesseleringsfaktorer är denna procentsiffra högre. Figur 5.5 Skillnaden mellan de implementerade teknikernas exekveringstider i ms. 13

6 Grafikminnesanvändning Då Vector Displacement Mapping använder sig av en bild med tre färgkanaler och Displacement Mapping använder sig av en bild med en färgkanal skiljer sig texturformat och grafikminnesanvändningen för teknikerna. I den använda implementationen har Vector Displacement Mapping använt sig av ett format med fyra färgkanaler med 32-bitars flyttal. Detta val motiveras av att Direct3D 11.1 hårdvara inte garanterar hårdvaruacceleration vid användning av det önskade formatet med tre färgkanaler innehållande 32- bitars flyttal, enligt [MSDN d 2014]. Garanterad hårdvaruacceleration eftersträvas även i detta arbete för att det ska rikta sig mot spel. Implementationen använder sig av ett format med en färgkanal med 32-bitars flyttal för Displacementtexturen. Då båda texturerna har upplösningen 1024x1024 innebär det att Displacement-texturen upptar 4,2 MB och Vector Displacement-texturen upptar 16,8 MB grafikminne. Ekvation 6.1 illustrerar hur grafikminnesanvändningen beräknas. Hade det önskade formatet kunnat användas hade samma beräkningssätt klargjort att 12,6 MB istället hade krävts för en Vector Displacement-textur. 4,2 MB går alltså till spillo då det är grafikminnesutrymme som allokeras även om det inte används. Ekvation 6.1 Den övre ekvationen illustrerar beräkningarna gjorda för att fastställa Vector Displacement-texturens storlek medan den nedre visar Displacement-texturens beräkningar. 4 respektive 1 är antalet färgkanaler som används. 32 är antalet bitar per färgkanal, detta divideras med 8 för att få antalet bytes. Problemet som beskrivs ovan kan lindras genom att den tidigare icke använda alfakanalen istället fylls ut med liknande data som använts till en annan teknik. Kravet på tekniken är då att en färgkanal är tillräcklig samt att den också använder sig av flyttalsvärden. Möjliga tekniker är Displacement Mapping och Bump mapping, Figur 6.1 illustrerar ett exempel. På detta sätt kan alltså motiveras att Vector Displacement Mapping kräver 12,6 MB grafikminnesanvändning och inte 16,8 MB trots att texturformatet som hade resulterat i 12,6 MB grafikminnesanvändning inte garanteras hårdvaruacceleration. Figur 6.1 En Displacement-textur kombineras med en Vector Displacement-textur för att skapa en svamp. Displacement skapar svampens stam och Vector Displacement skapar hatten [Pixologic b 2013]. 14

Trots att dagens grafikkort avsedda för spelrendering har stora minnesutrymmen på 1 till 4 GB blir renderingsteknikers grafikminnesanvändning relevant då det ofta är ett högt antal texturer, shaders och buffrar som samtidigt behöver finnas i grafikkortets minne för snabb åtkomst för att kunna applicera alla de renderingstekniker som behövs samtidigt i ett spel för att uppnå en hög realism. 15

7 Slutsats, Diskussion och Framtida Arbete Denna avslutande del presenterar och för diskussion kring de slutsatser som dras baserat på resultatet. Även framtida arbeten och möjligheter diskuteras. 7.1 Slutsats och Diskussion Slutsatsen som dras baserat på arbetet och svaret på forskningsfrågan är att Vector Displacement Mapping skiljer sig svagt från Displacement mapping vad gäller exekveringstid, nämligen det som presenterades i kapitel 5.5. Även om mättiderna relativt till varandra skiljer sig är siffrorna så pass små att de blir mindre relevanta i sammanhanget realtidsapplikationer och spel och förklaringen till detta är följande: Önskvärt är ofta att 3D-spel kan generera ungefär 60 bilder per sekund. Detta innebär att varje individuell bild måste genereras inom ungefär 16,667 ms. Den största skillnaden i exekveringstid för Displacement Mapping och Vector Displacement Mapping beskrevs som 0,041159 ms i stycke 5.5. När detta slutligen jämförs mot 16,667 ms blir det klart att skillnaden i detta sammanhang är relativt liten. Ovanstående slutsats antyder att Vector Displacement Mapping kan användas i sammanhang som liknar de sammanhang då Displacement Mapping används, i synnerhet då ökad detaljnivå i form av överhängande geometri, som det beskrivs tidigare, är önskvärt. Värt att nämnas är dock att relevansen av slutsatsen sjunker något på grund av testscenen och hårdvaran som har använts i mätningarna. Möjligen hade mätvärdena och skillnaden mellan dem kunnat se annorlunda ut vid användning av mer komplexa triangelobjekt i högre kvantitet och andra systemspecifikationer i högre kvantitet. Slutsatsen ovan gäller främst för de centrala skillnader som tidigare förklaras mellan Displacement Mapping och Vector Displacement Mapping. Arbetet omfattar inte de mindre centrala skillnader och varierande faktorer mellan teknikerna och eventuella implementationer av dem. Några av dessa skillnader och variabler är hantering av artefakter, teknikernas interaktion med relaterade tekniker och varierande samplingsfilter. De mindre centrala aspekterna är viktiga att utforska i sambandet då en implementering av enbart de centrala delarna av tekniken inte kan garantera tillräckligt tillfredställande visuella resultat. Några av de artefakter aktuella vid olika sorters Displacement Mapping-tekniker diskuterar [Nießner och Loop 2013]. Typerna av artefakter som nämns är textursömmar, omberäkning av normalriktning och artefakter i samband med sampling. Detta är aspekter som bör tas i åtanke vid implementation av teknikerna då även det visuella resultatet önskas uppnå en viss nivå. Slutsatsen som dras angående grafikminnesanvändningen av Vector Displacement Mapping är att den i förhållande till grafikminnesanvändningen av Displacement Mapping ökar med en faktor 3 som minst. Önskas i nuläget garanti att implementationer av Vector Displacement Mapping erhåller hårdvaruacceleration samt förutsättningar för hög visuell kvalité ökar grafikminnesanvändningen istället med en faktor 4. Med de båda slutsatserna som grund kan det argumenteras att grafikminnesanvändningen är den mer relevanta aspekten att överväga vid implementation av Vector Displacement Mapping. Vidare diskussion och undersökning krävs dock för att detta ska fastställas. Detta då implementationer av tekniken oftast tillämpas tillsammans med ett flertal andra tekniker och då behövs även deras grafikminnesanvändning, som kan variera kraftigt, tas i åtanke. Mätningarna antyder att tesseleringen själv står för en stor del av den totala exekveringstiden för Vector Displacement Mapping vilket tyder på att Vector Displacement Mapping lämpar sig för användning i spel och implementationer som redan använder sig av tesselering. Tesselering kan motiveras som ett bra implementationsval i spelsammanhang genom alla de fördelar som tekniken erbjuder och möjliggör. 7.2 Framtida Arbete De genomförda testerna hade vid mindre tidsbegränsning kunnat utökas med olika samplingsfilter för att ytterligare öka testernas omfattning då implementationer ofta använder sig av ett flertal olika samplingsfilter. Mer omfattande prestandamätningar är relevanta att genomföra där dessa inkluderar hantering av de artefakter som uppstår i samband med teknikerna. Detta på grund av att hantering av artefakter kan innebära fler beräkningar och operationer och således påverka exekveringstid. 16

Ett liknande arbete hade kunnat vara mer omfattande genom att testa fler olika systemspecifikationer, vars relevans diskuteras i samband med slutsatsen i stycke 7.1. För att placera tekniken inom ramarna av spel kan framtida forskning genomföra prestandamätningar baserat på tekniken implementerad tillsammans med andra renderingstekniker och mer avancerade testscener där ett visuellt resultat också produceras. Dessa renderingstekniker och scener bör då vara relevanta i spelsammanhang. Ytterligare kan tekniken placeras inom ramarna av spelutvecklingsprocessen i kommersiella sammanhang där det bör undersökas hur effektivt det är för grafiker att producera texturerna som används av tekniken samt hur krävande det är att implementera den. Här bör också vikten av det visuella resultatet och teknikens bidrag till produkten undersökas och vägas mot teknikens kostnad. Det nuvarande arbetet görs utan en komplett bild av rollen som Vector Displacement Mapping för nuvarande spelar inom spelutveckling. Ett antagande att Vector Displacement Mapping är mindre utforskat inom spel har gjorts baserat på att nuvarande publicerad litteratur främst omfattar Displacement Mapping med en skalär. För att få en mer komplett bild av Vector Displacement Mapping och teknikens roll inom spelutveckling krävs att undersökningar förs som omfattar svar från intervjuer eller svar genom enkäter där svaren kommer ifrån personer inom spelutvecklingsbranschen som har erfarenhet av tekniken. Detta är ett lämpligt område att utforska genom framtida arbeten. På grund av tidsbegränsning använder sig implementationen enbart av heltalspartionering vid tesselering vilket ger objektiva resultat men motsvarande mätningar vid användning av andra partitioneringsmetoder är relevanta att genomföra i vidare arbeten då dessa partitioneringsmetoder också är möjliga val vid en implementering av tekniken. Tesseleringen i implementationen är likt den övriga implementationen på en grundnivå vilket är tillräckligt för att besvara frågeställningen i detta arbete men i verkliga spel kan tesseleringen se annorlunda ut vilket begränsar graden av relevans som resultatet i det avseendet genererar. Framtida arbete kan lämpligen också grena ut sig till andra realtidssammanhang än spel. Detta då spel delar likheter med andra realtidssammanhang men även då, som tidigare nämnt, tekniken har tillämpats i ett flertal ämnen [Hanyoung Jang och JungHyun Han 2012] och således visar sig ha varierande användningsområden. 17

8 Referenser 8.1 Litteratur EIMANDAR, P., 2013. DirectX 11.1 Game Programming, Packt Publishing Ltd. HANYOUNG JANG OCH JUNGHYUN HAN, 2012. Feature-preserving Displacement Mapping With Graphics Processing Unit (GPU) Tessellation. Computer Graphics Forum, 31(6), pp.1880 94. HOLMERTZ LILJEKVIST, P. OCH ZSIGMOND, A., 2013. Real-Time Tessellation. Bachelor Thesis, Department of Computer Science at the Blekinge Institute of Technology. LUNA, F.D., 2012. Introduction to 3D game programming with DirectX 11, Dulles, VA: Mercury Learning and Information. MIKKELSEN, M., 2008. Simulation of wrinkled surfaces revisited. Master thesis, Department of Computer Science at the University of Copenhagen. NIEßNER, M. OCH LOOP, C., 2013. Analytic Displacement Mapping Using Hardware Tessellation. ACM Trans. Graph., 32(3), pp.26:1 26:9. PETERSSON, S., 2011. Terrain with Cliffs. Master Thesis, Department of Computer Science at the Blekinge Institute of Technology. 8.2 Webb CRYTEK, 2013. http://cryengine.com/features EPIC GAMES, 2014. https://www.unrealengine.com/products/unreal-engine-4 MSDN A, 2014. http://msdn.microsoft.com/en-us/library/windows/desktop/ff476340(v=vs.85).aspx MSDN B, 2014. http://msdn.microsoft.com/en-us/library/windows/desktop/ff476882(v=vs.85).aspx MSDN C, 2014. http://msdn.microsoft.com/en-us/library/windows/desktop/bb509561(v=vs.85).aspx MSDN D, 2014. http://msdn.microsoft.com/en-us/library/windows/desktop/hh404483(v=vs.85).aspx PIXAR A, 2014. http://renderman.pixar.com/view/vector-displacements PIXOLOGIC A, 2013. http://docs.pixologic.com/user-guide/3d-modeling/exporting-your-model/vectordisplacement-maps/ 8.3 Bilder DARIO LANZA A, 2013. http://support.nextlimit.com/download/attachments/16810383/displamecent_mushrooms_01. jpg?api=v2 DARIO LANZA B, 2013. http://support.nextlimit.com/download/attachments/16810383/displamecent_mushrooms_02. jpg?api=v2 GDALLIMORE, 2010. http://en.wikipedia.org/wiki/file:bump_map_vs_isosurface2.png NVIDIA, 2014. http://international.download.nvidia.com/webassets/en_us/shared/images/technologies/direc tx11/alien-displacement-mapping.png 18

PETERSSON, S., 2011. Terrain with Cliffs. Master Thesis, Department of Computer Science at the Blekinge Institute of Technology. PIXAR B, 2014. http://rendermansite.pixar.com/ca_twopointo_cms_data/images/16623_5836.jpg PIXAR C, 2014. http://rendermansite.pixar.com/ca_twopointo_cms_data/images/19593_5837.jpg PIXOLOGIC B, 2013. http://docs.pixologic.com/wp-content/uploads/2013/01/vectordisp02.jpg 19

9 Ordlista Vertex Avser engelskans Vertex som i 3D-programmering används för att beskriva en punkt i 3D-rymden. Vertiser avser pluralformen av vertex. Triangelobjekt Avser engelskans Mesh som i 3D-programmering beskriver objekten som byggs upp av ett antal trianglar och representerar objekt som karaktärer, terräng och majoriteten av de objekt som utgör världen i ett 3D-spel. En triangel utgörs av tre vertiser. Geometrisk primitiv En simpel geometrisk form. I 3D-programmering avser en primitiv ofta en vertex, linje eller triangel som utgörs av en, två respektive tre vertiser. Geometrisk Topologi I Direct3D 11 används topologier för att beskriva hur olika geometriska primitiver ska sammansättas. En geometrisk topologi kan beskriva att aktuella trianglar är sammanhängande och delar vertiser med varandra medan en annan geometrisk topologi beskriver att aktuella trianglar är separata och inte delar vertiser med varandra. Transformation I sammanhanget 3D-programmering avser en transformation att rotera, skala eller förflytta en punkt i 3D-rymden. Genom att applicera samma transformation på samtliga vertiser i ett triangelobjekt kan man på så vis skala, rotera och förflytta hela triangelobjektet. 20

10 Bilagor 10.1 Tesselering Shadereffektfilen som användes vid prestandamätningar av enbart tesselering. Notera att denna kod är densamma som den som användes för Displacement Mapping, bortsett från en bortkommenterad rad. // DisplacementPerformance.fx // Direct3D 11 Shader Model 5.0 Demo // Emrik Lundström, 2014. // Buffers cbuffer cbperobject float4x4 gworld; float4x4 gviewproj; cbuffer cbtessfactors int gedgetessfactor; int ginsidetessfactor; // Nonnumeric values cannot be added to a cbuffer. Texture2D gdisplacementmap; // Samplerstates SamplerState samlinear Filter = MIN_MAG_MIP_LINEAR; AddressU = WRAP; AddressV = WRAP; // Input and Output Structures //Used for tesselation struct VertexIn float3 PosL float3 Normal float2 Tex struct VertexOut float3 PosW float3 Normal float2 Tex : POSITION; : NORMAL; : TEXCOORD; : POSITION; : NORMAL; : TEXCOORD; 21

struct PatchTess float EdgeTess[3] : SV_TessFactor; float InsideTess : SV_InsideTessFactor; struct HullOut float3 PosW float3 Normal float2 Tex struct DomainOut float4 PosH : POSITION; : NORMAL; : TEXCOORD; : SV_POSITION; // Shaders // Transform to world position and Pass along other values. VertexOut VS(VertexIn vin) VertexOut vout; vout.posw vout.normal vout.tex = mul(float4(vin.posl, 1.0f), gworld).xyz; = vin.normal; = vin.tex; return vout; // Generate and output per-patch data such as the quad tessellation factors. // if a tessellation factor for a patch is set to zero, the patch is culled from the rest of the pipeline. PatchTess ConstantHS(InputPatch<VertexOut, 3> patch, uint patchid : SV_PrimitiveID) PatchTess pt; pt.edgetess[0] = gedgetessfactor; pt.edgetess[1] = gedgetessfactor; pt.edgetess[2] = gedgetessfactor; pt.insidetess = ginsidetessfactor; return pt; // Passes along vertex. [domain("tri")] [partitioning("integer")] [outputtopology("triangle_cw")] [outputcontrolpoints(3)] [patchconstantfunc("constanths")] [maxtessfactor(64.0f)] HullOut HS(InputPatch<VertexOut, 3> p, uint i : SV_OutputControlPointID, uint patchid : SV_PrimitiveID) 22

HullOut hout; hout.posw hout.normal hout.tex = p[i].posw; = p[i].normal; = p[i].tex; return hout; //Domainshader doing Displacement Mapping. [domain("tri")] DomainOut DispMapDS(PatchTess patchtess, float3 barycoords : SV_DomainLocation, const OutputPatch<HullOut, 3> tri) DomainOut dout; float3 pos = barycoords.x*tri[0].posw + barycoords.y*tri[1].posw + barycoords.z*tri[2].posw; float3 normal = barycoords.x*tri[0].normal +barycoords.y*tri[1].normal + barycoords.z*tri[2].normal; float2 tex = barycoords.x*tri[0].tex + barycoords.y*tri[1].tex + barycoords.z*tri[2].tex; // // Displacement mapping // //Sample from the red channel as the texture only has 1 channel //pos += (gdisplacementmap.samplelevel(samlinear, tex, 0).r) * normal; dout.posh = mul(float4(pos, 1.0f), gviewproj); return dout; float4 PS(DomainOut pin) : SV_TARGET return float4(0.0f, 1.0f, 1.0f, 1.0f); // Technique: Displacement Mapping for performance test technique11 DisplacementMappingPerformanceTest pass DisplacementMapping SetVertexShader( CompileShader( vs_5_0, VS() ) ); SetHullShader( CompileShader( hs_5_0, HS() ) ); SetDomainShader( CompileShader( ds_5_0, DispMapDS() ) ); SetGeometryShader( NULL ); //SetPixelShader( CompileShader( ps_5_0, PS() ) ); SetPixelShader( NULL ); 23

10.2 Displacement Mapping Shadereffektfilen som användes vid prestandamätningar av Displacement Mapping. Som tidigare nämnt liknande koden i stycke 10.1, med undantaget av en rad kod som inte är bortkommenterad. // DisplacementPerformance.fx // Direct3D 11 Shader Model 5.0 Demo // Emrik Lundström, 2014. // Buffers cbuffer cbperobject float4x4 gworld; float4x4 gviewproj; cbuffer cbtessfactors int gedgetessfactor; int ginsidetessfactor; // Nonnumeric values cannot be added to a cbuffer. Texture2D gdisplacementmap; // Samplerstates SamplerState samlinear Filter = MIN_MAG_MIP_LINEAR; AddressU = WRAP; AddressV = WRAP; // Input and Output Structures //Used for tesselation struct VertexIn float3 PosL float3 Normal float2 Tex struct VertexOut float3 PosW float3 Normal float2 Tex : POSITION; : NORMAL; : TEXCOORD; : POSITION; : NORMAL; : TEXCOORD; struct PatchTess float EdgeTess[3] : SV_TessFactor; float InsideTess : SV_InsideTessFactor; 24

struct HullOut float3 PosW float3 Normal float2 Tex struct DomainOut float4 PosH : POSITION; : NORMAL; : TEXCOORD; : SV_POSITION; // Shaders // Transform to world position and Pass along other values. VertexOut VS(VertexIn vin) VertexOut vout; vout.posw vout.normal vout.tex = mul(float4(vin.posl, 1.0f), gworld).xyz; = vin.normal; = vin.tex; return vout; // Generate and output per-patch data such as the quad tessellation factors. // if a tessellation factor for a patch is set to zero, the patch is culled from the rest of the pipeline. PatchTess ConstantHS(InputPatch<VertexOut, 3> patch, uint patchid : SV_PrimitiveID) PatchTess pt; pt.edgetess[0] = gedgetessfactor; pt.edgetess[1] = gedgetessfactor; pt.edgetess[2] = gedgetessfactor; pt.insidetess = ginsidetessfactor; return pt; // Passes along vertex. [domain("tri")] [partitioning("integer")] [outputtopology("triangle_cw")] [outputcontrolpoints(3)] [patchconstantfunc("constanths")] [maxtessfactor(64.0f)] HullOut HS(InputPatch<VertexOut, 3> p, uint i : SV_OutputControlPointID, uint patchid : SV_PrimitiveID) HullOut hout; hout.posw hout.normal = p[i].posw; = p[i].normal; 25

hout.tex = p[i].tex; return hout; //Domainshader doing Displacement Mapping. [domain("tri")] DomainOut DispMapDS(PatchTess patchtess, float3 barycoords : SV_DomainLocation, const OutputPatch<HullOut, 3> tri) DomainOut dout; float3 pos = barycoords.x*tri[0].posw + barycoords.y*tri[1].posw + barycoords.z*tri[2].posw; float3 normal = barycoords.x*tri[0].normal +barycoords.y*tri[1].normal + barycoords.z*tri[2].normal; float2 tex = barycoords.x*tri[0].tex + barycoords.y*tri[1].tex + barycoords.z*tri[2].tex; // // Displacement mapping // //Sample from the red channel as the texture only has 1 channel pos += (gdisplacementmap.samplelevel(samlinear, tex, 0).r) * normal; dout.posh = mul(float4(pos, 1.0f), gviewproj); return dout; float4 PS(DomainOut pin) : SV_TARGET return float4(0.0f, 1.0f, 1.0f, 1.0f); // Technique: Displacement Mapping for performance test technique11 DisplacementMappingPerformanceTest pass DisplacementMapping SetVertexShader( CompileShader( vs_5_0, VS() ) ); SetHullShader( CompileShader( hs_5_0, HS() ) ); SetDomainShader( CompileShader( ds_5_0, DispMapDS() ) ); SetGeometryShader( NULL ); //SetPixelShader( CompileShader( ps_5_0, PS() ) ); SetPixelShader( NULL ); 10.3 Vector Displacement Mapping Shadereffektfilen som användes för prestandamätning av Vector Displacement Mapping. // VectorDisplacementPerformance.fx // Direct3D 11 Shader Model 5.0 Demo 26

// Emrik Lundström, 2014. // Buffers cbuffer cbperobject float4x4 gworld; float4x4 gviewproj; cbuffer cbtessfactors int gedgetessfactor; int ginsidetessfactor; // Nonnumeric values cannot be added to a cbuffer. Texture2D gvectordisplacementmap; // Samplerstates SamplerState samlinear Filter = MIN_MAG_MIP_LINEAR; AddressU = WRAP; AddressV = WRAP; // Input and Output Structures struct VertexIn float3 PosL float3 Normal float2 Tex struct VertexOut float3 PosW float3 Normal float2 Tex : POSITION; : NORMAL; : TEXCOORD; : POSITION; : NORMAL; : TEXCOORD; struct PatchTess float EdgeTess[3] : SV_TessFactor; float InsideTess : SV_InsideTessFactor; struct HullOut float3 PosW float3 Normal float2 Tex : POSITION; : NORMAL; : TEXCOORD; 27

struct DomainOut float4 PosH : SV_POSITION; // Shaders // Transform to world position and Pass along other values. VertexOut VS(VertexIn vin) VertexOut vout; vout.posw vout.normal vout.tex = mul(float4(vin.posl, 1.0f), gworld).xyz; = vin.normal; = vin.tex; return vout; // Generate and output per-patch data such as the quad tessellation factors. // if a tessellation factor for a patch is set to zero, the patch is culled from the rest of the pipeline. PatchTess ConstantHS(InputPatch<VertexOut, 3> patch, uint patchid : SV_PrimitiveID) PatchTess pt; pt.edgetess[0] = gedgetessfactor; pt.edgetess[1] = gedgetessfactor; pt.edgetess[2] = gedgetessfactor; pt.insidetess = ginsidetessfactor; return pt; // Passes along vertex. [domain("tri")] [partitioning("integer")] [outputtopology("triangle_cw")] [outputcontrolpoints(3)] [patchconstantfunc("constanths")] [maxtessfactor(64.0f)] HullOut HS(InputPatch<VertexOut, 3> p, uint i : SV_OutputControlPointID, uint patchid : SV_PrimitiveID) HullOut hout; hout.posw hout.normal hout.tex = p[i].posw; = p[i].normal; = p[i].tex; return hout; //Domainshader doing Vector Displacement Mapping. [domain("tri")] DomainOut VecDispMapDS(PatchTess patchtess, float3 barycoords : SV_DomainLocation, 28

DomainOut dout; const OutputPatch<HullOut, 3> tri) float3 pos = barycoords.x*tri[0].posw + barycoords.y*tri[1].posw + barycoords.z*tri[2].posw; float3 normal = barycoords.x*tri[0].normal + barycoords.y*tri[1].normal + barycoords.z*tri[2].normal; float2 tex = barycoords.x*tri[0].tex + barycoords.y*tri[1].tex + barycoords.z*tri[2].tex; // // Vector Displacement mapping // //Sample from the red, green and blue channels as the texture has 4 //channels (the alpha channel is not used in this case, however) in //Vector Displacement Mapping. pos += gvectordisplacementmap.samplelevel(samlinear, tex, 0).rgb; dout.posh = mul(float4(pos, 1.0f), gviewproj); return dout; float4 PS(DomainOut pin) : SV_TARGET return float4(0.0f, 1.0f, 1.0f, 1.0f); // Technique: Vector Displacement Mapping for performance test technique11 VectorDisplacementMappingPerformanceTest pass VectorDisplacementMapping SetVertexShader( CompileShader( vs_5_0, VS() ) ); SetGeometryShader( NULL ); SetHullShader( CompileShader( hs_5_0, HS() ) ); SetDomainShader( CompileShader( ds_5_0, VecDispMapDS() ) ); SetPixelShader( NULL ); //SetPixelShader( CompileShader( ps_5_0, PS() ) ); 29