Tutorial 16 – Texture Arrays + Geometry Instancing

Tutorial 16 demonstriert den Einsatz von Texture Arrays im Rahmen des Geometry Instancings. Insgesamt werden 4 Texture Arrays benötigt – zum Speichern der Surface-Texturen, der Normal, der Specular sowie der Light Maps.









Texture Arrays an einen Fragment Shader übergeben:

pShader->Set_TextureArray(GL_TEXTURE0, 0,
                          pTextureAndMeshDesc->pSurfaceTextureArray,
                          "SurfaceTextureArray");
pShader->Set_TextureArray(GL_TEXTURE1, 1,
                          pTextureAndMeshDesc->pNormalTextureArray,
                          "NormalTextureArray");
pShader->Set_TextureArray(GL_TEXTURE2, 2,
                          pTextureAndMeshDesc->pSpecularTextureArray,
                          "SpecularTextureArray");
pShader->Set_TextureArray(GL_TEXTURE3, 3,
                          pTextureAndMeshDesc->pLightTextureArray,
                          "LightTextureArray");


Zugriff auf die Texture Arrays im Fragment Shader:

uniform sampler2DArray SurfaceTextureArray;
uniform sampler2DArray NormalTextureArray;
uniform sampler2DArray SpecularTextureArray;
uniform sampler2DArray LightTextureArray;

[...]

// Hinweise:
// gs_TexCoord[0].p:  Index der zu verwendenden Textur
// gs_TexCoord[0].st: die normalen Texturkoordinaten

vec4 SurfaceColor  = texture(SurfaceTextureArray, gs_TexCoord[0].stp);

if(SurfaceColor.a < 0.01)
    discard;

vec4 NormalColor   = texture(NormalTextureArray, gs_TexCoord[0].stp);
vec4 SpecularColor = texture(SpecularTextureArray, gs_TexCoord[0].stp);
vec4 LightColor    = texture(LightTextureArray, gs_TexCoord[0].stp);


Texturdaten laden und zu den benötigten Texture Arrays zusammenfassen:

Beim Erzeugen eines Textur-Arrays ist darauf zu achten, dass die verwendeten Bilddateien (Texturdaten) die gleiche Größe besitzen.

// Verhindern, dass einzelne Texturen erzeugt und in den
// Grafikspeicher geladen werden:
Enable_TextureArrayGeneration();

// Texturen und Mesh-Daten laden, die im Rahmen des Geometry Instancings
// benötigt werden:
InstancedObjectTextureAndMeshDesc = new CInstancedObjectTextureAndMeshDesc;
InstancedObjectTextureAndMeshDesc->Init_Data("../Models/Rocks", 5);

InstancedObjectTextureAndMeshDesc->Build_TextureArrays();

Disable_TextureArrayGeneration();



Hinweise zum Erstellen eines neuen Projekts:

  • Kopieren Sie den Ordner GraphicsAndPhysicsFrameworkImports ins Projektverzeichnis
  • Kopieren sie alle dll-Dateien sowie die Konfigurationsdatei ResolutionAndRendering.txt aus besagtem Ordner ins gleiche Verzeichnis, in dem sich auch die exe-Datei befindet (in unseren Programmbeispielen ist dies das Bin-Verzeichnis)
  • Binden Sie die folgenden Dateien in Ihr Projekt ein: GraphicsAndPhysics_Framework_Imports.h, GraphicsAndPhysics_Framework_Imports.lib, glew32.lib, glew32s.lib, glut32.lib. Die Glew- und Glut-Bibliotheken ermöglichen die Nutzung der aktuellen OpenGL-Spezifikationen unabhängig vom Framework.

GraphicsAndPhysicsFrameworkDemo16.zip