Shaders. Gustav Taxén

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

Grafiska pipelinens funktion

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

Varför behövs grafikbibliotek? Introduktion till OpenGL. OpenGL är ett grafikbibliotek. Fördelar med OpenGL. Allmänt om OpenGL. Nackdelar med OpenGL

RTG-formatet Gustav Taxén,

Laboration - Shaders

OpenGL AGI HT05. Gustav Taxén

OpenGL-översikt. OpenGL. Viktigt att komma ihåg: OpenGL-kommandon. OpenGL är en tillståndsmaskin. Transformationer. Geometrispecifikation

Mälardalens högskola Västerås, Maj 2006 Institutionen för Datavetenskap och Elektronik, IDE Student: Alexander Andersson E-post:

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

OpenGL-översikt. OpenGL. Lokala koordinatsystem. Transformationer. Hierarkiska modeller. Animation. Transformation Byte av koordinatsystem

Transformationer i 3D. Gustav Taxén

Designing a Shading System. David Larsson

Geometry shaders! och Tesselation shaders!

LUNDS UNIVERSITET. Parallell exekvering av Float32 och INT32 operationer

CG C för Grafik. Fredrik Bärg Institutionen för Informationsbehandling Åbo Akademi, FIN Åbo, Finland E-post:

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!

OpenGL. grafikbibliotek? Nackdelar med OpenGL. Fördelar med OpenGL. En introduktion till OpenGL. OpenGL. rdvara. Grafikhårdvara.

Grafiska pipelinen. Edvin Fischer

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

Procedurell renderingsmotor i Javascript och HTML5

En introduktion till OpenGL. Gustav Taxén

Kurvor och ytor. Gustav Taxén

Procedurell 3D-eld på grafikkortet

OpenGL, Maya och specialeffekter

Information Coding / Computer Graphics, ISY, LiTH. Compute shaders!! Framtiden för GPU computing eller sen efterapning av Direct Compute?

2D-grafik. Gustav Taxén

3D-texturmaterial med hjälp av Cg 3D materials with Cg

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

Teknik för avancerade datorspel!

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

Texturmappningsalgoritmer

Teknik för avancerade datorspel!

Rastrering och displayalgoritmer. Gustav Taxén

OpenGL-översikt. Mer OpenGL. Består-av-hierarki. Hierarkiska modeller. Från hierarki till kod, steg 1. Lokala koordinatsystem

Transformationer. Translation. Skalning. Homogena koordinater. Rotation. 2D-grafik. x y. Inom datorgrafik är transformationer den. Många. bevaras.

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

Abstrakta shadergrafer för hårdvarushaders med multipla shaderspråk Richard Svensson

TNM022 Proceduella Bilder Rendering av proceduell päls i realtid

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

Procedurell Terräng med LOD i OpenGL 4

Procedurell grottgenerator och eld i GLSL. Marcus Widegren

Information Coding / Computer Graphics, ISY, LiTH

Här är ett väldigt bra tidpunkt att spara scenen. Jag har valt att bygga ett litet pyramidtorn.

Vector Displacement Mapping

Den tekniska utvecklingen av hårdvara och mjukvara för realtidsgrafik

OpenGL, Maya och specialeffekter

Datorarkitekturer med operativsystem ERIK LARSSON

Introduktion till Datalogi DD1339. Föreläsning 2 22 sept 2014

Procedurella Grottor TNM084. Sammanfattning. Alexander Steen

Institutionen för systemteknik

OpenGL, Maya och specialeffekter

Föreläsning 2 Programmeringsteknik och C DD1316

Assemblerprogrammering för ARM del 3

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

Introduktion till MATLAB, med utgångspunkt från Ada

Transformationer, Angel

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

Skinning and Animation

Realtids-strålföljning med geometriska primitiver på programmerbara grafikprocessorer (HS-IDA-EA )

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

C-Uppsats i Datavetenskap. Skinning på GPUn. Med dubbel kvaternioner. Författare: Björn Overå Handledare: Martin Blomberg Termin: VT12 Kurskod: 2DV40E

Matematisk Modellering

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

MATLAB. Python. Det finns flera andra program som liknar MATLAB. Sage, Octave, Maple och...

För att komma igång. Ta skissen från designlabben eller motsvarande och lägg in den i front/side/top fönstret/fönstrena.

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

