2014-07-13 4 views
0

저는 DirectX 및 SharpDX (ver.2.6.2 사용)를 연구 중입니다.SharpDX 코드의 Texture2D.FromMemory() 예외

이제 Texture2D.FromMemory() 메서드를 사용하여 바이트 배열에서 텍스처를 만들려고합니다. 샘플 코드는 다음과 같습니다.

using System; 
using System.Diagnostics; 
using System.Collections.Generic; 
using System.Linq; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

using SharpDX; 
using SharpDX.D3DCompiler; 
using SharpDX.Direct3D; 
using SharpDX.Direct3D11; 
using SharpDX.DXGI; 
using SharpDX.Windows; 
using Buffer = SharpDX.Direct3D11.Buffer; 
using Device = SharpDX.Direct3D11.Device; 
using MapFlags = SharpDX.Direct3D11.MapFlags; 

namespace HLSLTest 
{ 
    static class Program 
    { 
     [STAThread] 
     static void Main() 
     { 
      Form1 form = new Form1(); 
      form.Text = "D3DRendering - Test"; 
      form.Width = 640; 
      form.Height = 480; 

      Device device; 
      SwapChain swapChain; 

      var desc = new SwapChainDescription() 
      { 
       BufferCount = 1, 
       ModeDescription = new ModeDescription(form.ClientSize.Width, form.ClientSize.Height, new Rational(60, 1), Format.R8G8B8A8_UNorm), 
       IsWindowed = true, 
       OutputHandle = form.Handle, 
       SampleDescription = new SampleDescription(1, 0), 
       SwapEffect = SwapEffect.Discard, 
       Usage = Usage.RenderTargetOutput 
      }; 

      Device.CreateWithSwapChain(
       SharpDX.Direct3D.DriverType.Hardware, 
       DeviceCreationFlags.None, 
       new[] { 
        SharpDX.Direct3D.FeatureLevel.Level_11_0, 
        SharpDX.Direct3D.FeatureLevel.Level_10_1, 
        SharpDX.Direct3D.FeatureLevel.Level_10_0, 
       }, 
       desc, 
       out device, 
       out swapChain 
      ); 

      // It's Ok, no error 
      //var texture = Texture2D.FromFile<Texture2D>(device, "GeneticaMortarlessBlocks.jpg"); 

      // "An unhandled exception of type 'SharpDX.SharpDXException' occurred in SharpDX.dll" 
      // "Additional information: HRESULT: [0x80004005], Module: [General], ApiCode: [E_FAIL/Unspecified error]" 
      byte[] texArray = new byte[8]; 
      var texture = Texture2D.FromMemory(device, texArray); 

      var textureView = new ShaderResourceView(device, texture); 
     } 
    } 
} 

그러나 내 코드는 다음 예외를 발생시킵니다.

An unhandled exception of type 'SharpDX.SharpDXException' occurred in SharpDX.dll 
Additional information: HRESULT: [0x80004005], Module: [General], ApiCode:[E_FAIL/Unspecified error], Message: エラーを特定できません 

웹에서 동일한 문제 또는 해결책을 검색하지만 찾을 수 없습니다.

제게 조언 해주세요. 당신은이 같은 메모리 블록에서 텍스처를 만들 수 없습니다

답변

1

감사합니다. 방법 Texture2D.FromMemoryTexture2D.FromFile으로 지원되는 동일한 종류의 텍스처를 기대하고 있습니다. 유일한 차이점은 디스크에서 읽는 대신 메모리에서 읽을 수 있다는 점입니다.

원시 메모리 블록에서 텍스처를 생성하려면 DataRectangle 구조를 통해 텍스처의 Texture2DDescription과 데이터의 메모리 영역으로 새로운 Texture2D()을 생성해야합니다. 이 설명에는 너비, 높이, 픽셀 형식, 밉 수, 배열 수 등이 포함됩니다. 해당 기본 메서드는 ID3D11Device::CreateTexture2D입니다.

결국 Texture2D.FromFile/FromMemory과 같은 D3DX 함수는 동일한 ID3D11Device::CreateTexture2D을 사용하여 텍스처를 만듭니다.

+0

귀하의 도움에 감사드립니다. Texture2DDescription으로 코드를 수정하려고합니다. – yamamo2