13.07.2015 Aufrufe

(7) Beleuchtung und Normalen

(7) Beleuchtung und Normalen

(7) Beleuchtung und Normalen

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

(7) <strong>Beleuchtung</strong> <strong>und</strong> <strong>Normalen</strong>VorlesungComputergrafik IIStefan MüllerDank an Niklas Henrich, Gerrit Lochmann,Stefan RillingU N I V E R S I T Ä TKOBLENZ · LANDAU


Wdh. 1: Shader anlegenconst GLchar *vs_source = „… VertextShaderprogramm …“const GLint vs_source_size = strlen(vs_source);GLuint vertexShaderHandle = glCreateShader(GL_VERTEX_SHADER);glShaderSource(vertexShaderHandle, 1, &vs_source, &vs_source_size);glCompileShader(vertexShaderHandle);const GLchar *fs_source = „… FragmentShaderprogramm …“const GLint fs_source_size = strlen(fs_source);GLuint fragmentShaderHandle = glCreateShader(GL_FRAGMENT_SHADER);glShaderSource(fragmentShaderHandle, 1, &fs_source, &fs_source_size);glCompileShader(fragmentShaderHandle);GLuint programHandle = glCreateProgram();glAttachShader(programHandle, vertexShaderHandle);glAttachShader(programHandle, fragmentShaderHandle);glLinkProgram(programHandle);…glUseProgram( programHandle)U N I V E R S I T Ä TKOBLENZ · LANDAUS. Müller - 2 -


Mehrere AttributeGLuint BufferObjectHandles[2];GLfloat Vertices[] = { -0.4, -0.4, -0.4, 0.4, 0.4, 0.4 };GLfloat Colours[] = { 1, 0, 0, 0, 1, 0, 0, 0, 1};glGenBuffers(2, BufferObjectHandles);glBindBuffer(GL_ARRAY_BUFFER, BufferObjectHandles[0]);glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);glEnableVertexAttribArray(0);glBindBuffer(GL_ARRAY_BUFFER, BufferObjectHandles[1]);glBufferData(GL_ARRAY_BUFFER, sizeof(Colours), Colours, GL_STATIC_DRAW);glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0);glEnableVertexAttribArray(1);//RenderschleifeglDrawArrays(GL_TRIANGLE_STRIP, 0, 3);U N I V E R S I T Ä TKOBLENZ · LANDAUS. Müller - 6 -


Übergabe derVertex-Attribute an ShaderU N I V E R S I T Ä TKOBLENZ · LANDAUS. Müller - 7 -


Einfache Variante (Variante 1)• Im Vertex-Shader werden dieStream-Daten auf eine „in“-Variable abgebildet.• Durch die Reihenfolge in derShaderprogrammierung ergibtsich eine default-Location(Index).• Auf der OpenGL-Seite mussman den jeweiligen Buffer nurder jeweilige Location zuweisen.• Diese entspricht auch dem Indexzum Einschalten des AttributesWir kennen die Location im Shaderlocation#version 330 //Vertex-Shaderin vec4 position;in vec4 colour;out vec4 OutColour;void main(){}gl_Position = position;OutColour = colour;glBindBuffer(GL_ARRAY_BUFFER, vertexbufferhandle);glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);glEnableVertexAttribArray(0);01U N I V E R S I T Ä TKOBLENZ · LANDAUS. Müller - 8 -


Variante 2: Eigenes LayoutWir setzen die Location im Shader#version 330 //Vertex-Shaderlayout (location = 4) in vec4 position;layout (location = 7) in vec4 colour;out vec4 OutColour;void main(){}gl_Position = position;OutColour = colour;• OpenGL…glBindBuffer(GL_ARRAY_BUFFER, vertexbufferhandle);glVertexAttribPointer(4, 2, GL_FLOAT, GL_FALSE, 0, 0);glEnableVertexAttribArray(4);glBindBuffer(GL_ARRAY_BUFFER, colourbufferhandle);glVertexAttribPointer(7, 3, GL_FLOAT, GL_FALSE, 0, 0);glEnableVertexAttribArray(7);U N I V E R S I T Ä TKOBLENZ · LANDAUS. Müller - 9 -


