简体   繁体   English

来自字节数组 Sharpdx 的 Texture2d

[英]Texture2d from Byte array Sharpdx

I am a C#, SharpDX and Directx newbie.我是 C#、SharpDX 和 Directx 新手。 Please excuse my ignorance.请原谅我的无知。 I am following up on an old post: Exception of Texture2D.FromMemory() in SharpDX code .我正在跟进一篇旧帖子: SharpDX 代码中的 Texture2D.FromMemory() 异常 It was very helpful.这是非常有帮助的。

My goal:我的目标:

  1. Build a Texture2d from softwarebitmap.从软件位图构建 Texture2d。
  2. Make the texture available to HLSL.使纹理可用于 HLSL。

The way I approached it:我接近它的方式:

  1. Using IMemoryBufferByteAccess, I was able to retrieve the pointer to byte and the total capacity of Frame.使用 IMemoryBufferByteAccess,我能够检索指向字节的指针和 Frame 的总容量。 From the previous post, it seems I would need to use the DataRectangle to point to the byte array.从上一篇文章来看,我似乎需要使用 DataRectangle 来指向字节数组。
  2. Have 2 textures with different descriptors- Texture1 (_staging_texture)- none binding flag, cpu write and read privileges, usage- staging.有 2 个具有不同描述符的纹理 - Texture1 (_staging_texture) - 无绑定标志,cpu 读写权限,用法 - 暂存。 I created this texture with the datarectangle pointing to the byte array.我用指向字节数组的 datarectangle 创建了这个纹理。 Texture2 (_final_texture)- Shader binding flag, no cpu access, usage- default. Texture2 (_final_texture)- 着色器绑定标志,无 CPU 访问权限,用法-默认。 This texture would be eventually made available to the shader.该纹理最终将提供给着色器。 The intention was to use the copyResource function from Texture1 to Texture2.目的是使用从 Texture1 到 Texture2 的 copyResource 函数。

Below, I copy my unpolished code for reference:下面,我复制我未完善的代码以供参考:

               bitmap = latestFrame.SoftwareBitmap;
                Windows.Graphics.Imaging.BitmapBuffer bitmapBuffer= bitmap.LockBuffer(Windows.Graphics.Imaging.BitmapBufferAccessMode.Read);
                Windows.Foundation.IMemoryBufferReference bufferReference = bitmapBuffer.CreateReference();
                var staging_descriptor = new Texture2DDescription
                {
                    Width = Width,
                    Height = Height,
                    MipLevels = 1,
                    ArraySize = 1,
                    Format = SharpDX.DXGI.Format.R8G8B8A8_UNorm,
                    SampleDescription = new SharpDX.DXGI.SampleDescription(1, 0),
                    Usage = ResourceUsage.Staging,
                    BindFlags = BindFlags.None,
                    CpuAccessFlags = CpuAccessFlags.Read | CpuAccessFlags.Write,
                    OptionFlags = ResourceOptionFlags.None
                };
                var final_descriptor = new Texture2DDescription
                {
                    Width = Width,
                    Height = Height,
                    MipLevels = 1,
                    ArraySize = 1,
                    Format = SharpDX.DXGI.Format.R8G8B8A8_UNorm,
                    SampleDescription = new SharpDX.DXGI.SampleDescription(1, 0),
                    Usage = ResourceUsage.Default,
                    BindFlags = BindFlags.ShaderResource,
                    CpuAccessFlags = CpuAccessFlags.None,
                    OptionFlags = ResourceOptionFlags.None
                };

                var dataRectangle = new SharpDX.DataRectangle();
                unsafe
                {
                    byte* dataInBytes;
                    uint capacityInBytes;
                    ((InteropStatics.IMemoryBufferByteAccess)bufferReference).GetBuffer(out dataInBytes, out capacityInBytes);                    
                    dataRectangle.DataPointer = (IntPtr)dataInBytes;
                    dataRectangle.Pitch = 4;
                }
                

                Texture2D _stagingTexture = new Texture2D(device, staging_descriptor, dataRectangle);
                Texture2D _finalTexture = new Texture2D(device, final_descriptor);

                _stagingTexture.Device.ImmediateContext.CopyResource(_stagingTexture, _finalTexture);

My question is two fold:我的问题有两个:

  1. The DataRectangle uses IntPtr type while the pointer retrieved from the interface is Byte array.. Is this not a problem? DataRectangle 使用 IntPtr 类型,而从接口检索的指针是 Byte 数组。这不是问题吗? OR does the pitch member in the DataRectangle address this?或者 DataRectangle 中的音高成员是否解决了这个问题? For now I casted byteArray to IntPtr.现在我将 byteArray 转换为 IntPtr。
  2. Would this approach work?这种方法行得通吗? OR is there a better way to handle this?或者有没有更好的方法来处理这个问题?

Any pointers, suggestions or constructive criticisms would be much appreciated!任何指示、建议或建设性的批评将不胜感激!

a while ago i was looking for the same and I come up with this function that always works fine for my use case不久前,我一直在寻找相同的功能,并且我想出了这个功能对于我的用例来说总是很好用

public static Texture2D CreateTexture2DFrombytes(Device device, byte[] RawData, int width, int height)
{
    Texture2DDescription desc;
    desc.Width = width;
    desc.Height = height;
    desc.ArraySize = 1;
    desc.BindFlags = BindFlags.ShaderResource;
    desc.Usage = ResourceUsage.Immutable;
    desc.CpuAccessFlags = CpuAccessFlags.None;
    desc.Format = Format.B8G8R8A8_UNorm;
    desc.MipLevels = 1;
    desc.OptionFlags = ResourceOptionFlags.None;
    desc.SampleDescription.Count = 1;
    desc.SampleDescription.Quality = 0;
    DataStream s = DataStream.Create(RawData, true, true);
    DataRectangle rect = new DataRectangle(s.DataPointer, width * 4);
    Texture2D t2D = new Texture2D(device, desc, rect);
    return t2D;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM