0

私は、(ユニバーサル Windows) c++/cx Directx プロジェクトに取り組んでいます。このプロジェクトは、ac# UWP プロジェクトで使用される dll にビルドされます。

DirectX Toolkit を使用してテクスチャをロードしています。

ファイルからテクスチャを作成するために既に使用していますが、UWP プロジェクトから送信されたバイト配列からテクスチャを作成する必要があります。ただし、CreateWICTextureFromMemory() を使用しようとすると、HRESULT は0x88982F50:"コンポーネントが見つかりません" と表示されます。

この問題について私が見つけることができるのは、バイトが正しい画像ではないことを示していますが、UWP プロジェクトでテストしたところ、bingmaps (静的マップ画像) からバイト配列を取得し、これらから作業画像を作成できました。バイト。

誰が私が間違っているのか知っていますか?

UWP c# ダウンロード コード (バイトを取得するため):

private async Task DownloadTexture()
    {
        byte[] buffer = null;
        try
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(_url);
            WebResponse response = await request.GetResponseAsync();
            using (Stream stream = response.GetResponseStream())
            using (MemoryStream ms = new MemoryStream())
            {
                stream.CopyTo(ms);
                buffer = ms.ToArray();
            }
        }
        catch (Exception exception)
        {
            Logger.Error($"Could not Download Texture: {exception}");
        }

        _track3D.SetImage(out buffer[0], (ulong)buffer.Length);
    }

Directx C++ コード (失敗):

void Track3D::SetImage(uint8_t* ddsData, size_t ddsDataSize)
{
    HRESULT result = CreateWICTextureFromMemory(_d3dDevice.Get(), _d3dContext.Get(), ddsData, ddsDataSize, nullptr, _Terrain.ReleaseAndGetAddressOf());
    //here it goes wrong
    //TODO: use the texture
}

動作する UWP C# テスト コード (画像を表示):

private async void setImage(byte[] buffer) //test
    {
        try
        {
            BitmapImage bmpImage = new BitmapImage();
            using (InMemoryRandomAccessStream stream = new InMemoryRandomAccessStream())
            {
                await stream.WriteAsync(buffer.AsBuffer());
                stream.Seek(0);
                await bmpImage.SetSourceAsync(stream);
            }

            Image image = new Image();
            image.Source = bmpImage;

            ((Grid)Content).Children.Add(image);
        }
        catch (Exception exception)
        {
            Logger.Error($"{exception}");
        }
    }

編集:

OK、バッファーの最初のバイトが、UWP から送信されたときとは異なり、C++ コードで異なることがわかりました。(テストとして) C++ コードで最初のバイトを正しい値に変更すると、テクスチャが正しく作成されます。

なぜ最初のバイトの値が変わったのでしょうか? (または、私は何を間違えましたか?)

要求どおり、関数 setImage() は c# では次のようになります。

[MethodImpl]
public void __ITrack3DPublicNonVirtuals.SetImage(out byte ddsData, [In] ulong ddsDataSize);

(また、パラメーター名の名前にまだ「dds」が含まれていることに気付きました。申し訳ありませんが、誤解を招くため、コードで変更します)

4

1 に答える 1

1

0x88982F50: 「コンポーネントが見つかりません」</p>

これはWINCODEC_ERR_COMPONENTNOTFOUND、ファイル/バイナリに使用するコーデックの形式を WIC が判断できない場合に発生します。問題は、マネージド コードからネイティブ コードへのデータの転送が間違っていることです。

相互運用方法は次のように設定されています。

[MethodImpl]
public void __ITrack3DPublicNonVirtuals.SetImage(out byte ddsData, [In] ulong ddsDataSize);

C++ メソッドのシグネチャは次のとおりです。

void Track3D::SetImage(uint8_t* ddsData, size_t ddsDataSize)

out最初のパラメーターが最初の要素の長さを持つ安全な配列として渡されているためです。

代わりに、次を使用する必要があります。

SetImage([In] byte ddsData, [In] ulong ddsDataSize); // C#

void Track3D::SetImage(const uint8_t* ddsData, size_t ddsDataSize); // C++.
于 2016-12-09T17:25:18.490 に答える