Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl es 带有mipmaps的PVRTC纹理保持黑色_Opengl Es_Textures_Pvrtc - Fatal编程技术网

Opengl es 带有mipmaps的PVRTC纹理保持黑色

Opengl es 带有mipmaps的PVRTC纹理保持黑色,opengl-es,textures,pvrtc,Opengl Es,Textures,Pvrtc,我最近更新了我的纹理加载代码,还添加了一些新功能,如mipmap加载(上一个应用程序只是二维的,所以我不需要它们)。但是当使用mipmap时,加载的PVRTC纹理保持黑色,没有mipmap时,一切正常,并且当使用rgba888纹理等纹理时,mipmap也正常工作 加载压缩数据: for (int i = 0; i < source.MipmapCount; i++) { data = source.GetData(i); GLTextures.CompressedTexIm

我最近更新了我的纹理加载代码,还添加了一些新功能,如mipmap加载(上一个应用程序只是二维的,所以我不需要它们)。但是当使用mipmap时,加载的PVRTC纹理保持黑色,没有mipmap时,一切正常,并且当使用rgba888纹理等纹理时,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");
    }
}
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);
纹理加载 加载是使用修改后的PVR文件参考加载程序完成的。我检查了每个mipmap的字节长度,最后几个数组的大小为32字节(PVRTC的最小大小)。是什么导致了这个问题

编辑 方法“GLTextures.CompressedEximage2D”

图像格式定义:

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

编辑:更正

我相信您的纹理最小/最大过滤器必须:

  • GL\u-LINEAR\u-MIPMAP\u最接近的
    最小过滤器
  • 用于mag过滤器的GLU线性

将mipmap与PVRTC一起使用时。请参阅位于以下位置的头文件:

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

我刚刚在使用cocos2d-x时遇到类似问题。 经过大量调试,我终于找到了答案:确保您提供了一个完整的mipmap链(下至1x1),或者将Apple的GL\u TEXTURE\u MAX\u LEVEL\u Apple纹理参数设置为正确的mipmap数量。 不幸的是,苹果自己的TextureTool输出只有8x8(本来应该是下限,但现在不是了)。即使是来自Apple的PVRTextureLoader示例代码也不是现成的。

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

  • 使用过滤器GL_线性
  • 使用texture2DLod(EXT)获取纹理颜色,lod值由您自己计算

您确定
source.GetData(i)
返回正确的数据吗?您不仅应该检查输入的长度,还应该检查值。如果要从.PVR文件中提取纹理,请确保读取的数据正确-IIRC,有两种类型的标题。此外,还不清楚
GLTextures.compressedEximage2D()
方法的内部内容。我建议您尝试在Imagination technologies(即PowerVR)开发论坛()上提问。我很想直接提供帮助,但我的OpenGL ES太生疏了。@keaukraine是的,应该这样做,加载程序现在只支持较新的文件头,并且在使用旧文件头时引发异常。反正我的制图员也不用。我可以发布加载PVR的代码,但是代码太多了
GLTextures.compressedEximage2D()
只是本机方法的包装。我将把它添加到问题中。如果你认为你需要PVR代码,我会发布它。可能是你弄乱了PVRTC格式,有4个:2或4位,带或不带alpha。你用什么混合液吗?如果alpha通道混乱,可能会导致黑色。如果您使用OpenGL ES 2.0,您可以尝试更改片段着色器,以查看是否所有RGB(A,如果需要)通道都正常。@keaukraine是的,我知道,我在上面添加了格式定义,其中显示了我使用的常量(打包在枚举中以简化操作9。此外,仅使用一个mipmap图像时它也可以工作(不要加载其他图像).你是对的,在我加载ETC1 mip贴图纹理的代码中,我使用了相同的min/mag过滤器。这似乎是正确的设置。只是在模拟器上检查了它,它并没有解决问题,使用mipmaps时它们仍然是黑色的(再次检查了mipmaps,发现所有级别都有数据).但这并不意味着这不是问题的一部分。我稍后会在iPad上测试它,可能也有模拟器问题。更大或更大或相等?因为正如我所说的,所有mipmap的最小大小都是32字节。抱歉,我看不到。似乎是同一个问题。祝你好运。这是一些pvrt规则*高度和宽度必须为least 8.*高度和宽度必须是2的幂。*必须是正方形(高度==宽度)。(此帖子似乎没有为问题提供答案。请编辑您的答案,或将其作为问题的注释发布)@sɐunıɔןɐqɐp我同意,它也得到了回答。此外,texture2DLod用于获取单个LOD级别,这是您通常不希望手动执行的操作。