简单的DirectX 11程序运行时错误
Simple DirectX 11 program runtime error
我是DirectX 11的新手,我已经设法在我的书中获得了绘图三角形章节。我已经写了这段代码,但我得到一个运行时错误:" DirectX 11.exe中0x00cd14e6的未处理异常:0xc0000005:访问违反读取位置0x00000000。"
我的编译器显示错误是在InitPipeline函数,但我在那里找不到错误。我做错了什么?
代码: #include <windows.h>
#include <windowsx.h>
#include <d3d11.h>
#include <D3DX11.h>
#include <D3DX10.h>
#pragma comment(lib,"d3d11.lib")
#pragma comment(lib,"d3dx11.lib")
#pragma comment(lib,"d3dx10.lib")
#define SCREEN_WIDTH 800
#define SCREEN_HEIGHT 600
IDXGISwapChain *swapchain;
ID3D11Device *dev;
ID3D11DeviceContext *devcon;
ID3D11InputLayout *pInputLayout;
ID3D11Buffer *pVBuffer;
ID3D11RenderTargetView *backbuffer;
ID3D11VertexShader *pVS;
ID3D11PixelShader *pPS;
// Type
struct VERTEX
{
FLOAT X,Y,Z;
D3DXCOLOR Color;
};
//DirectX
void InitPipeline()
{
// load and compile the two shaders
ID3D10Blob *VS, *PS;
D3DX11CompileFromFile("shaders.hlsl", 0, 0, "VShader", "vs_5_0", 0, 0, 0, &VS, 0, 0);
D3DX11CompileFromFile("shaders.hlsl", 0, 0, "PShader", "ps_5_0", 0, 0, 0, &PS, 0, 0);
//debug
if(!dev)
{
MessageBox(NULL, "DEV = NULL", "ERROR", NULL);
}
if(!devcon)
{
MessageBox(NULL, "DEVCON = NULL", "ERROR", NULL);
}
if(!VS)
{
MessageBox(NULL, "VS = NULL", "ERROR", NULL);
}
if(!PS)
{
MessageBox(NULL, "PS = NULL", "ERROR", NULL);
}
// encapsulate both shaders into shader objects
dev->CreateVertexShader(VS->GetBufferPointer(), VS->GetBufferSize(), NULL, &pVS);
dev->CreatePixelShader(PS->GetBufferPointer(), PS->GetBufferSize(), NULL, &pPS);
// set the shader objects
devcon->VSSetShader(pVS, 0, 0);
devcon->PSSetShader(pPS, 0, 0);
D3D11_INPUT_ELEMENT_DESC ied[] =
{
{"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0,0,D3D11_INPUT_PER_VERTEX_DATA,0},
{"COLOR",0,DXGI_FORMAT_R32G32B32A32_FLOAT,0,D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0},
};
dev->CreateInputLayout(ied, 2, VS->GetBufferPointer(), VS->GetBufferSize(), &pInputLayout);
devcon->IASetInputLayout(pInputLayout);
}
void InitGraphics()
{
VERTEX OurVertices[] =
{
{1,0,0,D3DXCOLOR(1,0,0,1)},
{0,-1,0,D3DXCOLOR(1,0,0,1)},
{0,0,1,D3DXCOLOR(1,0,0,1)},
};
D3D11_BUFFER_DESC bd;
ZeroMemory(&bd, sizeof(D3D11_BUFFER_DESC));
bd.BindFlags = D3D11_BIND_VERTEX_BUFFER;
bd.ByteWidth = sizeof(VERTEX)*3;
bd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
bd.Usage = D3D11_USAGE_DYNAMIC;
dev->CreateBuffer(&bd, NULL, &pVBuffer);
D3D11_MAPPED_SUBRESOURCE ms;
devcon->Map(pVBuffer, NULL, D3D11_MAP_WRITE_DISCARD, NULL, &ms);
memcpy(ms.pData, OurVertices, sizeof(OurVertices));
devcon->Unmap(pVBuffer, NULL);
}
void RenderFrame()
{
devcon->ClearRenderTargetView(backbuffer, D3DXCOLOR(0,0,1,1));
UINT stride = sizeof(VERTEX);
UINT offset = 0;
devcon->IASetVertexBuffers(0, 1, &pVBuffer, &stride, &offset);
devcon->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
devcon->Draw(3,0);
swapchain->Present(0,0);
}
void InitD3D(HWND hWnd)
{
// create a struct to hold information about the swap chain
DXGI_SWAP_CHAIN_DESC scd;
// clear out the struct for use
ZeroMemory(&scd, sizeof(DXGI_SWAP_CHAIN_DESC));
// fill the swap chain description struct
scd.BufferCount = 1; // one back buffer
scd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; // use 32-bit color
scd.BufferDesc.Width = SCREEN_WIDTH; // set the back buffer width
scd.BufferDesc.Height = SCREEN_HEIGHT; // set the back buffer height
scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; // how swap chain is to be used
scd.OutputWindow = hWnd; // the window to be used
scd.SampleDesc.Count = 4; // how many multisamples
scd.Windowed = TRUE; // windowed/full-screen mode
scd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH; // allow full-screen switching
// create a device, device context and swap chain using the information in the scd struct
if(FAILED(D3D11CreateDeviceAndSwapChain(NULL,
D3D_DRIVER_TYPE_HARDWARE,
NULL,
NULL,
NULL,
NULL,
D3D11_SDK_VERSION,
&scd,
&swapchain,
&dev,
NULL,
&devcon)))
{
MessageBox(NULL, "D3D11CreateDeviceAndSwapChain Failed", "ERROR", NULL);
}
// get the address of the back buffer
ID3D11Texture2D *pBackBuffer;
swapchain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&pBackBuffer);
// use the back buffer address to create the render target
dev->CreateRenderTargetView(pBackBuffer, NULL, &backbuffer);
pBackBuffer->Release();
// set the render target as the back buffer
devcon->OMSetRenderTargets(1, &backbuffer, NULL);
// Set the viewport
D3D11_VIEWPORT viewport;
ZeroMemory(&viewport, sizeof(D3D11_VIEWPORT));
viewport.TopLeftX = 0;
viewport.TopLeftY = 0;
viewport.Width = SCREEN_WIDTH;
viewport.Height = SCREEN_HEIGHT;
devcon->RSSetViewports(1, &viewport);
InitPipeline();
InitGraphics();
}
void CleanD3D()
{
swapchain->SetFullscreenState(FALSE, NULL);
dev->Release();
devcon->Release();
swapchain->Release();
pInputLayout->Release();
pVBuffer->Release();
backbuffer->Release();
pVS->Release();
pPS->Release();
}
// Window
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow)
{
HWND hWnd;
WNDCLASSEX wc;
ZeroMemory(&wc, sizeof(WNDCLASSEX));
wc.cbSize = sizeof(WNDCLASSEX);
//wc.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hIcon = (HICON)LoadIcon(NULL, IDI_APPLICATION);
wc.hInstance = hInstance;
wc.lpfnWndProc = WndProc;
wc.lpszClassName = "DirectXWindow";
wc.style = CS_HREDRAW | CS_VREDRAW;
RegisterClassEx(&wc);
hWnd = CreateWindowEx(NULL,
"DirectXWindow",
"DirectX 11 (June 2010",
WS_OVERLAPPEDWINDOW,
0,0,
SCREEN_WIDTH, SCREEN_HEIGHT,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hWnd, nCmdShow);
InitD3D(hWnd);
UpdateWindow(hWnd);
MSG msg = {0};
while(msg.message != WM_QUIT)
{
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
RenderFrame();
}
}
CleanD3D();
return msg.wParam;
}
这个错误基本上意味着你在某个地方使用了空指针。检查你所有的指示。我猜是某个函数在某个地方没有设置你的指针(或者你的参数顺序错误)。
您正在使用NULL
指针。您定义了8个全局D3D接口指针,并且在InitPipeline
中使用dev
和devcon
,它们需要在您可以调用它们的任何方法之前进行分配和初始化。
尝试设置scd.SampleDesc.Count = 1
这个值告诉Direct3D应该在抗锯齿中加入多少细节,数值越高越好。Direct3D 11视频卡保证在这里最多支持4个,但最小是1个。也许你的显卡不支持Direct3D 11?
相关文章:
- 为什么程序在 c++ 中迭代 emtpy 向量时会抛出运行时错误
- 调用 java 的回调() 时应用程序崩溃.由于 detatchThread 而获得运行时错误
- QT C++防止关闭应用程序时出现运行时错误
- 运行 libpng 应用程序时出现运行时错误
- 向 Kattis 在线评委提交 c++ 程序时出现未知运行时错误
- Qt 应用程序中与Qt版本相关的运行时错误
- 在计算机级别,应用程序以二进制方式运行,然后当发生运行时错误时,它如何呈现回错误代码
- 排列程序无法写入数组 - 运行时错误
- 为什么我的程序在删除以下代码中的注释后会出现运行时错误?
- c++分段错误:为什么这个程序给出运行时错误(SIGSEGV)
- 使用MinGW gcc/g++(nuwen发行版)编译的程序出现运行时错误
- QT程序无法编译/具有运行时错误(IDE:CodeBlocks/QTCreator)
- 数组总和在程序运行时给出错误的答案
- 程序C++运行时错误
- 基于graphics.h的程序出现代码块运行时错误
- OCCI C++应用程序的Visual Studio调试运行时错误
- 字符串程序C++运行时错误
- C++基本程序运行时错误
- 简单的DirectX 11程序运行时错误
- OpenCV程序运行时错误