Prozedurale Texturen
-
Upload
johannes-diemke -
Category
Education
-
view
440 -
download
0
description
Transcript of Prozedurale Texturen
C A R LV O N
O S S I E T Z K Y
Prozedurale Texturen
Johannes Diemke
Ubung im Modul OpenGL mit JavaWintersemester 2012/2013
Ruckblick
Traditionelles Texture Mapping
Graphische Primitive werden mit Bildern versehen
Verlagerung von Details in Texturen
I Vereinfachung geometrischer ModelleI Darstellung komplizierter Oberflachen durch Photographien und
Bilder
Nachteile
Hoher Speicherbedarf
Kompliziertes Mapping
Photographien beinhalten bereits Beleuchtung
Johannes Diemke OpenGL mit Java WiSe 2012 / 2013 2/21
Ruckblick
Wieso ist das ein Problem?Inhalt von 3D Programmen setzt sich zusammen aus
I MeshesI AnimationenI Texturen
Texturen nehmen ublicherweise den großten Anteil am benotigtenSpeicherbedarf ein
Was kann man machen?
JPG Komprimierung (Faktor 10 bis 20, verlustbehaftet)
Prozedural generierte Texturen (sehr viel hoher, verlustfrei)
Johannes Diemke OpenGL mit Java WiSe 2012 / 2013 3/21
Prozedurale Techniken
AllgemeinVerwendung von deterministischen Algorithmen zur Generierung vonProgramminhalten
I ObjekteI EigenschaftenI BewegungenI Musik
Vorteile
I Zeit- und platzsparende Generierung komplexer InhalteI Flexibilitat durch parametrische KontrolleI Detail on Demand
Johannes Diemke OpenGL mit Java WiSe 2012 / 2013 4/21
Prozedurale Techniken
Beispiel: Pixar’s BraveProzedural generierte Baume, Busche, Blumen etc.
”math as a brush/an artistic tool“
(Quelle: http://youtu.be/EnaA9ZRPXiE)
Johannes Diemke OpenGL mit Java WiSe 2012 / 2013 5/21
Prozedurale Texturen
Was sind prozedurale Texturen?
Durch Algorithmen generierte Texturen
I Im PrimarspeicherI Direkt im Fragment-Shader
Textur = Algorithmus + Parameter
Komplexe Texturen durch Kombination und Modifikationbestehender Texturen
I Texturen werden in einfachere Operationen unterteilt (divide andconquer)
Johannes Diemke OpenGL mit Java WiSe 2012 / 2013 6/21
Prozedurale Texturen
Vorteile
Beliebige Auflosung (Detail on Demand)
Keine Komprimierungsartefakte (verlustfrei)
Geringer Speicherbedarf
Texturen konnen falls notwendig direkt”tileable“ erzeugt werden
Normal-Map Generierung
Johannes Diemke OpenGL mit Java WiSe 2012 / 2013 7/21
Prozedurale Texturen
Verbinden mehrerer einfacher Standardfunktionen ...
Johannes Diemke OpenGL mit Java WiSe 2012 / 2013 8/21
Prozedurale Texturen
... zu etwas Komplexerem
Johannes Diemke OpenGL mit Java WiSe 2012 / 2013 9/21
Prozedurale Texturen
Beispiel: Textur im Primarspeicher generieren
Speicher fur die Textur allozieren:
int[] texture = new int[256*256];
// Hier die Textur mit Daten fullen
IntBuffer intBuffer = IntBuffer.wrap(texture);
gl.glBindTexture(GL2.GL_TEXTURE_2D, textureId);
gl.glTexSubImage2D(GL2.GL_TEXTURE_2D, 0, 0, 0, 256, 256, GL2.GL_RGBA,
GL2.GL_UNSIGNED_BYTE, intBuffer);
Texel in die Textur schreiben:
public void setTexel(int x, int y, int r, int g, int b, int a) {
texture[x + (y << 8)] = ((a & 0x000000ff) << 24) |
((b & 0x000000ff) << 16) |
((g & 0x000000ff) << 8) |
((r & 0x000000ff));
}
Johannes Diemke OpenGL mit Java WiSe 2012 / 2013 10/21
Prozedurale Texturen
Beispiel: Textur im Primarspeicher generieren (Forts.)
Sinusplasma:
for(int y=0; y < 256; y++)
for(int x=0; x < 256; x++) {
int value = (int)((Math.sin(2*Math.PI/256*x*xPeriods) +
Math.sin(2*Math.PI/256*y*yPeriods) + 2) / 4 * 255);
setTexel(x, y, value, value, value, 255);
}
Johannes Diemke OpenGL mit Java WiSe 2012 / 2013 11/21
Prozedurale Texturen
Perlin NoiseWurde 1983 von Ken Perlin wahrend seiner Arbeit an TRONentwickelt
I Primarspeicher war zu klein fur TexturenI Objekte sahen zu
”sauber“ aus
I Idee: Modulation mit Rauschfunktion noise : Rn → R
(Quelle: http://www.noisemachine.com/talk1/)
Johannes Diemke OpenGL mit Java WiSe 2012 / 2013 12/21
Prozedurale Texturen
Beispiel: Perlin Noise in TRON LegacyIsosurface eines Perlin Noise Volumens unter Verwendung desMarching Cubes Algorithmus
(Quelle: http://jtnimoy.net/?q=178)
Johannes Diemke OpenGL mit Java WiSe 2012 / 2013 13/21
Prozedurale Texturen
Perlin Noise (Forts.)
Fraktionale Brownsche Bewegung:fBm(p) = noise(p) + 1
2noise(2p) + 14noise(4p) . . .
Turbulenz:turbulence(p) = |noise(p)| + 1
2 |noise(2p)| + 14 |noise(4p)| . . .
Marmor:marble(p) = sin(p.x + turbulence(p))
(Quelle: http://www.noisemachine.com/talk1/)Johannes Diemke OpenGL mit Java WiSe 2012 / 2013 14/21
Prozedurale Texturen
Beispiel: Solid Texturing im Fragment-Shadervec4 colorize(vec4 color1, vec4 color2, float value) {
return value * color2 + (1-value)* color1;
}
vec4 marble2(vec3 pos) {
float intensity = dot(normalize(gl_LightSource[0].position.xyz),
normalize(eyeSpaceNormal));
float fBm = abs(snoise(pos*2)) + abs(snoise(pos*4))*1/2 +
abs(snoise(pos*8))*1/4 + abs(snoise(pos*16))*1/8;
float marble = (1+sin(pos.x*10+fBm*3.2))/2;
return colorize(vec4(0.2,0.0,0.1,1.0), vec4(1.0,1.0,1.0,1), marble) *
(intensity*0.7 + 0.3);
}
void main() {
gl_FragColor = marble2(pos);
}
Johannes Diemke OpenGL mit Java WiSe 2012 / 2013 15/21
Prozedurale Texturen
Beispiel: Solid Texturing im Fragment-Shader (Forts.)
Johannes Diemke OpenGL mit Java WiSe 2012 / 2013 16/21
Prozedurale Texturen
XPTS
eXtensible Procedural Texturing System
Graphbasierter Editor zur Erzeugung prozeduraler Texturen imPrimarspeicher
Implementiert gangige Algorithmen
Erweiterbarkeit durch Plugins
Integrierte Plugin IDE
Speicherung von Texturen in XML-Dialekt oder Binarformat
Johannes Diemke OpenGL mit Java WiSe 2012 / 2013 17/21
Prozedurale Texturen
XPTS GUI
Johannes Diemke OpenGL mit Java WiSe 2012 / 2013 18/21
Prozedurale Texturen
XPTS Texturen
Johannes Diemke OpenGL mit Java WiSe 2012 / 2013 19/21
Prozedurale Texturen
XPTS Texturen (Forts.)
Johannes Diemke OpenGL mit Java WiSe 2012 / 2013 20/21
Literatur
� Dave ShreinerOpenGL Programming Guidehttp://www.opengl-redbook.com/
� Richard S. Wright, Benjamin Lipchak und Nicholas HaemelOpenGL SuperBibelhttp://www.starstonesoftware.com/OpenGL/
� Randi J. RostOpenGL Shading Languagehttp://www.3dshaders.com/
� Tomas Akenine-Moller, Eric Haines und Naty HoffmanReal-Time Renderinghttp://www.realtimerendering.com/
Johannes Diemke OpenGL mit Java WiSe 2012 / 2013 21/21