2

我最近更新了纹理的加载代码,还添加了一些新功能,如 mipmap 加载(最后一个应用程序只有 2D,所以我不需要它们)。但是加载的 PVRTC 纹理在使用 mipmap 时保持黑色,没有 mipmap 一切都按预期工作,并且在使用像 RGBA8888 纹理这样的纹理时,mipmap 也可以工作。

加载压缩数据:

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 文件参考加载器完成的。我检查了每个 mipmap 的字节长度,最后几个数组的大小为 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

4 回答 4

2

我刚刚使用 cocos2d-x 遇到了类似的问题。经过大量调试后,我终于弄明白了:确保提供完整的 mipmap 链(低至 1x1)或将 Apple 的GL_TEXTURE_MAX_LEVEL_APPLE纹理参数设置为正确数量的 mipmap。不幸的是,Apple 自己的 TextureTool 输出只有 8x8(应该是下限,但现在不是了)。甚至来自 Apple 的 PVRTextureLoader 示例代码也不能开箱即用。

于 2015-12-14T16:43:44.907 回答
1

编辑:更正。

我相信您的纹理 min/mag 过滤器必须是:

  • GL_LINEAR_MIPMAP_NEAREST对于最小过滤器
  • GL_LINEAR用于磁力过滤器

将 mipmap 与 PVRTC 一起使用时。查看头文件: http: //ne3d.googlecode.com/svn-history/r3/trunk/Lib/SRC/Tools/OGLES/PVRTTextureAPI.h

于 2013-01-29T11:12:58.463 回答
0

确保 glCompressedTexImage2D 中的“imageSize”在任何 mipmap 级别都大于 32。

于 2013-03-01T03:40:48.363 回答
0

要在 PVRTC 纹理上实现 mipmap“效果”,您应该使用:

  • 使用过滤器 GL_LINEAR。
  • 使用你自己计算的 lod 值使用 texture2DLod(EXT) 获取纹理颜色。
于 2018-08-05T15:16:46.070 回答