Wir suchen die Variable im Shader <strong>und</strong> definieren eine LocationVariante 3: Auf OpenGL-Seite#version 330 //Vertex-Shaderin vec4 position;in vec4 colour;out vec4 OutColour;…• OpenGL…glBindAttribLocation( programHandle, 5, "position");glBindAttribLocation( programHandle, 9, "colour");glLinkProgram(programHandle);Wichtig: vordem Linken!glBindBuffer(GL_ARRAY_BUFFER, vertexbufferhandle);glVertexAttribPointer(5, 2, GL_FLOAT, GL_FALSE, 0, 0);glEnableVertexAttribArray(5);glBindBuffer(GL_ARRAY_BUFFER, colourbufferhandle);glVertexAttribPointer(9, 3, GL_FLOAT, GL_FALSE, 0, 0);glEnableVertexAttribArray(9);U N I V E R S I T Ä TKOBLENZ · LANDAUS. Müller - 10 -


Variablen im/an den ShaderU N I V E R S I T Ä TKOBLENZ · LANDAUS. Müller - 11 -


Built-In Variablen• Es gibt eine Reihe vonvordefinierten input- <strong>und</strong> output-Variablen.• Vertex-Shaderin int gl_VertexID;out vec4 gl-Position;• Fragment-Shaderin vec4 gl_FragCoord;in int gl_SampleID;out vec4 gl_FragColor• Genaue Aufstellung:#version 330 //Vertexin vec4 position;void main(){gl_Position = position;}#version 330 //Fragmentvoid main(){gl_FragColor = vec4(1,1,0,1);}http://www.khronos.org/files/opengl41-quick-reference-card.pdfU N I V E R S I T Ä TKOBLENZ · LANDAUS. Müller - 12 -


Uniform Variablen• Neben den Stream-Werten (pro Vertex bzw.pro Fragment) kann mandem Shader nochuniforme (konstante)Variablen zuweisen#version 330 //Vertex-Shaderin vec4 position;uniform vec4 colour;out vec4 OutColour;void main(){gl_Position = position;OutColour = colour;}GLuint unifColourHandle = glGetUniformLocation( progrHandle, "colour");GLfloat blue[] = { 0, 0, 1, 1};glUniform4fv( unifColourHandle, 1, blue);U N I V E R S I T Ä TKOBLENZ · LANDAUS. Müller - 13 -


TransformationenU N I V E R S I T Ä TKOBLENZ · LANDAUS. Müller - 14 -


glm (OpenGL Mathematics)• Da es keine OpenGL MatrizenKommandos mehr gibt,brauchen wir eine Mathe-Lib• Als Mathe-Lib nehmen wir glm(OpenGL Mathematics), die sichan GLSL orientiert.• http://glm.g-truc.net• Dies ist eine include-Lib, d.h.dass man je nach Verwendungvon Kommandos auch dieentsprechen „.h“ Datei includenmuss.U N I V E R S I T Ä TKOBLENZ · LANDAUBsp.• Generell: glm.hpp• gtc/matrix_transform.hpp• Matrixtransformationen• gtc/matrix_inverse.hpp• Matrixinvertierung• glm/gtc/type_ptr.hpp• Sinnvoll, um glm-Vektoren <strong>und</strong> -Matrizes als GLSL-Parameter zuübergebenvec3 aVector(3);mat4 someMatrix(1.0);glUniform3fv(…, value_ptr(aVector));glUniformMatrix4fv(…, value_ptr(someMatrix));S. Müller - 15 -


glm#include // alles notwendige#include using namespace glm;mat4(1.0f); //LoadIdentitymat4 modelMat = rotate(mat4(1.0f), degrees(angle), vec3(1.0f,1.0f,0.0f));mat4 scaleMat = scale(mat4(1.0f), vec3(2.0f,1.0f,1.0f));mat4 transMat = translate(mat4(1.0f), vec3(2.0f,1.0f,1.0f));mat4 …= rotate(transMat, vec3(2.0f,1.0f,1.0f));mat4 frustum(float left, float right, float bottom, float top, float zNear,float zFar);mat4 ortho(float left, float right, float bottom, float top, float zNear,float zFar);mat4 lookAt( vec3 eye, vec3 center, vec3 up);mat4 perspective( float fovy, float aspect, float zNear, float zFar);U N I V E R S I T Ä TKOBLENZ · LANDAUS. Müller - 16 -


