bool initTextureArray()
{
	GLint MaxTextureArrayLayers(0);
	glGetIntegerv(GL_MAX_ARRAY_TEXTURE_LAYERS, &MaxTextureArrayLayers);

	glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

	glGenTextures(1, &Texture2DArrayName);

	glActiveTexture(GL_TEXTURE0);
	glBindTexture(GL_TEXTURE_2D_ARRAY, Texture2DArrayName);

	// Set image
	gli::texture2DArray Texture(gli::loadStorageDDS(glf::DATA_DIRECTORY + TEXTURE_DIFFUSE));

	glTexStorage3D(
		GL_TEXTURE_2D_ARRAY,
		GLsizei(Texture.levels()),
		gli::internal_format(Texture.format()), 
		GLsizei(Texture.dimensions().x), 
		GLsizei(Texture.dimensions().y), 
		GLsizei(Texture.layers())); //depth

	for(gli::texture2DArray::size_type Array = 0; Array < Texture.layers(); ++Array)
	for(gli::texture2DArray::size_type Level = 0; Level < Texture.levels(); ++Level)
	{
		glTexSubImage3D(
			GL_TEXTURE_2D_ARRAY, 
			GLint(Level), 
			0, // offset x 
			0, // offset y 
			GLint(Array), // offset z
			GLsizei(Texture[Array][Level].dimensions().x), 
			GLsizei(Texture[Array][Level].dimensions().y), 
			GLsizei(1), //depth
			gli::external_format(Texture.format()), 
			gli::type_format(Texture.format()), 
			Texture[Array][Level].data());
	}

	glPixelStorei(GL_UNPACK_ALIGNMENT, 4);

	return glf::checkError("initTextureArray");
}
	bool initTexture()
	{
		GLint MaxTextureArrayLayers(0);
		glGetIntegerv(GL_MAX_ARRAY_TEXTURE_LAYERS, &MaxTextureArrayLayers);

		glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

		glGenTextures(1, &TextureName);

		glActiveTexture(GL_TEXTURE0);
		glBindTexture(GL_TEXTURE_2D_ARRAY, TextureName);

		gli::texture2DArray Texture(gli::FORMAT_RGBA8_UNORM_PACK8, gli::texture2DArray::texelcoord_type(4), 15, 1);
		for(gli::size_t LayerIndex = 0, LayerCount = Texture.layers(); LayerIndex < LayerCount; ++LayerIndex)
		{
			float const Progress = static_cast<float>(LayerIndex) / static_cast<float>(LayerCount);
			glm::u8vec4 const Color(glm::vec4(Progress, 0.5f + Progress * 0.5f, 1.f - Progress, 1.f) * 255.f);
			Texture[LayerIndex].clear<glm::u8vec4>(Color);
		}

		gli::gl GL;
		gli::gl::format const Format = GL.translate(Texture.format());

		glTexStorage3D(GL_TEXTURE_2D_ARRAY, GLsizei(Texture.levels()),
			Format.Internal,
			GLsizei(Texture.dimensions().x), GLsizei(Texture.dimensions().y), GLsizei(Texture.layers()));

		for(gli::texture2DArray::size_type Array = 0; Array < Texture.layers(); ++Array)
		for(gli::texture2DArray::size_type Level = 0; Level < Texture.levels(); ++Level)
		{
			glTexSubImage3D(GL_TEXTURE_2D_ARRAY, GLint(Level),
				0, 0, GLint(Array),
				GLsizei(Texture[Array][Level].dimensions().x), GLsizei(Texture[Array][Level].dimensions().y), GLsizei(1),
				Format.External, Format.Type,
				Texture[Array][Level].data());
		}

		glPixelStorei(GL_UNPACK_ALIGNMENT, 4);

		return true;
	}