私は、(ユニバーサル 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」が含まれていることに気付きました。申し訳ありませんが、誤解を招くため、コードで変更します)