OpenGL Pipeline (Vertex-Shader)#version 330 //Vertexin vec4 positionAttribute;in vec4 normalAttribute;uniform mat4 uniformModel;uniform mat4 uniformView;uniform mat4 uniformNormal;uniform mat4 uniformProjection;void main(){}vec4 modelViewPosition = uniformView * uniformModel * positionAttribute;vec3 passNormal = normalize((uniformNormal * normalAttribute).xyz);gl_Position = uniformProjection * modelViewPosition;U N I V E R S I T Ä TKOBLENZ · LANDAUS. Müller - 17 -


OpenGL Pipeline (Appl.)Gluint ModelHandle = glGetUniformLocation(programHandle, "uniformModel");Gluint ViewHandle = glGetUniformLocation(programHandle, "uniformView");Gluint NormalHandle = glGetUniformLocation(programHandle, "uniformNormal");Gluint ProjHandle = glGetUniformLocation(programHandle, "uniformProjection");mat4 modelMatrix = rotate(mat4(1.0f), degrees(angle), vec3(1.0f,1.0f,0.0f));glUniformMatrix4fv( ModelHandle, 1, GL_FALSE, value_ptr(modelMatrix));mat4 viewMatrix = lookAt(vec3(0.0f,2.0f,3.0f), vec3(0.0f,0.0f,0.0f),vec3(0.0f,1.0f,0.0f));glUniformMatrix4fv(ViewHandle, 1, GL_FALSE, value_ptr(viewMatrix));mat4 projectionMatrix = perspective(60.0f, 4.0f / 3.0f, 0.1f, 100.f);glUniformMatrix4fv(ProjHandle, 1, GL_FALSE, value_ptr(projectionMatrix));mat4 normalMatrix = transpose(inverse(viewMatrix * modelMatrix));glUniformMatrix4fv(NormalHandle, 1, GL_FALSE, value_ptr(normalMatrix));}U N I V E R S I T Ä TKOBLENZ · LANDAUS. Müller - 18 -


Phong-ShaderU N I V E R S I T Ä TKOBLENZ · LANDAUS. Müller - 19 -


Normal-MappingU N I V E R S I T Ä TKOBLENZ · LANDAUS. Müller - 20 -


Die Welt ist voller Details• Viele Details treten in Form von Oberflächendetails aufU N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 21 -


Darstellung von OberflächendetailsSimulation durch Texturen• <strong>Beleuchtung</strong>• Bewegungsparallaxe• Verdeckung, VerschattungModellierung durch Geometrie• Eigentlich der „korrekte“ Weg• Hoher Detailsgrad = vieleDreieckeU N I V E R S I T Ä TKOBLENZ · LANDAU S. Müller - 22 -


Repräsentation von Oberflächendetails• Darstellung des Reliefsals Graustufentextur• Relief kommt „aus derTextur raus“• Relative Höhenangaben• Keine ÜberhängeU N I V E R S I T Ä TKOBLENZ · LANDAU


Zusammenfassung Oberflächendetails• Darstellung von Oberflächendetails erhöht Realismus• Zwei gr<strong>und</strong>legende Möglichkeiten1. Bildbasiert• Relief als Graustufentextur2. Durch Geometrie• Viele Dreiecke• Intelligente Tesselierung• Momentaner Trend zu bildbasierten VerfahrenU N I V E R S I T Ä TKOBLENZ · LANDAU


<strong>Beleuchtung</strong> des OberflächenreliefsWiederholung: Phong<strong>Beleuchtung</strong>smodell• Normale, Richtung desLichtes• Definition per Vertex• Berechnung perFragment• Interpolation von Licht<strong>und</strong> <strong>Normalen</strong>U N I V E R S I T Ä TKOBLENZ · LANDAU


<strong>Beleuchtung</strong> des Oberflächenreliefs• <strong>Beleuchtung</strong> hängt im Wesentlichen von der <strong>Normalen</strong>ab• Veränderte Normale → veränderte <strong>Beleuchtung</strong>• Oberflächenstruktur wird durch SchattierungwahrgenommenU N I V E R S I T Ä TKOBLENZ · LANDAU


