Текстура PVRTC с мипмапами остается черной
Недавно я обновил свой код загрузки для текстур, а также добавил некоторые новые функции, такие как загрузка mipmap (последнее приложение было только 2D, поэтому они мне не нужны). Но загруженные текстуры PVRTC остаются черными при использовании mipmaps, без mipmaps все работает, как ожидалось, а также mipmaps работают при использовании текстур, таких как текстуры RGBA8888.
Загрузка сжатых данных:
for (int i = 0; i < source.MipmapCount; i++)
{
data = source.GetData(i);
GLTextures.CompressedTexImage2D(TextureType.TEXTURE_2D, i, Format.CompressedFormat.Value, Width >> i, Height >> i, data.Length, data);
Debug.WriteGLError("Texture2D->CompressedTexImage2D", "MipmapLevel={0}", i);
}
Настройка фильтрации:
if (source.MipmapCount == 0)
{
switch (filterQuality)
{
case FilterQuality.Nearest:
GLTextures.TexParameteri(TextureType.TEXTURE_2D, TexParameter.TEXTURE_MIN_FILTER, (Int32)TextureMinFilterParams.NEAREST);
GLTextures.TexParameteri(TextureType.TEXTURE_2D, TexParameter.TEXTURE_MAG_FILTER, (Int32)TextureMagFilterParams.NEAREST);
break;
case FilterQuality.Linear:
GLTextures.TexParameteri(TextureType.TEXTURE_2D, TexParameter.TEXTURE_MIN_FILTER, (Int32)TextureMinFilterParams.LINEAR);
GLTextures.TexParameteri(TextureType.TEXTURE_2D, TexParameter.TEXTURE_MAG_FILTER, (Int32)TextureMagFilterParams.LINEAR);
break;
}
Debug.WriteGLError("Texture2D->TexParameteri without mipmaps");
}
else
{
switch (filterQuality)
{
case FilterQuality.Nearest:
GLTextures.TexParameteri(TextureType.TEXTURE_2D, TexParameter.TEXTURE_MIN_FILTER, (Int32)TextureMinFilterParams.NEAREST_MIPMAP_LINEAR);
GLTextures.TexParameteri(TextureType.TEXTURE_2D, TexParameter.TEXTURE_MAG_FILTER, (Int32)TextureMagFilterParams.NEAREST);
break;
case FilterQuality.Linear:
GLTextures.TexParameteri(TextureType.TEXTURE_2D, TexParameter.TEXTURE_MIN_FILTER, (Int32)TextureMinFilterParams.LINEAR_MIPMAP_LINEAR);
GLTextures.TexParameteri(TextureType.TEXTURE_2D, TexParameter.TEXTURE_MAG_FILTER, (Int32)TextureMagFilterParams.LINEAR);
break;
}
Debug.WriteGLError("Texture2D->TexParameteri with mipmaps");
if (anisotropicQuality > 1f && GL.IsExtensionSupported(Extension.GL_EXT_texture_filter_anisotropic))
{
// GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT
GLTextures.TexParameter(TextureType.TEXTURE_2D, 0x84FF, Mathf.Clamp(anisotropicQuality, 1f, GL.GetFloat(GetFloatName.TEXTURE_MAX_ANISOTROPY)));
Debug.WriteGLError("Texture2D->Anisotropy");
}
}
Загрузка текстуры Загрузка осуществляется с помощью модифицированного загрузчика ссылок для файлов PVR. Я проверил длину байтов каждого mip-карты, и последние несколько массивов имеют размер 32 байта (минимальный размер PVRTC). Что может вызвать проблему?
редактировать
Метод "GLTextures.CompressedTexImage2D".
public static void CompressedTexImage2D(TextureType target, Int32 level, CompressedFormats internalFormat, Int32 width, Int32 height, Int32 imageSize, Byte[] pixels)
{
/* Used for mobile apps for debugging purposes */
Debug.CheckMethodLoaded(glCompressedTexImage2D);
Profiler.IncreaseCallCount("glCompressedTexImage2D");
glCompressedTexImage2D(target, level, internalFormat, width, height, 0, imageSize, pixels);
}
Определение форматов изображения:
PVRTC2RGB = new ImageFormat("PVRTC2RGB", CompressedFormats.COMPRESSED_RGB_PVRTC_2BPPV1_IMG, 16, 8, bitsPerPixel: 2, requiredExtension:Extension.GL_IMG_texture_compression_pvrtc);
PVRTC2RGBA = new ImageFormat("PVRTC2RGBA", CompressedFormats.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG, 16, 8, bitsPerPixel: 2, requiredExtension: Extension.GL_IMG_texture_compression_pvrtc);
PVRTC4RGB = new ImageFormat("PVRTC4RGB", CompressedFormats.COMPRESSED_RGB_PVRTC_4BPPV1_IMG, 8, 8, bitsPerPixel: 4, requiredExtension: Extension.GL_IMG_texture_compression_pvrtc);
PVRTC4RGBA = new ImageFormat("PVRTC4RGBA", CompressedFormats.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG, 8, 8, bitsPerPixel: 4, requiredExtension: Extension.GL_IMG_texture_compression_pvrtc);
4 ответа
редактировать: исправление.
Я считаю, что ваша текстура мин / маг фильтры должны быть:
GL_LINEAR_MIPMAP_NEAREST
для мин фильтраGL_LINEAR
для магниевого фильтра
при использовании мипмапов с PVRTC. См. Файл заголовка по адресу: http://ne3d.googlecode.com/svn-history/r3/trunk/Lib/SRC/Tools/OGLES/PVRTTextureAPI.h
Я только сталкивался с подобной проблемой, используя cocos2d-x. После долгих отладок я наконец понял: убедитесь, что вы предоставляете полную цепочку mipmap (вплоть до 1x1) или установите для параметра текстуры Apple GL_TEXTURE_MAX_LEVEL_APPLE правильное количество mipmaps. К сожалению, собственный вывод TextureTool от Apple снизился только до 8x8 (предполагалось, что это будет нижний предел, но это уже не так). Даже пример кода PVRTextureLoader от Apple не работает "из коробки".
Убедитесь, что ваш "imageSize" в glCompressedTexImage2D больше 32 на любом уровне mipmap.
Чтобы добиться "эффекта" mipmap для текстуры PVRTC, вы должны использовать:
- использовать фильтр GL_LINEAR.
- Извлеките цвет текстуры, используя texture2DLod(EXT), значение lod рассчитывается самостоятельно.