gpt4 book ai didi

wpf - WPF 应用程序中的 CUDA 和 Direct3D 互操作性

转载 作者:行者123 更新时间:2023-12-04 04:54:34 26 4
gpt4 key购买 nike

我尝试使用 CUDA 计算和 Direct3D 9 图形实现 WPF 应用程序。所以我使用以下方法:

  1. 我使用 MSDN "Walkthrough: Hosting Direct3D9Content in WPF" 创建 WPF 应用程序
  2. 然后我使用 MSDN "Walkthrough: Creating Direct3D9Content for Hosting in WPF" 创建 DLL
  3. 有效,我看到一个旋转的三角形。
  4. 然后我尝试根据 3.2.11.2 部分实现 Direct3D 9 互操作“NVIDIA CUDA C 编程指南”。但cudaGraphicsD3D9RegisterResource 函数返回错误。

我在类中声明了 CUDA 图形资源变量:

#pragma once

class CTriangleRenderer : public CRenderer
{
public:
static HRESULT Create(IDirect3D9 *pD3D, IDirect3D9Ex *pD3DEx, HWND hwnd, UINT uAdapter, CRenderer **ppRenderer);
~CTriangleRenderer();

HRESULT Render();

protected:
HRESULT Init(IDirect3D9 *pD3D, IDirect3D9Ex *pD3DEx, HWND hwnd, UINT uAdapter);

private:
CTriangleRenderer();

IDirect3DVertexBuffer9 *m_pd3dVB;
struct cudaGraphicsResource* positionsVB_CUDA;
};

cudaGraphicsD3D9RegisterResource 函数调用是此类成员:

HRESULT 
CTriangleRenderer::Init(IDirect3D9 *pD3D, IDirect3D9Ex *pD3DEx, HWND hwnd, UINT uAdapter)
{
HRESULT hr = S_OK;
D3DXMATRIXA16 matView, matProj;
D3DXVECTOR3 vEyePt(0.0f, 0.0f,-5.0f);
D3DXVECTOR3 vLookatPt(0.0f, 0.0f, 0.0f);
D3DXVECTOR3 vUpVec(0.0f, 1.0f, 0.0f);

// Call base to create the device and render target
IFC(CRenderer::Init(pD3D, pD3DEx, hwnd, uAdapter));

// Set up the VB
CUSTOMVERTEX vertices[] =
{
{ -1.0f, -1.0f, 0.0f, 0xffff0000, }, // x, y, z, color
{ 1.0f, -1.0f, 0.0f, 0xff00ff00, },
{ 0.0f, 1.0f, 0.0f, 0xff00ffff, },
};

IFC(m_pd3dDevice->CreateVertexBuffer(sizeof(vertices), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &m_pd3dVB, NULL));

cudaGraphicsD3D9RegisterResource(&positionsVB_CUDA, m_pd3dVB, cudaGraphicsRegisterFlagsNone);

cutilCheckMsg("cudaGraphicsD3D9RegisterResource failed");

cudaGraphicsResourceSetMapFlags(positionsVB_CUDA, cudaGraphicsMapFlagsWriteDiscard);

void *pVertices;
IFC(m_pd3dVB->Lock(0, sizeof(vertices), &pVertices, 0));
memcpy(pVertices, vertices, sizeof(vertices));
m_pd3dVB->Unlock();

// Set up the camera
D3DXMatrixLookAtLH(&matView, &vEyePt, &vLookatPt, &vUpVec);
IFC(m_pd3dDevice->SetTransform(D3DTS_VIEW, &matView));
D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI / 4, 1.0f, 1.0f, 100.0f);
IFC(m_pd3dDevice->SetTransform(D3DTS_PROJECTION, &matProj));

// Set up the global state
IFC(m_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE));
IFC(m_pd3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE));
IFC(m_pd3dDevice->SetStreamSource(0, m_pd3dVB, 0, sizeof(CUSTOMVERTEX)));
IFC(m_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX));

Cleanup:
return hr;
}

positionsVB_CUDA 变量值在 cudaGraphicsD3D9RegisterResource 调用之前为 0xcdcdcdcd,之后为相同值。

我的错误在哪里?来自 CUDA SDK 的 Direct3D 9 互操作示例运行良好。我的配置:

  • 英伟达 GTX 260 800 MB
  • 英伟达 GTX 460 2GB
  • CUDA 4.0
  • Windows 7 64 位
  • 8GB 内存
  • Visual Studio 2010

最佳答案

CUDA 对可以绑定(bind)的 VB 类型有特定要求(我不认为你可以 CPU 锁定/解锁绑定(bind)到 CUDA 的 VB)。如果要修复锁定/解锁:打开 DirectX 错误记录并通过 DirectX 控制面板使用 DirectX 调试 Dll(在启动菜单的 DirectX 文件夹中找到它(您必须安装 DirectX SDK))。这将启用 DirectX 的调试登录,这在调查 DirectX 错误时非常有用且信息丰富(它记录到 Visual Studio 中的输出窗口)。您可能试图锁定一个可解锁的 VB(如果您希望它可从 CPU 读取,则初始化 VB 有特定要求)。

关于wpf - WPF 应用程序中的 CUDA 和 Direct3D 互操作性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7283600/

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