我是 Direct3D 新手并尝试执行这段代码:
#include <iostream>
#include <windows.h>
#include <d3d11.h>
#include <d3dcompiler.h>
#pragma comment(lib, "d3d11.lib")
#pragma comment(lib, "d3dcompiler.lib")
#pragma comment(lib, "dxguid.lib")
#pragma comment(lib, "winmm.lib")
#pragma comment(lib, "comctl32.lib")
using namespace std;
int main()
{
ID3D11Device* g_pDevice = NULL;
IDXGISwapChain* g_pSwapChain = NULL;
ID3D11DeviceContext* g_pContext = NULL;
D3D_FEATURE_LEVEL g_featureLevel;
D3D_DRIVER_TYPE g_driverType;
HRESULT hr = S_OK;
UINT createDeviceFlags = D3D11_CREATE_DEVICE_VIDEO_SUPPORT;
#ifdef _DEBUG
createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG;
#endif
printf(">Got rect\n");
D3D_DRIVER_TYPE driverTypes[] =
{
D3D_DRIVER_TYPE_HARDWARE,
D3D_DRIVER_TYPE_WARP,
D3D_DRIVER_TYPE_REFERENCE,
};
D3D_FEATURE_LEVEL featureLevels[] =
{
D3D_FEATURE_LEVEL_11_1,
D3D_FEATURE_LEVEL_11_0,
D3D_FEATURE_LEVEL_10_1,
D3D_FEATURE_LEVEL_10_0,
};
DXGI_SWAP_CHAIN_DESC sd;
ZeroMemory(&sd, sizeof(sd));
sd.BufferCount = 1;
sd.BufferDesc.Width = 700;
sd.BufferDesc.Height = 600;
sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
sd.BufferDesc.RefreshRate.Numerator = 75;
sd.BufferDesc.RefreshRate.Denominator = 1;
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
sd.OutputWindow = NULL;
sd.SampleDesc.Count = 1;
sd.SampleDesc.Quality = 0;
sd.Windowed = TRUE;
printf(">Checking drivers\n");
for (UINT i = 0; i < ARRAYSIZE(driverTypes); i++)
{
g_driverType = driverTypes[i];
hr = D3D11CreateDeviceAndSwapChain(
NULL,
g_driverType,
NULL,
createDeviceFlags,
featureLevels,
ARRAYSIZE(featureLevels),
D3D11_SDK_VERSION,
&sd,
&g_pSwapChain,
&g_pDevice,
&g_featureLevel,
&g_pContext
);
printf(">>Driver type: %ld\n", g_driverType);
if (SUCCEEDED(hr)) break;
}
LPSTR s = (LPSTR)calloc(512, 1);
FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, hr, 0, s, 512, NULL);
printf("%s\n", s);
return 0;
}
...我收到一条错误消息,提示我没有适合该程序的驱动程序
有趣的是,当我在没有任何顶点缓冲区和三角形*的情况下测试它时,我可以成功执行此代码。但突然添加它们会导致驱动程序错误...... 我试图在这里找到答案,但有人遇到了特定驱动程序类型的问题,我什至无法使用其中任何一个运行该程序。我还观看了 YouTube 教程,该教程建议安装可以处理来自应用程序的消息的程序(它是关于游戏等最终产品,我有一个调试程序)。谢谢你
*- 看来我是否初始化几何图形并不重要
附注更改了代码以匹配“最小、可重现的示例”规则,因此现在您可以自己尝试(如果您有 Windows SDK)
我终于在这里找到了问题:我在 main.cpp 文件中有这段代码:
Window* mw = new Window(800, 600, "Name"); // Window init
Scene* sc = new Scene(mw->g_hWnd, 75); // DirectX init
if (!mw->Show() || !sc->Check())
{
delete mw;
delete sc;
return -1;
}
并且看起来
Window
构造函数不会初始化窗口本身,而是初始化具有 mw->Show()
调用的 InitInstance()
。这就是我编辑代码的原因:
Window* mw = new Window(800, 600, "Name"); // Window init
if (!mw->Show())
{
delete mw;
return -1;
}
Scene* sc = new Scene(mw->g_hWnd, 75); // DirectX init
if (!sc->Check())
{
delete mw;
delete sc;
return -1;
}
如果您仍然遇到此错误,请检查此网站。似乎有人用更复杂的英语重写了我的问题并回答了:)