DirectX10交换链和设备指向0x00000000(导致运行时错误)(c ++)

时间:2011-03-12 13:58:02

标签: c++ windows visual-studio-2010 directx

好的,我跟着this tutorial(代码在页面下面,在图片的顶部,你可以点击显示代码)关于DX10和c ++ 基本上代码就像

// include and stuff
ID3D10Device* device;  // adding = NULL wont change problem
ID3D10RenderTargetView* rtv;
IDXGISwapChain* swapchain;
// function predecs, winmain, winproc
// winmain calls initD3D(hWnd) just before entering msg loop

void initD3D(HWND hWnd){
    DXGI_SWAP_CHAIN_DESC scd; // creates struct for swap chain info
    ZeroMemory(&scd, sizeof(DXGI_SWAP_CHAIN_DESC)); // clear the struct for use

    scd.BufferCount = 1; // create two buffers one front buffer one back buffer
    scd.BufferDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; // use 32-bit color
    scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; // tell how chain is to be used
    scd.OutputWindow = hWnd; // set window to be used by d3d
    scd.SampleDesc.Count = 1; // set level of multi sampling
    scd.SampleDesc.Quality = 0; // set quality of multisampling
        scd.Windowed = true; // set to windowed or fullscreen

    D3D10CreateDeviceAndSwapChain(NULL, D3D10_DRIVER_TYPE_HARDWARE,
                                  NULL, 0, D3D10_SDK_VERSION, &scd,
                                  &swapchain, &device);
    // get the adress of the backbuffer and use it to create the render target
    ID3D10Texture2D* pBackBuffer;
        // AND HERE (NEXT LINE) THE ERROR OCCURS
    swapchain->GetBuffer(0, __uuidof(ID3D10Texture2D), (LPVOID*)&pBackBuffer);
        // on runtime debugger tells me swapchain value is 0x00000000
        // why does it point to nowhere?

    device->CreateRenderTargetView(pBackBuffer, NULL, &rtv);
    pBackBuffer->Release();

    // set the render target as the back buffer
    device->OMSetRenderTargets(1, &rtv, NULL);

    D3D10_VIEWPORT viewport; // create a struct to hold the viewport data

    ZeroMemory(&viewport, sizeof(D3D10_VIEWPORT)); // clear the struct
    //viewport.stuff

    device->RSSetViewports(1, &viewport); //set the viewport

}

我遗漏了不必要的代码,我认为如果你真的需要完整的代码,你可以弄明白或者按照链接,我想专注于主要问题;)

正如代码中所述,我的调试器告诉我swapchain指向0x00000000,查看我发现的值与device相同的值也指向0x00000000。 消息是:

First-chance exception at 0x........ in bla.exe: 0x........: Access violation reading location 0x00000000

我查看了整个代码,不知道可能是什么问题。

可能是与硬件相关的问题吗? 我在Thinkpad T510上有两个图形芯片(一个是intel和一个nVidia),默认情况下使用nVidia芯片导致Visual Studio崩溃。

我不知道还有什么问题,因为教程声明代码会运行:) 我知道还有另一个主题与一个非常相关的问题,但据我所知,它不一样。 (作者给出的答案并没有解决我的问题)

编辑:我刚读取调试输出,似乎无法加载* .dll的 * *加载 顺便说一句我正在使用DX SDK的x86库

片段:

'AnotherWindowsApp.exe': Loaded 'E:\visual studio 2010 Projects\AnotherWindowsApp\Debug\AnotherWindowsApp.exe', Symbols loaded.
'AnotherWindowsApp.exe': Loaded 'C:\Windows\SysWOW64\ntdll.dll', Cannot find or open the PDB file
'AnotherWindowsApp.exe': Loaded 'C:\Windows\SysWOW64\kernel32.dll', Cannot find or open the PDB file
'AnotherWindowsApp.exe': Loaded 'C:\Windows\SysWOW64\KernelBase.dll', Cannot find or open the PDB file
[...]
'AnotherWindowsApp.exe': Loaded 'C:\Windows\SysWOW64\nvinit.dll', Binary was not built with debug information.
'AnotherWindowsApp.exe': Loaded 'C:\Program Files (x86)\NVIDIA Corporation\coprocmanager\detoured.dll', Cannot find or open the PDB file
'AnotherWindowsApp.exe': Loaded 'C:\Program Files (x86)\NVIDIA Corporation\coprocmanager\Nvd3d9wrap.dll', Cannot find or open the PDB file
[...]
'AnotherWindowsApp.exe': Loaded 'C:\Windows\SysWOW64\d3d9.dll', Cannot find or open the PDB file
'AnotherWindowsApp.exe': Loaded 'C:\Program Files (x86)\NVIDIA Corporation\coprocmanager\nvdxgiwrap.dll', Cannot find or open the PDB file
'AnotherWindowsApp.exe': Loaded 'C:\Windows\SysWOW64\d3d11.dll', Cannot find or open the PDB file
[...]
'AnotherWindowsApp.exe': Loaded 'C:\Windows\SysWOW64\igd10umd32.dll', Cannot find or open the PDB file
First-chance exception at 0x7623b727 in AnotherWindowsApp.exe: Microsoft C++ exception: _com_error at memory location 0x0045f06c..
First-chance exception at 0x7623b727 in AnotherWindowsApp.exe: Microsoft C++ exception: _com_error at memory location 0x0045ef90..
First-chance exception at 0x7623b727 in AnotherWindowsApp.exe: Microsoft C++ exception: _com_error at memory location 0x0045f0e0..
The thread 'Win32 Thread' (0x18b0) has exited with code 0 (0x0).
The thread 'Win32 Thread' (0x12dc) has exited with code 0 (0x0).
The thread 'Win32 Thread' (0x354) has exited with code 0 (0x0).
The thread 'UMDShimPresentThread' (0x1080) has exited with code 0 (0x0).
'AnotherWindowsApp.exe': Unloaded 'C:\Windows\SysWOW64\nvwgf2um.dll'
'AnotherWindowsApp.exe': Unloaded 'C:\Windows\SysWOW64\igd10umd32.dll'
First-chance exception at 0x01281758 in AnotherWindowsApp.exe: 0xC0000005: Access violation reading location 0x00000000.
Unhandled exception at 0x01281758 in AnotherWindowsApp.exe: 0xC0000005: Access violation reading location 0x00000000.
First-chance exception at 0x01281758 in AnotherWindowsApp.exe: 0xC0000005: Access violation reading location 0x00000000.
Unhandled exception at 0x01281758 in AnotherWindowsApp.exe: 0xC0000005: Access violation reading location 0x00000000.
The program '[5912] AnotherWindowsApp.exe: Native' has exited with code -1073741819 (0xc0000005).

3 个答案:

答案 0 :(得分:3)

首先,您应该检查D3D10CreateDeviceAndSwapChain函数返回的错误代码。将错误代码与this site上的错误代码进行比较,以获得第一个想法,可能出现的问题。

当D3D10CreateDeviceAndSwapChain函数未成功时,

'swapchain'和'device'设置为零(0x00000000)。

其次,根据docs,DXGI_SWAP_CHAIN_DESC结构是一个'in'参数。 可能这会导致您的错误。

更新(根据评论): 与教程不同的一点是缓冲格式。本教程使用DXGI_FORMAT_R8G8B8A8_UNORM,但您使用的是DXGI_FORMAT_B8G8R8A8_UNORM。

答案 1 :(得分:0)

考虑打开D3D调试输出,它肯定会告诉你D3D10CreateDeviceAndSwapChain出了什么问题。

答案 2 :(得分:0)

这是因为D3D10CreateDeviceAndSwapChain失败。您没有检查返回代码。您试图创建D3D10硬件设备,但可能没有使用D3D10级图形硬件运行。使用Direct3D调试输出告诉您错误是什么。