2012-11-07 50 views
2

我試圖從內存中的數據創建一個SharpDX.Direct3D11.Texture2D但總是得到SharpDXException(HRESULT:80070057,「參數是不正確的。」)。爲了這個目的,我使用了一個Texture1D,然後可以在沒有問題的情況下創建它。SharpDX:從數據流初始化一個Texture2D失敗(雖然Texture1D正常工作)

我的代碼減小到這個樣品仍產生了異常:

using (var device = new Device(DriverType.Hardware, DeviceCreationFlags.Debug)) { 
    // empty stream sufficient for example 
    var stream = new DataStream(16 * 4, true, true); 

    var description1D = new Texture1DDescription() { 
     Width = 16, 
     ArraySize = 1, 
     Format = Format.R8G8B8A8_UNorm, 
     MipLevels = 1, 
    }; 
    using (var texture1D = new Texture1D(device, description1D, new[] { new DataBox(stream.DataPointer) })) { 
     // no exception on Texture1D 
    } 

    var description2D = new Texture2DDescription() { 
     Width = 8, 
     Height = 2, 
     ArraySize = 1, 
     MipLevels = 1, 
     Format = Format.R8G8B8A8_UNorm, 
     SampleDescription = new SampleDescription(1, 0), 
    }; 
    using (var texture2D = new Texture2D(device, description2D, new[] { new DataBox(stream.DataPointer) })) { 
     // HRESULT: [0x80070057], Module: [Unknown], ApiCode: [Unknown/Unknown], Message: The parameter is incorrect. 
    } 
} 

創建質感,而沒有經過數據的正常工作。有人可以告訴我如何修復Texture2D初始化?

回答

8

您需要將紋理2D的行跨度傳遞到DataBox。喜歡的東西:

new DataBox(stream.DataPointer, 8 * 4) 

或者更通用的方式:

new DataBox(stream.DataPointer, description2D.Width 
      * (int)FormatHelper.SizeOfInBytes(description2D.Format)) 
+0

謝謝你,現在的工作:)其實有沒有相應的構造函數,只有'新的數據箱(datapointer,rowPitch,slicePitch)' 。我假設slicePitch是紋理數組,應該設置爲紋理的大小? –

+2

第三個參數用於Texture3D(它表示Z切片的字節大小),對於Texture2D應該設置爲0。 Texture1D不關心這些參數,因爲整個信息已經存儲在Texture1DDescription中(它只是使用width * sizeof(pixelFormat))。這在MSDN文檔中進行了解釋:http://msdn.microsoft.com/en-us/library/windows/desktop/ff476182%28v=vs.85%29.aspx – xoofx

+0

我想我已經掌握了一切(包括差異DataRectangle和DataBox之間)。感謝您的支持和SharpDX! –