Objektorienterad Programmering (TDDC77)

IS1200 Datorteknik. Övning CE_O4 Maskinnära programmering med C Förberedelser till hemlaboration 1

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

2D1342 Programkonstruktion för F1, ht 2006

Simulering av rök på GPU

Lågnivåprogrammering. Föreläsning 2 Lågnivåprogrammering. Binära tal. En enkel modell av datorns inre

Algebra och Geometri SF1624

Introduktion till objektorientering. Vad är objektorientering egentligen? Hur relaterar det till datatyper? Hur relaterar det till verkligheten?

Föreläsning 3-4 Innehåll

I Skapa Hej.java och skriv programmet. I Kompilera med javac Hej.java. I Rätta fel och repetera tills du lyckas kompilera ditt program

5. En metod som anropar sig själv a) får inte förekomma i Java-program b) kallas destruktiv c) kallas iterativ d) kallas rekursiv 6. Vilka värden har

LABORATION 4 OBJEKTORIENTERAD PROGRAMMERING I C++ I

Föreläsning 2 Programmeringsteknik och C DD1316. Mikael Djurfeldt

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

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

2D1339 Programkonstruktion för F1, ht 2004

Transparens i en deferred pipeline Stefan Hanna

Mönsterigenkänning och följning Digitala projekt VT 2004 Carl Loodberg, grupp 10

Information Coding / Computer Graphics, ISY, LiTH CUDA. En lösning för generella beräkningar. En introduktion: Programmingsmodell och språk

HALFTONE SHADER APP HEMSIDA: Skapad av: John Tolunay

Per Holm Lågnivåprogrammering 2014/15 24 / 177. int och double = = 2, 147, 483, 647

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

Shader Shader. Shader 4.1

Projekt i TNM084, Procedurella bilder

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Exempelduggan. Luffarschack. Koda spel

Introduktion till MATLAB

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

Parallellism i NVIDIAs Fermi GPU

Displaysystem. Hans Brandtberg Saab Avitronics SAAB AVITRONICS

Assemblerprogrammering, ARM-Cortex M4 del 3

