2

最近、テクスチャの読み込みコードを更新し、mipmap の読み込みなどの新しい機能も追加しました (最後のアプリケーションは 2D のみだったので、それらは必要ありませんでした)。しかし、ロードされた PVRTC テクスチャは、ミップマップを使用すると黒のままになり、ミップマップがなくてもすべてが期待どおりに機能し、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 ファイル用の修正されたリファレンス ローダーで行われます。各ミップマップのバイト長を確認したところ、最後のいくつかの配列のサイズは 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

1

編集:修正。

テクスチャの最小/倍率フィルターは次のようにする必要があると思います:

  • GL_LINEAR_MIPMAP_NEAREST最小フィルターの場合
  • GL_LINEARマグフィルター用

PVRTC でミップマップを使用する場合。次のヘッダー ファイルを参照してください: http://ne3d.googlecode.com/svn-history/r3/trunk/Lib/SRC/Tools/OGLES/PVRTTextureAPI.h

于 2013-01-29T11:12:58.463 に答える
0

glCompressedTexImage2D の「imageSize」がどのミップマップ レベルでも 32 より大きいことを確認してください。

于 2013-03-01T03:40:48.363 に答える