<strong>Beleuchtung</strong> des Oberflächenreliefs• Normal Mapping• Beschreibung der Oberflächenstruktur durch <strong>Normalen</strong>U N I V E R S I T Ä TKOBLENZ · LANDAU


Oberflächenstruktur durch <strong>Normalen</strong>• <strong>Normalen</strong> werden nichtmehr interpoliert• Jedes Fragmentbekommt seine eigeneNormale• <strong>Beleuchtung</strong> desFragmentes mit dieser<strong>Normalen</strong>• <strong>Normalen</strong> ergeben sichaus OberflächenreliefU N I V E R S I T Ä TKOBLENZ · LANDAU


Normal Maps• Speichern der <strong>Normalen</strong> in Farb-Textur• x,y,z-Werte der <strong>Normalen</strong> als RGB-Werte• Height-Map kann im Alpha-Kanal gleichmitgespeichert werden (Relief-Map)U N I V E R S I T Ä TKOBLENZ · LANDAU


Erstellen von Normal Maps• Viele Wege führen nach Rom...• Erzeugen aus Height-Map (1. Ableitung)• x,y-RichtungN 1• z-Koordinate berechnen• Graphiksoftware (Photoshop, 3D Studio)U N I V E R S I T Ä TKOBLENZ · LANDAU


Erstellen von Normal Maps• Standardmäßig 8 Bit pro Farbkanal• Abbildung des Wertebereichs [-1,1] auf [0,255]U N I V E R S I T Ä TKOBLENZ · LANDAU


Zusammenfassung Normal Maps• Oberflächendetails durch <strong>Normalen</strong>• <strong>Normalen</strong> in Textur kodiert• <strong>Beleuchtung</strong> per Fragment• Zuordnung über TexturkoordinateU N I V E R S I T Ä TKOBLENZ · LANDAU


U N I V E R S I T Ä TKOBLENZ · LANDAUTangenten Space


Was bedeuten die Koordinaten?• RGB (1,0,0): Normale in x-Richtung• RGB (0,1,0): Normale in y-Richtung• RGB (0,0,1): Normale in z-Richtung• Frage• In welchem Koordinatensystem sind die <strong>Normalen</strong> aus derNormalmap definiert?U N I V E R S I T Ä TKOBLENZ · LANDAU


Koordinatensysteme→→• Eckpunkte <strong>und</strong> Eckpunktnormalen N imWeltkoordinatensystem• Lichtvektor L W im Weltkoordinatensystem• <strong>Normalen</strong> der Normalmap imTexturkoordinatensystemU N I V E R S I T Ä TKOBLENZ · LANDAU


Koordinatensysteme• Problem: Unterschiedliche Koordinatensysteme• So kann man nicht beleuchten• Lösung• Oberflächennormalen <strong>und</strong> Lichtvektor bzgl. einesOberflächenkooordinatensystems ausdrückenU N I V E R S I T Ä TKOBLENZ · LANDAU


KoordinatensystemeMan will• Objekte transformierenkönnen• Die Normalmap nicht jedesmal neu berechnenDas Oberflächenkoordinatensystemkann das!U N I V E R S I T Ä TKOBLENZ · LANDAU


KoordinatensystemeWarum in Oberlächenkoordinaten beleuchten?• Weltkoordinaten?• Jeden Wert der Normalmap in Weltkoordinaten transformieren• Alternativ: Normalmap gleich in Weltkoordinaten berechnen• Initiale Ausrichtung in der Welt muss bekannt sein• Neuberechnung der Normalmap bei jeder Rotation <strong>und</strong>Skalierung des Objektes• Objektkoordinaten?• Abhängig von Ausrichtung im lokalen Koordinatensystem• Statt Mehrfach-Referrenzierung jedes mal eigen NormalmapU N I V E R S I T Ä TKOBLENZ · LANDAU


Koordinatensysteme• Transformation jedes Texels ist teuer• Einfache Wiederverwendung der Normalmap• Einfacher Produktionsprozess• Arbeitszeit ist teuer...U N I V E R S I T Ä TKOBLENZ · LANDAU


