Bücher online kostenlos Kostenlos Online Lesen
Erfolgreiche Spieleentwicklung

Erfolgreiche Spieleentwicklung

Titel: Erfolgreiche Spieleentwicklung
Autoren: Alexander Rudolph
Vom Netzwerk:
Uniform-Buffer-Objekte ins Spiel. Sieht man einmal von den Texturen ab, dann dienten vor Einführung der Uniform Buffer lediglich uniform -Variablen zum Speichern der an einen Shader übergebenen Parameter. In der Praxis ist die Verwendung dieser Variablen an einigen Stellen jedoch recht ineffizient:
Verwenden mehrere Shader die gleichen Parameter, müssten die gleichen Parameter mehrfach an die GPU geschickt werden.
Die Anzahl der uniform -Variablen, die von einem Shader verarbeitet werden können, ist je nach Grafikkartenmodell mehr oder weniger stark limitiert.
Ein Update der in den uniform -Variablen gespeicherten Daten ist relativ zeitaufwändig (die geänderten Parameter müssen zur GPU geschickt werden).
    Abhilfe schaffen die Uniform-Buffer-Objekte nun wie folgt:
Die in einem Uniform Buffer gespeicherten Daten können in mehreren Shader-Programmen verwendet werden.
In einem Uniform Buffer lassen sich sehr viel mehr Daten speichern als in uniform -Variablen.
Ein Wechsel zwischen zwei Uniform-Buffer-Objekten (der neu zu bindende Buffer beinhaltet die aktualisierten uniform -Parameter) ist weitaus weniger zeitaufwändig als ein Update der in den uniform -Variablen gespeicherten Daten.
    Für die praktische Arbeit mit Uniform-Buffer-Objekten verwenden wir in unseren [1] OpenGL-Tutorials die CUniformBufferObject -Klasse.
    Im Detail erklärt
OpenGL-Uniform-Buffer-Objekte: http://www.spieleprogrammierung.net/2010/09/opengl-uniform-buffer-objekte.html

2.5 Geometry Instancing
    Mit zunehmender Komplexität einer 3-D-Welt steigt die Anzahl der notwendigen Render-Aufrufe (Draw Calls, z. B. glDrawElements() ) für die Darstellung der einzelnen 3-D-Objekte stetig an. Wird die Anzahl dieser Draw Calls zu groß, kommt es schließlich zum Performance-Einbruch. Bedenken Sie, jeder Render-Aufruf muss zunächst von der CPU verarbeitet und dann an die GPU gesendet werden – ein nicht zu unterschätzender Zeitaufwand. Das Ziel bei der Entwicklung einer performanten 3-D-Anwendung muss daher sein, die Anzahl der notwendigen Render-Aufrufe auf ein Minimum zu reduzieren. An dieser Stelle kommt das sogenannte Geometry Instancing ins Spiel, denn es ermöglicht die Darstellung mehrerer Instanzen eines 3-D-Modells mit einem einzigen Draw Call. Listing 2.6 zeigt, wie sich Geometry Instancing mithilfe von Uniform-Buffer-Objekten realisieren lässt. Dank Instancing ließen sich in Computerspielen zum ersten Mal weiträumige Vegetationsgebiete (Graslandschaften und tropische Dschungelareale) realistisch in Szene setzen. Selbstverständlich lassen sich auch dynamische Objekte (Menschen, die eine Stadt bevölkern, Tierherden, etc.) oder interaktive Partikelsysteme mit vorher nie gekannter Performance darstellen.
    // Der nachfolgende Uniform-Block ermöglicht den Zugriff
// auf die im Uniform-Buffer gespeicherten Welt-
// Transformationsmatrizen von bis zu 256 Instanzen:
layout(shared) uniform instanceData
{
vec4 matWorldArrayColumn[1024];
// maximal 256 (Instanzen) * 4 Matrixspalten
};

// Für die Transformation in den Bildraum kann für alle
// Instanzen dieselbe Matrix verwendet werden:
uniform mat4 matViewProjection;

void main()
{
// gl_InstanceID: Index der zu rendernden Instanz
int Index = 4*gl_InstanceID;

mat4 matWorld = mat4(matWorldArrayColumn[Index],
matWorldArrayColumn[Index+1],
matWorldArrayColumn[Index+2],
matWorldArrayColumn[Index+3]);

// Skalierungsfaktor auslesen und aus der
// Transformationsmatrix löschen:
float Scale = matWorld[0][3];
matWorld[0][3] = 0.0;

vec4 ScaledVertex = vec4(Scale*gs_Vertex.x,
Scale*gs_Vertex.y, Scale*gs_Vertex.z, gs_Vertex.w);

gl_Position = matViewProjection*matWorld*ScaledVertex;

gs_TexCoord[0] = gs_MultiTexCoord0;
}
    Listing 2.6: Geometry Instancing (Vertex Shader)
    Im Detail erklärt
Geometry Instancing Teil 1: http://www.spieleprogrammierung.net/2010/09/geometry-instancing-teil-1.html
Geometry Instancing Teil 2 - Verwendung von Uniform-Buffer-Objekten: http://www.spieleprogrammierung.net/2010/09/geometry-instancing-teil-2-verwendung.html
    Links & Literatur
OpenGL-Spieleentwicklung: http://www.spieleprogrammierung.net
OpenGL-Spezifikation (engl.): http://www.khronos.org/opengl/
OpenGL-Homepage (engl.): http://www.opengl.org
Beleuchtungsmodell nach Blinn-Phong: http://bit.ly/kc0Byh
GLEW (OpenGL Extension Wrangler Library): http://glew.sourceforge.net
GLUT (OpenGL Utility Toolkit): http://bit.ly/3AbN7C
SDL (Simple DirectMedia Layer): http://www.libsdl.org
SDL Image – zum Laden von
Vom Netzwerk:

Weitere Kostenlose Bücher