gpt4 book ai didi

c# - 如何将 IntPtr 获取到 native directx11 结构?

转载 作者:行者123 更新时间:2023-11-28 04:42:52 32 4
gpt4 key购买 nike

我正在尝试在 C++ 中创建(并填充)一个 D3D11Buffer,通过互操作将指向缓冲区内存的指针传递给 C#,以便使用 slimdx 从该缓冲区中读取 - 不应涉及通过 cpu 的缓冲区拷贝。

到目前为止,这是我的代码

函数导出:

extern "C" {__declspec(dllexport) HRESULT getValues(int * debug, ID3D11Buffer* bufOut); }

和函数:

ID3D11Device* d3d11Device;
ID3D11Buffer* triangleVertBuffer;
ID3D11DeviceContext* d3d11DevCon;

struct Vertex //Overloaded Vertex Structure
{
Vertex() {}
Vertex(float x, float y, float z)
: pos(x, y, z) {}

XMFLOAT3 pos;
};

HRESULT getValues(int * debug, ID3D11Buffer* bufOut) {


//Create the vertex buffer
Vertex v[] =
{
Vertex(0.0f, 0.5f, 0.5f),
Vertex(0.5f, -0.5f, 0.5f),
Vertex(-0.5f, -0.5f, 0.5f),
};

D3D_FEATURE_LEVEL FeatureLevelsRequested = D3D_FEATURE_LEVEL_11_0;
UINT numLevelsRequested = 1;
D3D_FEATURE_LEVEL FeatureLevelsSupported;

//create device
hr = D3D11CreateDevice(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, D3D11_CREATE_DEVICE_DEBUG, &FeatureLevelsRequested, numLevelsRequested, D3D11_SDK_VERSION, &d3d11Device, &FeatureLevelsSupported, &d3d11DevCon);
debug[0] = hr;

D3D11_BUFFER_DESC vertexBufferDesc;
ZeroMemory(&vertexBufferDesc, sizeof(vertexBufferDesc));

vertexBufferDesc.Usage = D3D11_USAGE_DEFAULT;
vertexBufferDesc.ByteWidth = sizeof(Vertex) * 3;
vertexBufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
vertexBufferDesc.CPUAccessFlags = 0;
vertexBufferDesc.MiscFlags = 0;

D3D11_SUBRESOURCE_DATA vertexBufferData;


ZeroMemory(&vertexBufferData, sizeof(vertexBufferData));
vertexBufferData.pSysMem = v;
hr2 = d3d11Device->CreateBuffer(&vertexBufferDesc, &vertexBufferData, &triangleVertBuffer);


bufOut = triangleVertBuffer;

debug[1] = hr2;

return hr;
}

在 C# 中,我像这样导入函数:

[System.Runtime.InteropServices.DllImport("CreateID3D11Buffer.dll", CallingConvention = CallingConvention.StdCall)]
private static unsafe extern UInt32 getValues([In, Out] int[] debug, [In, Out] IntPtr bufIn);

然后这样调用它:

int[]debug = new int[2];
IntPtr bufPtr;// = IntPtr.Zero;
UInt32 hr = getValues(debug, bufPtr);
DataStream ds = new DataStream(bufPtr, sizeof(Vector3) * 3, true, false);

到目前为止一切顺利....现在解决我的问题(耐心等待,仍然是 c++ 初学者和 c# 中级...):

  • 它不起作用:在 C# 中,最后一行 DataStream 构造函数抛出错误,因为 bufPtr,非托管内存的 IntPtr 为空。所以,显然,我的 p/invoke 或我的 C++ 代码有问题...因此,我查看了 C++ 中 dx11 函数的结果 ->
  • HRESULT:我在 c# 中导入的函数的返回值 hr 等于 0,但 debug 数组中的两个元素都等于 -1!一方面我不明白如何在这里解释负值,另一方面返回值 hr 应该至少等于 debug[0](我'我知道他们的类型不同)?所以,我不知道该怎么做,但这表明函数 D3D11CreateDevice() 存在问题,然后(可以理解)d3d11Device->CreateBuffer()
  • 我不确定我是否正确理解了 slimdx 的 DataStream 构造函数——指向非托管内存的 IntPtr 指向图形内存,或者这是一个从非托管 CPU 内存中读取的函数?不幸的是,我找不到任何使用 IntPtr 重载的示例……这是文档:https://slimdx.org/docs/html/M_SlimDX_DataStream__ctor_2.htm

所以,我做错了吗? :) 如果是这样,请指出正确的方向。

注意:大部分 cpp 代码是从 https://www.braynzarsoft.net/viewtutorial/q16390-4-begin-drawing 中提取的

感谢您的任何帮助/提示,​​几天来一直在努力解决这个问题。

最佳答案

ID3D11Buffer* 是一个指针。如果你想取回一个指针,你必须将一个指针传递给一个指针,所以像这样定义你的 C++ 方法:

HRESULT getValues(int * debug, ID3D11Buffer** bufOut)
{
...

*bufOut = triangleVertBuffer;

...
}

C# 是这样的:

[DllImport("CreateID3D11Buffer.dll", CallingConvention = CallingConvention.StdCall)]
private static extern int getValues([In, Out] int[] debug, out IntPtr bufIn);

这部分应该可以工作。

关于c# - 如何将 IntPtr 获取到 native directx11 结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49867897/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com