Tangenten Space• Oberflächenkoordinatensystem wird als Tangent Spacebezeichnet• Tangentenvektor T • Bitangentenvektor B (wird gerne auch als Binormalebezeichnet)N • Oberflächennormale• <strong>Normalen</strong>basis• Definition im Koordinatensystem der Objekte / LichtquellenU N I V E R S I T Ä TKOBLENZ · LANDAU


Berechnung des Tangent SpaceU N I V E R S I T Ä TKOBLENZ · LANDAUMan kennt• Lage der Textur auf Dreieck(Texturkoordinaten)• Weltkoordinaten derEckpunkte• Oberflächennormale inWeltkoordinatenMan will• T B in Weltkoordinaten• TransformationsmatrixWK → TS


Berechnung des Tangent SpaceT • zeigt in aufsteigende u-RichtungB T B • zeigt in aufsteigende v-Richtung• sind normiert bzgl.TexturkoordinatenP1 s1T t1B P2 s2T t2Bmits 1=(u 1−u 0) ,s 2=(u 2−u 0)t 1=(v 1−v 0) ,t 2=(v 2−v 0)U N I V E R S I T Ä TKOBLENZ · LANDAU


Berechnung des Tangent SpaceP1P2 s1T t1B s T t B22• Lineares Gleichungssystem• 6 Unbekannte• 6 Gleichungen• lässt sich in Matrix-Form bringen:[(Δ P 1 ) x (Δ P 1 ) y (Δ P 1 ) zz] (Δ P 2) x(Δ P 2) y(Δ P 2) = [ s 1 t 12][ T x T y T zz]s 2t B xB yBU N I V E R S I T Ä TKOBLENZ · LANDAU


Berechnung des Tangent Space• Lösung durch Matrixinversion• T B müssen normalisiert werden[ T x T y T zB xB yB z] = 11[ t 2 −t (Δ P 1 1) x (Δ P 1 ) y (Δ P 1 ) zs 1t 2−s 1t−s 2s 1][(Δ P 2) x(Δ P 2) y(Δ P 2) z]• Ein Vektor fehlt noch...• Als dritter Vektor dient die NormaleU N I V E R S I T Ä TKOBLENZ · LANDAU


Von Weltkoordinaten in Tangent SpaceLTBN T B NxxxTBNyyyTBNzzz LWU N I V E R S I T Ä TKOBLENZ · LANDAU


Tangent Space Zusammenfassung• Wir haben damit• Berechnung einer Normalmap aus Heightmap (1. Ableitung)• erwendung der gleichen Normalmap für jedes beliebige Objekt• Die Ausgangsbasis für die folgenden Verfahren– Bump Mapping– Parallax Mapping– Relief MappingU N I V E R S I T Ä TKOBLENZ · LANDAU


Tangent Space Zusammenfassung• Die dunkle Seite der Macht• Tangentspace muss vorab berechnet werden– Übergabe an Shader als Vertex Attribut• Definition pro Dreieck– „Shared Vertices“: Mittelung aneinandergrenzender Dreiecke• Bei Änderung oder Transformation dre Geometrie neuberechnenU N I V E R S I T Ä TKOBLENZ · LANDAU


U N I V E R S I T Ä TKOBLENZ · LANDAUBump Mapping


Bump Mapping• 1978 erf<strong>und</strong>en von James Blinn• Normal Map <strong>und</strong> Tangent Space• Echtzeitfühig mit programmierbarer Graphikhardware• Wird oft DOT3 Bump Mapping, Tangent Space Mappingetc. genannt• Gr<strong>und</strong>legendes Vorgehen1) Pro Vertex Tangente <strong>und</strong> Bitangente berechnen (Applikation)2) Im Vertex Shader wird der Lichtvektor in den Tangentspacetransformiert3) Im Fragment Shader wird mittels des interpolierten Lichtvektors<strong>und</strong> Normal Map beleuchtetU N I V E R S I T Ä TKOBLENZ · LANDAU


U N I V E R S I T Ä TKOBLENZ · LANDAUParallax Mapping


Parallax Mapping• Bump Mapping sieht ganz gut aus, aber• Keine Selbstverdeckung• Keine Bewegungsparallaxe• Keine Selbstverschattung• Parallax Mapping (Kaneko et. al., 2001) als nächsterSchrittU N I V E R S I T Ä TKOBLENZ · LANDAU


