仕事
私自身の OpenGL フレームワークでは、プラットフォームがサポートしていないときに PVRTC テクスチャを解凍しようとしています。このために、PVRTC-SDKをダウンロードし、C++ コードを 1:1 でアンマネージ コードを含む C# コードに変換しました。
問題
簡単に言うと、機能していません。理由がわかりません。コードを 2 回確認しましたが、問題ないようで、動作するはずです。ときどき私のAccessViolationException
、ときどきLoaderLock
。AccessViolationException
コードの別の部分でエラーが発生しました。PVRTC の色はまだ間違っています。奇妙に見えます。基本的なストロークは表示されますが、色が間違っています。
コード
コードが巨大であるという理由で、私はそれをアップロードしました:
[C#] http://codeviewer.org/view/code:2a65
[C++] http://codeviewer.org/view/code:2a66
C# メソッドの呼び出しコードでも、サイズは実際には期待値と一致します (したがって、ソース配列の画像値は正確width * height * 4bit
であり、出力サイズはwidth * height * 4byte
(圧縮画像の 8 倍のサイズ) です)。
private static unsafe Image ConvertPVRTC_RGBA8888(Image source)
{
Int32 mipmapCount = source.HasMipmaps ? Image.GetMipmapCount(source.Width, source.Height) : 1;
// Create a array with bytes for the target format
Byte[] bytes = new Byte[RGBA8.GetMipMappedSize(0, mipmapCount, source.Width, source.Height)];
fixed (Byte* pTarget = bytes)
{
fixed (Byte* pSource = source.GetData())
{
Int32 sourceOffset = 0;
Int32 targetOffset = 0;
for (Int32 i = 0; i < mipmapCount; i++)
{
// Calculate offsets
Int32 sourceSize = source.Format.GetMipMappedSize(i, 1, source.Width, source.Height);
Int32 targetSize = RGBA8.GetMipMappedSize(i, 1, source.Width, source.Height);
// Decompress mipmapLevel
PVRTC.DecompressPVRTC(pSource + sourceOffset, pTarget + targetOffset, GetMipmapSize(source.Width, i), GetMipmapSize(source.Height, i), source.Format.BitsPerPixel == 2);
// Calculate pointer offset
sourceOffset += sourceSize;
targetOffset += targetSize;
}
}
}
return new Image(bytes, ImageFormat.RGBA8, source.Width, source.Height, source.HasMipmaps, source.IsCubemap);
}
考え
元のソースコードが正しくないか、コードを翻訳したときに何かが抜けていました。とにかく解決策が必要で、ソースコードを2回チェックしました。
(C#のソースコードがあればそれを使用しますが、見つかりません)