v 12 gpu programmierung [kompatibilitätsmodus]...sprachmerkmale von glslsprachmerkmale von glsl...
TRANSCRIPT
GPU Programmierung
12. VorlesunggPhotorealistische Computergrafik
Thorsten Grosch
Standard OpenGL Pipeline verändernStandard OpenGL Pipeline verändern
Bisher: Jeder glVertex(…) Punkt durchläuft dieBisher: Jeder glVertex(…) Punkt durchläuft die Standard OpenGL PipelineJetzt: Funktionalität verschiedener Stufen der Pipeline kann verändert werdenkann verändert werdenVeränderungen sind möglich auf Ebene von
(Eck-)Punkten (Vertex-Program)(Eck-)Punkten (Vertex-Program) Grafikprimitiven (Geometry-Program) Pixeln (Fragment-Program)
Thorsten Grosch - 2 -
Die programmierbare PipelineDie programmierbare PipelineVertex Program
(V t Sh d )(Vertex Shader)Programm pro Eckpunkt
Geometry Program(Geometry Shader)
Fragment Program(Pixel Shader)
Programm pro Grafikprimitiv
Thorsten Grosch - 3 -
(Pixel Shader)Programm pro Pixel
Eigenschaften Vertex ProgramEigenschaften Vertex Program
Arbeitet nur auf einem EckpunktArbeitet nur auf einem EckpunktKeine Information über Topologie (andere Eckpunkte) Keine Punkte erzeugen oder löschenKeine Punkte erzeugen oder löschen
Wahlfreier Zugriff auf TexturspeicherWahlfreier Zugriff auf TexturspeicherAuslesen des abgespeicherten Wertes an einer beliebigen Position innerhalb einer Textur (Textur =beliebigen Position innerhalb einer Textur (Textur = 2D Array mit Daten)
Thorsten Grosch - 4 -
Normale“ Aufgaben Vertex Program„Normale Aufgaben Vertex Program
EckpunkttransformationEckpunkttransformationWeltkoordinaten in Kamerakoordinaten (Modelview)Transformation in kanonisches Volumen (Projection)( j )
NormalentransformationTransponierte Inverse
Beleuchtung in Kamerakoordinaten
Automatische Generierung von Texturkoordinaten ...
Thorsten Grosch - 5 -
Was gehört nicht ins Vertex ProgramWas gehört nicht ins Vertex Program
Clipping am kanonischen Volumen (-w +w)Clipping am kanonischen Volumen (-w…+w)Perspektivische Division (x/w, y/w, z/w) (Color Clamping an [0 1])(Color Clamping an [0,1])
Thorsten Grosch - 6 -
Vertex Program schematischVertex Program schematischTexturspeicherp
Position (Welt) Position (kan Vol + )
Vertex
Position (Welt)
Farbe
Normale
Position (kan.Vol. –w..+w)
Farbe
ProgramTexturkoordinaten
Benutzerdefinierte Att ib t
Texturkoordinaten
Benutzerdefinierte AttributeAttribute Attribute
OpenGL State(Lichtquellen, Materialien, Matrizen)
Benutzerdefinierte (uniform)Daten
Thorsten Grosch - 7 -
Eigenschaften Fragment ProgramEigenschaften Fragment Program FragmentProgramProgram
Vertex Processor
Rasterizer Fragment Processor
Arbeitet am Ende der PipelineWird für jedes zu zeichnende Fragment (Pixel)
Processor
d ü jedes u e c e de ag e t ( e )aufgerufenArbeitet nur auf aktuellem Fragment (Pixel)
K i L d S h ib f d Pi l i F b ffKein Lesen oder Schreiben auf andere Pixel im FramebufferEingabe: Interpolierte Werte aus EckpunktenWahlfreier Zugriff auf Texturspeicher
Thorsten Grosch - 8 -
Wahlfreier Zugriff auf Texturspeicher
Fragment ProgramFragment Program„Normale“ Aufgaben Fragment Program„Normale Aufgaben Fragment Program
Farbe des Pixels festlegenTexturzugriffEff kt ( B N b l)Effekte (z.B. Nebel)
Was ein Fragment-Program nicht leistetWas ein Fragment-Program nicht leistetDepth-TestStencil-Test Wird nach den Fragment-
P d h füh tAlpha-Blending
Programmen durchgeführt
Thorsten Grosch - 9 -
Fragment Program schematischFragment Program schematischTexturspeicherp
Fragment
Interpolierte Farbe
InterpolierteTexturkoordinaten
PixelfarbegProgram
Texturkoordinaten
Interpoliertebenutzerdefinierte
(Tiefenwert)
benutzerdefinierteAttribute
OpenGL State(Lichtquellen, Materialien, Matrizen)
Benutzerdefinierte (uniform)Daten
Thorsten Grosch - 10 -
GPU programmieren DamalsGPU programmieren - DamalsProgrammierung in MaschinenspracheProgrammierung in MaschinenspracheProgramme werden sehr schnell unübersichtlich ...
vs 1 0vs.1.0 def c94, 0.18f, 0.18f, 0.18f, 0.18f ; Scalar for cube map adjustmentm4x4 oPos, v0, c16 ; OutPos = ObjSpacePos * Composite WVP-Matrix mov oT0.xy, v7 ;Passthrough texcoord 0 for bump map addressing add r8, c28, -v0 ;View direction m3x3 r9, r8, c20 ;Transform view vector from object space to env spacedp3 r11.x, r9, r9 ;Magnitude^2
11 11 1/rsq r11.y, r11.x ;1/mag mul oT4.xyz, r9, r11.y ;Normalize ...
Thorsten Grosch - 11 -
GPU programmieren HeuteGPU programmieren - HeuteProgrammierung in einer HochspracheProgrammierung in einer HochspracheCompiler zur Übersetzung in MaschinenspracheErste Shading-Languages
RenderMan (Pixar 1988)Stanford Real-Time Shading Language (2001)
AktuellAktuellCg (NVIDIA, OpenGL und DirectX)HLSL (Microsoft, DirectX)O GL Sh di L (GLSL)OpenGL Shading Language (GLSL)
Weitere (GPGPU)Cuda (NVIDIA), CTM (ATI)Cuda (NVIDIA), CTM (ATI)Brook, Sh
Thorsten Grosch - 12 -
OpenGL Shading Language (GLSL)OpenGL Shading Language (GLSL)Teil des OpenGL 2.0 StandardsTeil des OpenGL 2.0 StandardsSyntax orientiert sich an C / C++
FunktionenEi f h D (fl i b l)Einfache Datentypen (float, int, bool)StrukturenArraysyBedingungen SchleifenAber: Keine ZeigerAber: Keine Zeiger
Beliebige Länge der Shader-Programme
Thorsten Grosch - 13 -
Sprachmerkmale von GLSLSprachmerkmale von GLSLVektoren und MatrizenVektoren und Matrizen
vec4 (Vektor bestehend aus 4 float-Werten), …mat4 (4x4 float-Matrix), …
Operationen auf Vektoren und Matrizen (SIMD)o = m * n (Matrixmultiplikation)u v + w (Vektoraddition)
mat4 n, m, o; u = v + w (Vektoraddition)u = cross(v,w) (Kreuzprodukt)f = dot(u,v) (Skalarprodukt)
vec4 u, v, w; float f;
u = mod(v, w) (komp.weises Modulo % für float Vektoren)…
Vi l i h i h F k iViele weitere mathematische Funktionensin(x), cos(x), tan(x), …http://www.opengl.org/sdk/libs/OpenSceneGraph/glsl quickref.pdf
Thorsten Grosch - 14 -
p p g g p p g _q p
Swizzle / MaskingSwizzle / MaskingSwizzle (Komponenten eines Vektors vertauschen)Swizzle (Komponenten eines Vektors vertauschen)
Rechte Seite der Zuweisungu = v.zxyw
zxvu = xy
vu =yz
vu =ww
vu =
Masking (Nur in bestimmte Komponenten schreiben)Linke Seite der Zuweisunggv.xy = v + n
Skalare Werte mehrfach zuweisen
xxxnvv += yyy
nvv +=wz
vv , unverändert
Skalare Werte mehrfach zuweisenu.xy = dot(v.xyz,w.xyz)
zzyyxxyxwvwvwvuu ++==
uu unverändertwz
uu , unverändert
Thorsten Grosch - 15 -
TypkonvertierungTypkonvertierung
TypkonvertierungTypkonvertierungAnders als in C
• int i;• float f = float(i); // Fehler bei f = i
Konvertierung muß meist von Hand gemacht werdenBeispiel
4 4(1 0 2 0 3 0 1 0)• vec4 v = vec4(1.0, 2.0, 3.0, 1.0);• vec3 v2 = v.xyz; // Fehler bei v2 = v
Thorsten Grosch - 16 -
Ein und Ausgabe beiEin- und Ausgabe bei Shader Programmen
Zugriff auf Eigenschaften des aktuellen Eckpunktes bzw. Fragments über vordefinierte VariablenAusgabe der Shader-Programme über vordefinierte Ausgabe-VariablenAusgabe bei Vertex-Programmen
Werte werden linear interpoliert• Farbe Texturkoordinaten• Farbe, Texturkoordinaten, …
Zugriff in Fragment Shader auf interpolierte WerteZusätzlich eigene Ausgabe-Variablen
i i bl “ ät h d• „varying variables“ – später mehr dazu …
Thorsten Grosch - 17 -
Ein und AusgabeparameterEin- und Ausgabeparameter
SAusgabe
• Position (gl_Position)
Vertex ShaderEingabe
• Position (gl_Vertex)• Farbe (gl_FrontColor)• Texturkoordinaten (gl_TexCoord[])
(g _ )• Farbe (gl_Color)• Normale (gl_Normal)• Texturkoordinaten (gl_MultiTexCoordn)
AusgabeFragment Shader
Eingabe Ausgabe• Pixelfarbe (gl_FragColor)• Tiefenwert (gl_FragDepth)
g• Farbe (gl_Color)• Texturkoordinaten (gl_TexCoord[])
Komplette Liste http://www.opengl.org/sdk/libs/OpenSceneGraph/glsl_quickref.pdf
Thorsten Grosch - 18 -
GLSL ProgrammierungGLSL ProgrammierungShader Objekt erzeugenShader Objekt erzeugen
vertexShader = glCreateShader(GL_VERTEX_SHADER);
Source-Code bereitstellenQuelltext aus Textdatei einlesen und übergebenglShaderSource(vertexShader, 1, &sourcePtr, NULL);
sourcePtr vom Typ char*(„string“)
Shader compilierenglCompileShader(vertexShader);
y ( g )
glCompileShader(vertexShader);
Thorsten Grosch - 19 -
GLSL ProgrammierungGLSL ProgrammierungShader Program Objekt erzeugenShader Program Objekt erzeugen
program = glCreateProgram();
Shader Program mit Shadern bestücken
Shader Program
VertexShaderg
glAttachShader(program,vertexShader);
Program linken
Shader
GeometryShader
glLinkProgram(program);
Program benutzen FragmentShader
glUseProgram(program);
Zurück zur OpenGL Fixed-Function Pipeline( )glUseProgram(0);
Fehlerabfrage: siehe Beispielprogramme
Thorsten Grosch - 20 -
Fehlerabfrage: siehe Beispielprogramme
Uniform VariablenUniform VariablenBenutzerdefinierte Daten in Shader ladenBenutzerdefinierte Daten in Shader laden
Innerhalb von Shadern nur Lesezugriff Wert konstant für GrafikprimitivParameter mit seltener Änderung z B TimerParameter mit seltener Änderung, z.B. Timer
Applikation (OpenGL Programm)
// Program muss aktiv sein Shader// Program muss aktiv seinglUseProgram(shader);
// Speicherstelle innerhalb // Sh d P bf
Shaderuniform float Time;
void main()// Shader-Program abfragenGLuint loc;loc=glGetUniformLocation(shader, "Time");
(){
…}
// Wert setzenglUniform1f(loc, 2.314);
Wenn der String nicht gefunden wird, dann wird loc 1 zurückgegeben
Thorsten Grosch - 21 -
dann wird loc = -1 zurückgegeben
Zugriff auf OpenGL StateZugriff auf OpenGL-StateZugriff über vordefinierte Uniform-VariablenZugriff über vordefinierte Uniform VariablenWerden automatisch gesetztBeispiele
gl_ModelViewMatrixgl_ModelViewProjectionMatrixgl ProjectionMatrixgl_ProjectionMatrixgl_ModelViewMatrixInverseTransposegl_LightSource[0..n]gl FrontMaterialgl_FrontMaterial…http://www.opengl.org/sdk/libs/OpenSceneGraph/glsl_quickref.pdf
Thorsten Grosch - 22 -
Minimales GLSL ProgrammMinimales GLSL-ProgrammVertex-ShaderVertex Shadervoid main(){{
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;gl_FrontColor = gl_Color;
}
Fragment-Shader
}
Fragment Shadervoid main(){{
gl_FragColor = gl_Color;}
Thorsten Grosch - 23 -
Einfache Beleuchtung mit GLSLEinfache Beleuchtung mit GLSLBeleuchtung passiert im „Standard“ OpenGL VertexBeleuchtung passiert im „Standard OpenGL Vertex ProgramBei eigenem Vertex Program muss Beleuchtung selbst programmiert werdenprogrammiert werdenNormale Beleuchtung mit OpenGL
Transformation in KamerakoordinatenTransformation der Normalen mit transponierter InverseBeleuchtung pro Eckpunkt in Kamerakoordinaten
Vereinfachte VarianteVereinfachte Variante1 LichtBeleuchtung in WeltkoordinatenNur diffuse Beleuchtung
Thorsten Grosch - 24 -
Gouraud Shading im Vertex ProgramGouraud Shading im Vertex Program
Szenario: LichtquelleNSzenario:
void main()
EckpunktN
lightVec
o d a (){vec3 normal = normalize(gl_Normal); // Falls nicht normiert
vec3 lightVec = gl LightSource[0] position xyz // Vektor zurvec3 lightVec = gl_LightSource[0].position.xyz – // Vektor zurgl_Vertex.xyz; // Lichtquelle
lightVec = normalize(lightVec); // Normalisierenfloat cosinus = dot(normal lightVec); // Empfängercosinusfloat cosinus = dot(normal, lightVec); // Empfängercosinusgl_FrontColor = gl_FrontMaterial.diffuse * // Farbe berechnen
gl_LightSource[0].diffuse *icosinus;
gl_Position = ftransform(); // Transformation in kanonisches Volumen}
Thorsten Grosch - 25 -
}ftransform(): Fixed-Function-Pipeline-TransformEntspricht gl_ModelViewProjectionMatrix * gl_Vertex, aber evtl. andere Rundungsgenauigkeit
Phong ShadingPhong ShadingBeleuchtung pro Pixel im Fragment ProgramBeleuchtung pro Pixel im Fragment ProgramNormalen müssen interpoliert werdenProblem mit OpenGL
Normalen werden nach der ModelView-Transformation weggeworfenPosition des Eckpunktes wird nach dem Clipping p pp gweggeworfen
Normalen und Position müssen an Fragment Program weitergegeben werdenweitergegeben werden
Nur wie?
Thorsten Grosch - 26 -
Werteübergabe von Vertex ProgramWerteübergabe von Vertex Program an Fragment Program
GLSLNormalen und Position in „varying variables“ ablegenvarying variablesvarying variables
• Benutzerdefinierte Variablen• Können beliebige Werte enthalten (Geschwindigkeit, …)• Lineare Interpolation zwischen den Eckpunkten
CgCg„varying variables“ existieren dort nichtNormale und Position in Texturkoordinaten ablegenT t k di t d l d i i bl “Texturkoordinaten werden analog zu den „varying variables“ zwischen den Eckpunkten interpoliert
Thorsten Grosch - 27 -
Phong Shading Vertex ProgramPhong Shading Vertex Program
varying vec4 position;varying vec3 normal;
void main()void main(){
position = gl_Vertex;normal = gl_Normal;gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
Thorsten Grosch - 28 -
Phong Shading Fragment ProgramPhong Shading Fragment Program
varying vec4 position;varying vec4 position;varying vec3 normal;
void main()void main(){
vec3 normal = normalize(normal);3 li htV l Li htS [0] iti itivec3 lightVec = gl_LightSource[0].position.xyz - position.xyz;
lightVec = normalize(lightVec);
float cosinus dot(normal lightVec);float cosinus = dot(normal, lightVec);
gl_FragColor = gl_FrontMaterial.diffuse * gl LightSource[0].diffuse * cosinus;gl_LightSource[0].diffuse cosinus;
}
Thorsten Grosch - 29 -
Vergleich Gouraud Phong ShadingVergleich Gouraud – Phong Shading
Thorsten Grosch - 30 -
TexturenTexturenIm Rahmen der GPU-Programmierung nicht nur zurIm Rahmen der GPU Programmierung nicht nur zur Speicherung von Farbinformationen gedacht
Normalen (Bump-Mapping)Tiefeninformationen (Depth Peeling)Tiefeninformationen (Depth-Peeling)Strahlen (Ray-Tracing)…
Eigener Datentyp in GLSLsampler1D, sampler2D, sampler3D (1,2 und 3D-Texturen)samplerCube (Cube Maps)sampler1DShadow, sampler2DShadow (Depth Maps)
T t i d if V i bl Sh dTextur wird per uniform-Variable an Shader übergeben
Thorsten Grosch - 31 -
Zugriff auf TexturenZugriff auf TexturenTexturzugriff in (Fragment) Shader an PositionTexturzugriff in (Fragment) Shader an Position gl_TexCoord[0].st
uniform sampler2D simpleTexture;uniform sampler2D simpleTexture;
void main(){{
vec3 value = texture2D(simpleTexture, gl_TexCoord[0].st).xyz;…
}}
Thorsten Grosch - 32 -
Zugriff auf TexturenZugriff auf TexturenAlternativ: Texturzugriff über Integer Pixel Koordinaten g g(funktioniert nur bei neueren Grafikkarten)gl_FragCoord.xy ist die Pixelposition des aktuellen FragmentsTypischer Zugriff bei Deep FramebufferTypischer Zugriff bei Deep Framebuffer
uniform sampler2D simpleTexture;
void main(){
ivec2 pixelCoords = ivec2(gl FragCoord.xy);p (g _ g y);vec3 value = texelFetch2D(simpleTexture, pixelCoords,0);…
}}
Thorsten Grosch - 33 -
Texturen an Shader übergebenTexturen an Shader übergebenTextur generieren und ggf. mit Daten füllen (Applikation)Textur generieren und ggf. mit Daten füllen (Applikation)
glGenTextures(1, &texture);glBindTexture(GL_TEXTURE_2D, texture);glTexParameterf(GL TEXTURE 2D GL TEXTURE WRAP S GL CLAMP);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);…glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
GL LINEAR);GL_LINEAR);…
Textur binden und an Shader übergeben (Applikation)g ( pp )glBindTexture(GL_TEXTURE_2D, texture);GLint location = glGetUniformLocation(shaderProgram, "simpleTexture");glUniform1i(location, 0);glUniform1i(location, 0);
Sieht „komisch“ aus …Übergibt aktuell gebundene Textur
Thorsten Grosch - 34 -
Übergibt aktuell gebundene Textur
Mehrere Texturen übergebenMehrere Texturen übergebenglGenTextures (1, &positionTextureId);glBindTexture (GL_TEXTURE_2D, positionTextureId);lT P t i (GL TEXTURE 2D GL TEXTURE MIN FILTER GL NEAREST)glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glGenTextures (1 &normalTextureId);glGenTextures (1, &normalTextureId);glBindTexture (GL_TEXTURE_2D, normalTextureId);glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glActiveTexture(GL_TEXTURE0);glBindTexture (GL_TEXTURE_2D, positionTextureId); glActiveTexture(GL TEXTURE1);glActiveTexture(GL_TEXTURE1);glBindTexture (GL_TEXTURE_2D, normalTextureId);…
Aktuelle Textureinheit festlegeng
Thorsten Grosch - 35 -
Mehrere Texturen übergebenMehrere Texturen übergeben
GLint p_location = glGetUniformLocation(shaderProgram, „positionTexture");glUniform1i(p_location, 0);
GLint n_location = glGetUniformLocation(shaderProgram, „normalTexture");glUniform1i(n_location, 1);
Die Nummer i entspricht hier der Textur, die mitglActiveTexture(GL_TEXTURE<i>) gesetzt wurdegesetzt wurde
Thorsten Grosch - 36 -
Multi Pass RenderingMulti-Pass RenderingViele Algorithmen benötigen Zugriff auf die NachbarnViele Algorithmen benötigen Zugriff auf die Nachbarn eines Pixels
Filter in der BildverarbeitungPost Processing Effekte (z B Glow Effekt siehe Übung)Post-Processing Effekte (z.B. Glow-Effekt, siehe Übung)
Zugriff auf benachbarte Pixel des Framebuffersginnerhalb eines Fragment-Programs nicht möglich
Lösung: Multi Pass RenderingLösung: Multi-Pass RenderingErgebnis eines Rendering-Schrittes als Eingabe des folgenden Schrittes verwendenD d ül i Bild h h h D hlä fDas endgültige Bild entsteht erst nach mehreren Durchläufen
Thorsten Grosch - 37 -
Multi Pass RenderingMulti-Pass RenderingSzene „normal“ rendernSzene „normal rendernFramebuffer auslesen und in Textur kopierenTextur an Shader-Program übergebenViewport auf Größe der Textur setzenBildschirmfüllendes Rechteck zeichnen
glBegin(GL_QUADS);glTexCoord2f(0,0);glVertex2f(-1,-1);glTexCoord2f(1,0);
(1,1) (1,1)(0,1)(-1,1)
Fü j d T l d T t i d i F t
glVertex2f( 1,-1);…
glEnd()(-1,-1) (0,0) (1,0) (1,-1)
Für jedes Texel der Textur wird genau ein Fragment generiertZugriff auf Nachbarpixel nun über Texturzugriff
Thorsten Grosch - 38 -
Bsp Multi-PassBsp. Multi-PassAuf Original addieren
(Bild aus GPU Gems)(Bild aus GPU Gems)
Glühende Teile in Textur rendern
Horizontaler Filterauf Textur anwenden
Vertikaler Filterauf Textur anwenden
Ein Filter benötigt Informationen über NachbarpixelBild muß als Textur vorliegen, da kein Zugriff auf Nachbarpixel im Framebuffer möglich
Glow Effect, siehe Übung
Thorsten Grosch - 39 -
Frame Buffer ObjectsFrame Buffer Objects
Direktes Rendern in TexturDirektes Rendern in TexturBild wird nicht angezeigtKein Kopiervorgang nötig für Framebuffer TexturKein Kopiervorgang nötig für Framebuffer Textur
Die Alternative glCopyTexImage2D(…) kopiert den Framebufferinhalt in eine Textur
BedingungenMind. 1 Color Textur muß gesetzt seinGröße für alle Texturen muß definiert und gleich sein
Thorsten Grosch - 40 -
FrameBufferObjectsFrameBufferObjects// FBO generierengglGenFramebuffersEXT (1, &myFB);// als aktuellen FBO setzenglBindFramebufferEXT (GL FRAMEBUFFER EXT, myFB);g ( _ _ , y );// Textur zuweisenglFramebufferTexture2DEXT (GL_FRAMEBUFFER_EXT,
GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, colorTextureId, 0);_ _ _ _ _ )glFramebufferTexture2DEXT (GL_FRAMEBUFFER_EXT,
GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, depthTextureId, 0);….
glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, myFB); // FBO aktivieren…// alles hier wird in die Textur gezeichnet (und ist nicht direkt sichtbar!)…glBindFramebufferEXT (GL FRAMEBUFFER EXT, 0); // FBO deaktiviereng ( _ _ , );
Thorsten Grosch - 41 -
Beispiele für GPU Programmierung:Normal MappingProgrammierung:Normal Mapping
Unebenheiten auf Oberflächen durch Veränderungen der Normalen simulierenOberflächendetails müssen nicht durch zusätzlicheOberflächendetails müssen nicht durch zusätzliche Geometrie dargestellt werdenNormalen zur Beleuchtung pro Pixel aus Textur (N l M ) l(Normal Map) auslesen
Thorsten Grosch - 42 -
Normal Mapping KoordinatensystemNormal Mapping - Koordinatensystem
Alle an der Beleuchtung beteiligten VektorenAlle an der Beleuchtung beteiligten VektorenNormale aus TexturVektor zur Lichtquelle Vektor zum Augpunkt
)(nr
)(lr
)(erVektor zum Augpunktmüssen im gleichen Koordinatensystem vorliegenIn welchem Koordinatensystem soll liegen?
)(e
nry gWelt- oder Objektkoordinaten• Bei Objektbewegungen müssen alle Normalen der
Normal Map mit verschoben werdenNormal Map mit verschoben werden• Normalen müssten zur Beleuchtung pro Pixel in
Kamerakoordinaten umgerechnet werden• Normal Map wäre nicht wiederverwendbar• Normal Map wäre nicht wiederverwendbar• schlechte Wahl
Niklas Henrich - 43 -
Tangent SpaceTangent Space
Tangente (x-Richtung)Binormale (y-Richtung)Normale (z-Richtung)
Lokales Koordinatensystem pro PolygonLokales Koordinatensystem pro PolygonGleiches Koordinatensystem, in dem definiert istNormal Map kann wiederverwendet werden
nr
Grober AblaufVertex Shader transformiert und in Tangent SpaceVertex Shader übergibt transfomierte Vektoren an Fragment
lr
er
Vertex Shader übergibt transfomierte Vektoren an Fragment Shader (lineare Interpolation)Pixel Shader liest Normale aus Textur aus und führt Lichtberechnung mit interpolierten und durchl
rer
nr
Thorsten Grosch - 44 -
Lichtberechnung mit interpolierten und durchl e
Cube MappingCube MappingEine Form des Environment MappingsUmgeb ng ird d rch 6 Te t ren beschriebenUmgebung wird durch 6 Texturen beschrieben
Kamera mit 90° Öffnungswinkel sieht nach vorne, hinten, oben, unten, links und rechts
Texturen aus Media-Ordner der
Thorsten Grosch - 45 -
DirectX SDK March 2008© Microsoft Corp.
Environment MappingEnvironment MappingSimulation von Objekten, die deren UmgebungSimulation von Objekten, die deren Umgebung reflektierenGespiegelten oder gebrochenen Strahl als „look-up“ in die Cube Map benutzenin die Cube Map benutzen
nr Vertex Shader…r = reflect(i, n);…i
r rr
…C l t t C b ( M )
Fragment Shader
envColor = textureCube(envMap,r);…
Cube Map
Thorsten Grosch - 46 -
Environment Mapping ErgebnisseEnvironment Mapping - Ergebnisse
r = reflect(i n)r reflect(i, n)ersetzt durchr = refract(i, n, 1.1)
Thorsten Grosch - 47 -
Multiple Render Targets (MRTs)Multiple Render Targets (MRTs)Render Targetg
Speicher, in den die Ausgabe des Fragment Shaders geschrieben wird (ähnlich dem Frame Buffer)
Verschiedene Render Targets können gleichzeitig als Ausgabe g g g gdes Fragment Shaders gebunden werden
Geometrie muß nur einmal durch die PipelineErmöglichen die Ausgabe verschiedener Informationen in einem Schritt
Render Target 1
Deep
FragmentProgram
Render Target 1
Render Target 2Normale
p Fram
Program
Render Target 3
ebuffe…
Thorsten Grosch - 48 -
r…
…
Multiple Render TargetsMultiple Render Targets// MRT FBO for position/normal/colorglGenFramebuffersEXT (1, &mrtFB);glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, mrtFB);glFramebufferTexture2DEXT (GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
GL TEXTURE 2D viewerPositionTextureId 0);GL_TEXTURE_2D, viewerPositionTextureId, 0);glFramebufferTexture2DEXT (GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT,
GL_TEXTURE_2D, viewerNormalTextureId, 0);glFramebufferTexture2DEXT (GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT2_EXT,
GL_TEXTURE_2D, viewerColorTextureId, 0);glFramebufferTexture2DEXT (GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
GL_TEXTURE_2D, depthTextureId, 0);
GLenum buffers[3] = {GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_COLOR_ATTACHMENT2_EXT};
glDrawBuffers(3, buffers);glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, 0);
Reihenfolge der Buffer
Thorsten Grosch - 49 -
Multiple Render TargetsMultiple Render Targets// MRT Vertex Shader // MRT Fragment Shadervarying vec4 position;varying vec3 normal;varying vec4 color;
varying vec4 position; varying vec3 normal;varying vec4 color;
void main(){
position = gl_Vertex; normal = gl_Normal;
void main(){
gl_FragData[0] = position;gcolor = gl_Color;
gl_Position = ftransform();}
gl_FragData[1] = vec4(normal, 0.0);gl_FragData[2] = color;
}}
Thorsten Grosch - 50 -
LiteraturLiteraturOpenGL Shading Language (2nd Edition) – Rost et al.,OpenGL Shading Language (2nd Edition) Rost et al., Addison-Wesley, 2006
Q i k R fQuick Referencehttp://www.opengl.org/sdk/libs/OpenSceneGraph/glsl_quickref.pdf
Tutorials, z.B.http://www lighthouse3d com/opengl/glsl/http://www.lighthouse3d.com/opengl/glsl/
Was man sonst noch mit der GPU anstellen kann (G G )(General Purpose GPU)
http://www.gpgpu.orgLineare Algebra, Voxelisierung, Physik Simulation, Partikel, …
Thorsten Grosch - 51 -
Lineare Algebra, Voxelisierung, Physik Simulation, Partikel, …
GLSL Funktionalität nutzbar machenGLSL Funktionalität nutzbar machen
GLSL ab OpenGL 2.0 verfügbarGLSL ab OpenGL 2.0 verfügbarGLSL auch als OpenGL Extension verfügbar
Damit es auch auf älteren Karten (hoffentlich) läuftf G (O GExtension mit Hilfe von GLEW (OpenGL Extension
Wrangler) nutzbar machenEinfach, bequem und plattformunabhängigEinfach, bequem und plattformunabhängighttp://glew.sourceforge.net/
Ablauf1. GLEW includen (vor GLUT!)2. GLUT initialisieren und Fenster anlegen3 GLEW initialisieren3. GLEW initialisieren4. OpenGL 2.0 Support abfragen5. Siehe ShaderFramework in der Übung!
Thorsten Grosch - 52 -
g
GLEW installieren Visual Studio 2005GLEW installieren - Visual Studio 2005
1 GLEW von http://glew sourceforge net/ laden1. GLEW von http://glew.sourceforge.net/ laden2. „Binaries“ Version für Windows wählen3 GLEW entpacken3. GLEW entpacken4. Datei GLEW\bin\glew32.dll nach C:\Windows\System32
kopierenkopieren5. Datei GLEW\lib\glew32.lib nach
C:\Programme\Microsoft Visual Studio g8\VC\PlatformSDK\Lib
6. Dateien GLEW\include\GL\{glew.h|wglew.h} nach {g | g }C:\Programme\Microsoft Visual Studio 8\VC\PlatformSDK\Include\GL
Thorsten Grosch - 53 -
GLEW installieren Visual Studio 2008GLEW installieren - Visual Studio 2008
1 GLEW von http://glew sourceforge net/ laden1. GLEW von http://glew.sourceforge.net/ laden2. „Binaries“ Version für Windows wählen3 GLEW entpacken3. GLEW entpacken4. Datei GLEW\bin\glew32.dll nach C:\Windows\System32
kopierenkopieren5. Datei GLEW\lib\glew32.lib nach C:\Program
Files\Microsoft SDKs\Windows\v6.0A\Lib kopierenp6. Dateien GLEW\include\GL\{glew.h|wglew.h} nach
C:\Program Files\Microsoft gSDKs\Windows\v6.0A\Include\GL kopieren
Thorsten Grosch - 54 -
GLEW Libs - Visual Studio 2005 & 2008GLEW Libs Visual Studio 2005 & 20081. Projekt Eigenschaften2. Konfiguration auf „Alle Konfigurationen“ stellen3. Konfigurationseigenschaften Linker Eingabe Zusätzliche
Abhängigkeiten: glew32.lib eintragen
Debugger für GLSL:Debugger für GLSL:
glslDevil, Uni Stuttgart
Thorsten Grosch - 55 -