Program kan beskrivas på olika abstrak3onsnivåer. Högnivåprogram: läsbart (för människor), hög abstrak3onsnivå, enkelt a> porta (fly>a 3ll en annan ar

2D1339 Programkonstruktion för F1, ht 2003

Transkript:

Shaders Gustav Taxén gustavt@csc.kth.se 2D1640 Grafik och Interaktionsprogrammering VT 2007

Shading l 2 P l 1 n v Givet en punkt P på en yta, en normal n, riktningsvektorer l i mot ljuskällor och en kamerariktning v, ta reda på vilken färg P ska ha.

Fixed-function function-pipelines CPU Application Graphics hardware Per-vertex operations Primitive assembly Rasterization Per-fragment operations Framebuffer

Programerbara pipelines CPU Application Graphics hardware Programmable vertex processor Primitive assembly Rasterization Programmable fragment processor Framebuffer

Vertexprocessorer Vertex-program Vertex-position, Normal, Texture coords, RGBA, Egen data Vertexprocessor Matriser, Positioner för ljuskällor, Materialparametrar, Blandningsfaktorer, Egen data Vertex-position, Normal, Texture coords, RGBA

Vertexprocessorer n v t T = transmission_vector(n,v); (s,t) = to_background_tex_coord(t); color = texture_lookup(s,t);

Fragmentprocessorer Fragmentprogram Vertex-position, Texture coords, RGBA Fragmentprocessor RGBA Depth Matriser, Positioner för ljuskällor, Materialparametrar, Blandningsfaktorer, Egen data

Fragmentprocessorer Ctex = texture_lookup("wall",s,t); Ntex = tex_lookup("normal_map",s,t); color = Ctex * dot(ntex, L);

Syntax-exempel D3D Vertex Shader Assembler dp3 r7.w, VECTOR_VERTEXTOLIGHT, VECTOR_VERTEXTOLIGHT rsq VECTOR_VERTEXTOLIGHT.w, r7.w dst r7, r7.wwww, VECTOR_VERTEXTOLIGHT.wwww mul r6, r5, ATTENUATION.w OpenGL Vertex Program Assembler MOV R1, R2.yzwx; MUL R1.xyz, R2, R3; ADD R1, R2, -R3; RCP R1, R2.w;

nvidia Cg struct app2vert : application2vertex { float3 Position; //in object space float3 Normal; float2 TexCoord; }; struct vert2frag : vertex2fragment { float4 HPosition; // in projection space float4 TexCoord0; }; vert2frag main(app2vert IN, uniform float4x4 ModelViewProj, uniform float4x4 TexTransform) { vert2frag OUT; float4 HPosition; HPosition.xyz = IN.Position; HPosition.w = 1.0; OUT.HPosition = mul (HPosition, ModelViewProj); OUT.TexCoord0 = mul (HPosition, TexTransform); return OUT; }

Andra alternativ Microsoft DirectX9 / DirectX10: High-Level Shading Language (HLSL) OpenGL 2.0: OpenGL Shading Language HLSL är r i princip ekvivalent med Cg GLSL skiljer sig inte alltför r mycket

Vi är mitt i en revolution... Vertexprogram och fragmentprogram kan skrivas i ett enda språk k och kompileras till OpenGL och Direct3D Högnivåshaders med loopar m.m. kan användas ndas direkt i realtidsapplikationer Designers och formgivare kan exportera sina Maya/3DSMax /3DSMax-material direkt till hårdvaran

Realtidsgrafik idag http://www.nvidia.com/

Cg och OpenGL RGB, Texturkoord Interpolerade RGB, Texturkoord Geometri ("Varying") Rastrering Vertexprogram Fragmentprogram RGB "Uniform"- parametrar "Uniform"- parametrar

Cg och OpenGL Vertexprogram ersätter OpenGLs transformation- och ljussättningssteg Fragmentprogram ersätter (delvis) OpenGLs "operationer på fragment" Så vi måste sköta transformationer, färgblandning och texturkombinationer själva lva!

Cg profiles Olika grafikkort har olika funktionalitet Man kan kompilera Cg-program för olika typer av grafikkort, s.k.. profiler ("profiles profiles") Fråga grafikkortet vilken profil som stöds

Vertexprogram Indata per hörn ("varying varying"): Position (måste( alltid finnas) Normal Texturkoordinater Färg Användardefinierade ndardefinierade parametrar (skalär,, 2-, 2, 3-, 3, 4-4 vektor) (Och lite annat också) Fasta parametrar: samma värde under hela exekveringen ("uniform uniform")

Vertexprogram Varying Primitiver: glbegin() - glend() Position (x, y, z, w) Normal (x, y, z) Texturkoord (s, t) Färg (r, g, b, a) Uniform Modelviewmatris Projektionsmatris... Vertexprogram Utdata

Fragmentprogram Indata till fragmentprogrammet måste vara samma som utdata från vertexprogrammet (+ ev.. uniform-parametrar parametrar) Fragmentprogram måste ha en färg (RGBA) som utdata

Multitexturing RGBA från ljussättning (eller glcolor) RGBA från textur 0 Texture Unit 0 RGBA från textur 1 Texture Unit 1...

Texturkoordinater som indata Multitexturing har ingen effekt i en programmerbar pipeline Texturkoordinater är 4D-vektorer! Så man utnyttjar texturkoordinaterna för att skicka varying-data! Till vertex-program och mellan vertex- och fragment-program

Att köra Cg-program (OpenGL) Skapa en kontext där programmen lagras Välj profile Kompilera (eller hämta från binärfil rfil) Aktivera en profil och ett program Knyt parametrar Rita geometrin

Exempel Vi skriver ett par enkla cg-program "live".

Phong + Phong shading Ljuskälla h n l Hörn Kamera c = l col (k d (n l) + k s (n h) shininess )

Phong + Phong shading: Vertexprogram Varying: Position Normal Materialparametrar (Kd, Ks) Uniform: Modelview-matrisen och projection-matrisen Modelview-matrisen Inv. transp. av modelview-matrisen matrisen

void main(float4 Pobject : POSITION, float3 Nobject : NORMAL, float3 diffuse : TEXCOORD0, float3 specular : TEXCOORD1, uniform float4x4 ModelViewProj, uniform float4x4 ModelView, uniform float4x4 ModelViewIT, Indata { } out float4 HPosition : POSITION, out float3 Peye : TEXCOORD0, out float3 Neye : TEXCOORD1, out float3 Kd : COLOR0, out float3 Ks : COLOR1) Utdata HPosition = mul(modelviewproj, Pobject); Peye = mul(modelview, Pobject).xyz; Neye = mul(modelviewit, float4(nobject, 0)).xyz; Kd = diffuse; Ks = specular;

Indata float4 Pobject : POSITION Datatyp (Här: 32-bit 4D-vektor) Parameternamn Hur Cg ska tolka parametern ("binding semantics") POSITION Position NORMAL Normal TEXCOORD0 Texturkoord för enhet 0 TEXCOORD1 Texturkoord för enhet 1... COLOR eller COLOR0 RGB(A)-färg m.fl.

Utdata out float4 HPosition : POSITION Anger utdata Datatyp Parameternamn Binding semantics POSITION eller HPOS Position (homogena koordinater) TEXCOORD0 Texturkoord för enhet 0 TEXCOORD1 Texturkoord för enhet 1... COLOR0 RGB(A)-färg m.fl.

Programkod { } HPosition = mul(modelviewproj, Pobject); Peye = mul(modelview, Pobject).xyz; Neye = mul(modelviewit, float4(nobject, 0)).xyz; Kd = diffuse; Ks = specular; Skicka vidare Kd och Ks till fragmentprogrammet Modelview Projection Objektkoord för hörnet Hörnets ögonkoord (Modelview -1 ) T Nobject = hörnets normal cgglsetstatematrixparameter() används i OpenGL-koden för att koppla matriserna till Cg-parametrar

Phong + Phong shading: Fragmentprogram Varying: Vertexposition i ögonkoordinater Normal i ögonkoordinater Kd och Ks Uniform: Ljuskällans position i ögonkoordinater Ljuskällans färg (RGB) Shininess

half diffuse(half4 l) { return l.y; } half specular(half4 l) { return l.z; } half4 main(float3 Peye : TEXCOORD0, half3 Neye : TEXCOORD1, half2 uv : TEXCOORD2, half3 Kd : COLOR0, half3 Ks : COLOR1, uniform float3 Plight, uniform half3 lightcolor, uniform half3 shininess) : COLOR { half3 N = normalize(neye); half3 L = normalize(plight - Peye); half3 V = normalize(-peye); half3 H = normalize(l + V); half NdotL = dot(n, L), NdotH = dot(n, H); half4 lighting = lit(ndotl, NdotH, shininess); half3 C = lightcolor * (diffuse(lighting) * Kd + specular(lighting) * Ks); return half4(c, 1); }

Indata och utdata half4 main(...) 16-bitars 4D-vektor (tolkas automatiskt som RGBA för fragmentprogram)

Programkod half3 N = normalize(neye); half3 L = normalize(plight - Peye); half3 V = normalize(-peye); half3 H = normalize(l + V); Normera normalen Beräkna vektorn H (och normera den)

Programkod (forts) half diffuse(half4 l) { return l.y; } half specular(half4 l) { return l.z; } Hjälpfunktioner (se nedan) half NdotL = dot(n, L), NdotH = dot(n, H); (N L) och (N H) half4 lighting = lit(ndotl, NdotH, shininess); half3 C = lightcolor * (diffuse(lighting) * Kd + specular(lighting) * Ks); return half4(c, 1); x-värdet: 1 y-värdet: (N L) om > 0, annars 0 z-värdet: (N H) shininess om > 0, annars 0 w-värdet: 0 RGBA (A är normalt 1)

Resultat

Texturer Skapa texturobjekt i OpenGL (som( vanligt) Uniform-parametrar i fragmentprogrammet Koppla aktivt OpenGL-texturobjekt till Cg- parameter med kommandot cgglsettextureparameter() Aktivera texturering med cgglenabletextureparameter()

Texturer (forts) half4 main(float3 Peye... half2 uv } : TEXCOORD0, : TEXCOORD2,... uniform sampler2d diffusemap,... uniform half3 shininess) : COLOR) {... half3 C = lightcolor * (diffuse(lighting) * Kd * (half3)tex2d(diffusemap, uv).xyz + specular(lighting) * Ks);... tex2d(diffusemap, uv) ger RGBA för texturen på position uv. Detta tolkas om som en 16-bits 3D-vektor (RGB): x, y och z tas med.

Demo

Mer info http://developer.nvidia.com/