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");
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);
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();
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