|
2012/2/19 下午 09:52:48
小弟剛學directx11 其中如何建立HLSL檔是目前的問題 小弟身邊只有VC++2010,是否還需要其他軟體?才能創造出 圖畫? 這是程式碼 但是只要一執行他會說"於 0x6ae1e3de 的 triangle.exe 中發生未處理的例外狀況: 0xC0000005: 讀取位置 0x00000350 時發生存取違規" 不知道是否與 創建HLSL檔有關係 我想知道兩件事: 1,hlsl黨要如何建立?(例如:方案管理右鍵->加入->....),或是少了何種軟體 2,出現存取違規的原因是甚麼? ,以下是小弟的程式碼: #include <Windows.h> #include <Windowsx.h> #include <d3d11.h> #include <d3dx11.h> #include <d3d10.h> #include <d3dx9math.h> using namespace std;
#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; ID3D11RenderTargetView *backbuffer; ID3D11InputLayout *pLayout; ID3D11VertexShader *pVS; ID3D11PixelShader *pPS; ID3D11Buffer *pVBuffer;
struct VERTEX{FLOAT X,Y,Z; D3DXCOLOR Color;};
void InitD3D(HWND hWnd); void RenderFrame(void); void CleanD3D(void); void InitGraphics(void); void InitPipeline(void);
BOOL AdjsutWindowRest(LPRECT lpRect, DWORD dwStyle, BOOL bMenu); LRESULT CALLBACK WinProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM 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.style = CS_HREDRAW|CS_VREDRAW; wc.lpfnWndProc = WinProc; wc.hInstance = hInstance; wc.hCursor = LoadCursor(NULL,IDC_ARROW); wc.lpszClassName = L"WindowClass1"; RegisterClassEx(&wc);
RECT wr = {0, 0, SCREEN_WIDTH, SCREEN_HEIGHT}; AdjustWindowRect(&wr, WS_OVERLAPPEDWINDOW, FALSE);
hWnd = CreateWindowEx(NULL, L"Windowclass1", L"Our First Direct3D Program", WS_OVERLAPPEDWINDOW, 300, 300, wr.right - wr.left, wr.bottom - wr.top, NULL, NULL, hInstance, NULL); ShowWindow(hWnd,nCmdShow); InitD3D(hWnd); MSG msg; while(TRUE){ if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){ TranslateMessage(&msg); DispatchMessage(&msg); if(msg.message == WM_QUIT) break; } RenderFrame(); } CleanD3D(); return msg.wParam; }
LRESULT CALLBACK WinProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam){ switch(message){ case WM_DESTROY: { PostQuitMessage(0); return 0; }break; } return DefWindowProc(hWnd,message,wParam,lParam); }
void InitD3D(HWND hWnd){ DXGI_SWAP_CHAIN_DESC scd;
ZeroMemory(&scd,sizeof(DXGI_SWAP_CHAIN_DESC));
scd.BufferCount = 1; scd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; scd.BufferDesc.Width = SCREEN_WIDTH; scd.BufferDesc.Height = SCREEN_HEIGHT; scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; scd.OutputWindow = hWnd; scd.SampleDesc.Count = 4; scd.Windowed = TRUE; scd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;
D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, NULL, NULL, NULL, D3D11_SDK_VERSION, &scd, &swapchain, &dev, NULL, &devcon); ID3D11Texture2D *pBackBuffer; swapchain->GetBuffer(0,__uuidof(ID3D11Texture2D),(LPVOID*)&pBackBuffer);
dev->CreateRenderTargetView(pBackBuffer,NULL,&backbuffer); pBackBuffer->Release();
devcon->OMSetRenderTargets(1,&backbuffer,NULL);
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 RenderFrame(void){ devcon->ClearRenderTargetView(backbuffer,D3DXCOLOR(0.0f,0.2f,0.4f,1.0f));
UINT stride = sizeof(VERTEX); UINT offset = 0; devcon->IASetVertexBuffers(0, 1, &pVBuffer, &stride, &offset); devcon->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST); devcon->Draw(3,0);
swapchain->Present(0,0); }
void CleanD3D(void){
swapchain->SetFullscreenState(FALSE, NULL);
pLayout->Release(); pVS->Release(); pPS->Release(); pVBuffer->Release(); swapchain->Release(); backbuffer->Release(); dev->Release(); devcon->Release(); }
void InitGraphics(){ VERTEX OurVertices[] = { {0.0f,0.5f,0.0f,D3DXCOLOR(1.0f,0.0f,0.0f,1.0f)}, {0.45f,-0.5f,0.0f,D3DXCOLOR(0.0f,1.0f,0.0f,1.0f)}, {-0.45f,-0.5f,0.0f,D3DXCOLOR(0.0f,0.0f,1.0f,1.0f)} };
D3D11_BUFFER_DESC bd; ZeroMemory(&bd,sizeof(bd));
bd.Usage = D3D11_USAGE_DYNAMIC; bd.ByteWidth = sizeof(VERTEX) * 3; bd.BindFlags = D3D11_BIND_VERTEX_BUFFER; bd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
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 InitPipeline(){ ID3D10Blob *VS, *PS; D3DX11CompileFromFile(L"shaders.hlsl", 0, 0, "VShader", "vs_5_0", 0, 0, 0, &VS, 0, 0); D3DX11CompileFromFile(L"shaders.hlsl", 0, 0, "PShader", "ps_5_0", 0, 0, 0, &PS, 0, 0);
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, 12, D3D11_INPUT_PER_VERTEX_DATA,0} };
dev->CreateInputLayout(ied, 2, VS->GetBufferPointer(),VS->GetBufferSize(),&pLayout); devcon->IASetInputLayout(pLayout); }
|
|
|