Parallax MappingParallaxe• Scheinbare Änderung der Position eines Objektes beiveränderter Blickrichtung• Parallax Mapping trägt diesem Effekt Rechnung• Räumlicher Eindruck wird verstärktU N I V E R S I T Ä TKOBLENZ · LANDAU


Parallax Mapping• Berechnung pro Fragment• Texturkoordinate wirdverschoben• Abhängig von Blickrichtung• Einfache Erweiterung desBump MappingsU N I V E R S I T Ä TKOBLENZ · LANDAU


Parallax Mapping• Für jedes Fragment kennt man• Oberflächennormale N(Tangent Space)• Höhe h (Height Map,benutzerdefiniert skaliert)• Winkel zwischen Blickrichtung<strong>und</strong>N Daher: u tan hU N I V E R S I T Ä TKOBLENZ · LANDAU


Parallax Mapping - VorgehenApplikationsebene• Zwei Texturen• Normalmap• Heightmap• Tangente proVertexVertex Shader• Tangent Spaceberechnen• Blickrichtung inTangent Space• Lichtvektor in TangentSpaceFragment Shader• Mit u, v den Wert hauslesen• Δu, Δv berechnen• u' = u + Δu• v' = v + ΔvNormalmap <strong>und</strong> Heightmap können in einer Texturzusammengefasst werdenU N I V E R S I T Ä TKOBLENZ · LANDAU


Parallax Mapping - ZusammenfassungParallax Mapping als Erweiterung von Bump Mapping• Einbeziehung der Höheninformation• Bewegungsparallaxe• Pseudo-Selbstverdeckung• Stand der Technik in aktuellen 3D-EnginesFehlt nur noch Selbstverschattung <strong>und</strong> Selbstverdeckung...U N I V E R S I T Ä TKOBLENZ · LANDAU


U N I V E R S I T Ä TKOBLENZ · LANDAURelief Mapping


Relief Mapping• Erweiterung des Parallax Mappings• Selbstverdeckung• Selbstverschattung• Oliviera et al., 2000• Mittlerweile viele Varianten• Gr<strong>und</strong>legendes Prinzip: Short Distance RaytracingU N I V E R S I T Ä TKOBLENZ · LANDAU


Relief Mapping - Selbstverdeckung• Höhenwerte werden auf[0,1] normalisiert• Blickrichtung imTangent-Space• Für jedes Fragment:Schnittpunkt P s mit demHöhenprofil finden• Im Prinzip einRaytracing auf derTexturU N I V E R S I T Ä TKOBLENZ · LANDAU


Relief Mapping - SelbstverdeckungU N I V E R S I T Ä TKOBLENZ · LANDAU• Texturkoordinate desFragments:Bu , v• Texturkoordinate Au , vkann man berechnen• Projektion von v in T , Nbzw. B , NEbene• Trigonometrie (Höhe ist 1)• Der Schnittpunkt musszwischen Au , v <strong>und</strong> Bu , vliegen• Berechnung imTexturraumWie berechnet man denSchnittpunkt?


Relief Mapping -SchnittpunktberechnungU N I V E R S I T Ä TKOBLENZ · LANDAU• Binärsuchverfahren• Höhenwerte zwischen A<strong>und</strong> B werden interpoliert• Texturkoordinatenzwischen A <strong>und</strong> B werdeninterpoliert• Vergleich interpolierterHöhenwert mit Heightmap• Mit neuem Intervallweitermachen• 8 Schritte in der Regelausreichen• Viele Texturzugriffe...


Relief Mapping - Selbstverschattung• Lichtvektor muss miteinbezogen werden• Gleiches vorgehen wiebei Selbstverdeckung• Beim erstenSchnittpunkt kann manaufhörenU N I V E R S I T Ä TKOBLENZ · LANDAU


Relief Mapping - Zusammenfassung• Relief Mapping Verfahren sehen am besten aus• sind aber auch sehr teuer• Es gibt verschiedene Ansätze• Unterschiedliche Art des Schnitttestes• Lineare Suche• Kombination lineare / binäre suche• Sphere Tracing• ...• Steep Parallax Mapping, Parallax Occlusion Mapping etc.U N I V E R S I T Ä TKOBLENZ · LANDAU

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!