首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有mipmap的PVRTC纹理保持黑色

带有mipmap的PVRTC纹理保持黑色
EN

Stack Overflow用户
提问于 2013-01-23 19:42:15
回答 4查看 2.2K关注 0票数 2

我最近更新了我的纹理加载代码,还添加了一些新功能,比如mipmap加载(上一个应用程序只是2D的,所以我不需要它们)。但是当使用mipmap时,加载的PVRTC纹理仍然是黑色的,没有mipmap所有的工作原理都与预期的一样,而且mipmap在使用像RGBA8888纹理这样的纹理时也是有效的。

加载压缩数据:

代码语言:javascript
复制
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);
}

过滤的设置:

代码语言:javascript
复制
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“。

代码语言:javascript
复制
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);
}

图像格式定义:

代码语言:javascript
复制
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);
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-01-29 11:12:58

编辑:更正。

我相信你的纹理最小/mag过滤器必须是:

  • 用于最小滤波器的GL_LINEAR_MIPMAP_NEAREST
  • 用于mag滤波器的GL_LINEAR

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

票数 1
EN

Stack Overflow用户

发布于 2015-12-14 16:43:44

我刚刚遇到了一个类似的问题,使用cocos2d-x。经过大量调试,我终于找到了答案:确保您正在提供一个完整的mipmap链GL_TEXTURE_MAX_LEVEL_APPLE (降至1x1),或者将苹果的GL_TEXTURE_MAX_LEVEL_APPLE纹理参数设置为正确的mipmap数量。不幸的是,苹果自己的TextureTool产量仅降至8x8 (with本应是下限,但现在不是了)。即使是苹果公司的PVRTextureLoader示例代码也无法开箱即用。

票数 2
EN

Stack Overflow用户

发布于 2013-03-01 03:40:48

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14488005

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档