#include "BasicDraw.h"
int main( )
{
HRESULT hr=S_OK;
BasicDraw basicApp;
hr=basicApp.Run();
return hr;
}
BasicDraw::BasicDraw()
{
InitializeApp();
}
void BasicDraw::InitializeApp()
{
m_pRTV=NULL;
m_pDevice=NULL;
m_pContext=NULL;
m_pSwapChain=NULL;
m_pDepthStencil=NULL;
m_pDepthStencilView=NULL;
m_pVertexShaderPos=NULL;
m_pPixelShaderPosCol=NULL;
m_pVertexShaderPosCol=NULL;
m_pPixelShaderPosCol=NULL;
m_pInputLayoutPosCol=NULL;
m_pInputLayoutPos=NULL;
m_pRS=NULL;
m_pCBuffer=NULL;
}
BasicDraw::~BasicDraw()
{
CleanUp();
}
void BasicDraw::CleanUp()
{
SAFE_RELEASE(m_pDevice);
SAFE_RELEASE(m_pContext);
SAFE_RELEASE(m_pSwapChain);
SAFE_RELEASE(m_pRTV);
SAFE_RELEASE(m_pDepthStencil);
SAFE_RELEASE(m_pDepthStencilView);
SAFE_RELEASE(m_pRS);
SAFE_RELEASE(m_pVertexShaderPos);
SAFE_RELEASE(m_pPixelShaderPosCol);
SAFE_RELEASE(m_pVertexShaderPosCol);
SAFE_RELEASE(m_pPixelShaderPosCol);
SAFE_RELEASE(m_pInputLayoutPosCol);
SAFE_RELEASE(m_pInputLayoutPos);
SAFE_RELEASE(m_pCBuffer);
}
HRESULT BasicDraw::Run()
{
HRESULT hr=S_OK;
IFR(Setup());
IFR(MessageLoop());
return hr;
}
HRESULT BasicDraw::Setup()
{
HRESULT hr=S_OK;
IFR(CreateDisplayWindow());
IFR(CreateDevice());
IFR(CreateAppResource());
return hr;
}
HRESULT BasicDraw::CreateDisplayWindow()
{
HRESULT hr=S_OK;
WNDCLASSEX wcex;
wcex.cbSize=sizeof(WNDCLASSEX);
wcex.style=CS_HREDRAW|CS_VREDRAW;
wcex.lpfnWndProc=MyWndProc;
wcex.cbClsExtra=0;
wcex.cbWndExtra=sizeof(LONG_PTR);
wcex.hInstance=NULL;
wcex.hIcon=NULL;
wcex.hCursor=LoadCursor(NULL,IDC_ARROW);
wcex.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName=NULL;
wcex.lpszClassName=L"BasicDraw";
wcex.hIconSm=NULL;
IFR(RegisterClassEx(&wcex)?S_OK:E_FAIL);
RECT rc;
SetRect(&rc,0,0,800,600);
AdjustWindowRect(&rc,WS_OVERLAPPEDWINDOW&~WS_THICKFRAME&~WS_MAXIMIZEBOX,false);
m_hWnd=CreateWindow(
L"BasicDraw",
L"BasicDraw",
WS_OVERLAPPEDWINDOW&~WS_THICKFRAME&~WS_MAXIMIZEBOX,
CW_USEDEFAULT,
CW_USEDEFAULT,
rc.right-rc.left,
rc.bottom-rc.top,
NULL,
NULL,
NULL,
this);
IFR(m_hWnd?S_OK:E_FAIL);
ShowWindow(m_hWnd,SW_NORMAL);
UpdateWindow(m_hWnd);
printf("Successfully create the window.\n");
return hr;
}
HRESULT BasicDraw::CreateDevice()
{
HRESULT hr=S_OK;
RECT rc;
GetClientRect(m_hWnd,&rc);
UINT width=rc.right-rc.left;
UINT height=rc.bottom-rc.top;
UINT createDeviceFlags=D3D11_CREATE_DEVICE_SINGLETHREADED;
#if defined(_DEBUG)||defined(DEBUG)
createDeviceFlags|=D3D11_CREATE_DEVICE_DEBUG;
#endif
D3D_DRIVER_TYPE driverTypes=D3D_DRIVER_TYPE_HARDWARE;
D3D_FEATURE_LEVEL featureLevels[]={
D3D_FEATURE_LEVEL_11_0,
D3D_FEATURE_LEVEL_10_1,
D3D_FEATURE_LEVEL_10_0,};
UINT numFeatureLevels = ARRAYSIZE(featureLevels);
D3D_FEATURE_LEVEL featureLevelOut=D3D_FEATURE_LEVEL_11_0;
DXGI_SWAP_CHAIN_DESC scDesc;
ZeroMemory(&scDesc,sizeof(DXGI_SWAP_CHAIN_DESC));
scDesc.BufferCount=1;
scDesc.BufferDesc.Height=height;
scDesc.BufferDesc.Width=width;
scDesc.BufferDesc.Format=DXGI_FORMAT_R8G8B8A8_UNORM;
scDesc.BufferDesc.RefreshRate.Numerator=60;
scDesc.BufferDesc.RefreshRate.Denominator=1;
scDesc.BufferUsage=DXGI_USAGE_RENDER_TARGET_OUTPUT;
scDesc.OutputWindow=m_hWnd;
scDesc.SampleDesc.Count=1;
scDesc.SampleDesc.Quality=0;
scDesc.Windowed=TRUE;
IFR(D3D11CreateDeviceAndSwapChain(NULL,driverTypes,NULL,createDeviceFlags,
featureLevels,numFeatureLevels,D3D11_SDK_VERSION,&scDesc,&m_pSwapChain,&m_pDevice,
&featureLevelOut,&m_pContext));
//create renderTargetView
ID3D11Texture2D* pBackBuffer=NULL;
IFR(m_pSwapChain->GetBuffer(0,__uuidof(ID3D11Texture2D),(void**)&pBackBuffer));
IFR(m_pDevice->CreateRenderTargetView(pBackBuffer,NULL,&m_pRTV));
SAFE_RELEASE(pBackBuffer);
//create depth stencil buffer.
D3D11_TEXTURE2D_DESC depthDesc;
ZeroMemory(&depthDesc,sizeof(D3D11_TEXTURE2D_DESC));
depthDesc.ArraySize=1;
depthDesc.BindFlags=D3D11_BIND_DEPTH_STENCIL;
depthDesc.CPUAccessFlags=0;
depthDesc.Format=DXGI_FORMAT_D24_UNORM_S8_UINT;
depthDesc.Height=height;
depthDesc.Width=width;
depthDesc.MipLevels=1;
depthDesc.MiscFlags=0;
depthDesc.SampleDesc.Count=1;
depthDesc.SampleDesc.Quality=0;
depthDesc.Usage=D3D11_USAGE_DEFAULT;
IFR(m_pDevice->CreateTexture2D(&depthDesc,NULL,&m_pDepthStencil));
//create the depth stencil buffer view.
D3D11_DEPTH_STENCIL_VIEW_DESC dsViewDesc;
ZeroMemory(&dsViewDesc,sizeof(D3D11_DEPTH_STENCIL_VIEW_DESC));
dsViewDesc.Format=depthDesc.Format;
dsViewDesc.ViewDimension=D3D11_DSV_DIMENSION_TEXTURE2D;
dsViewDesc.Texture2D.MipSlice=0;
IFR(m_pDevice->CreateDepthStencilView(m_pDepthStencil,&dsViewDesc,&m_pDepthStencilView));
//set the render target view and depth stencil view.
m_pContext->OMSetRenderTargets(1,&m_pRTV,m_pDepthStencilView);
//Create the rasterizer state
D3D11_RASTERIZER_DESC rsDesc;
ZeroMemory(&rsDesc,sizeof(rsDesc));
rsDesc.FillMode=D3D11_FILL_WIREFRAME;
rsDesc.CullMode=D3D11_CULL_NONE;
m_pDevice->CreateRasterizerState(&rsDesc,&m_pRS);
printf("Successfully create the Device.\n");
return hr;
}
HRESULT BasicDraw::CompileShaderFromFile(WCHAR* szFileName,LPCSTR szEntryPoint,LPCSTR szShaderModel, ID3DBlob** ppBlobOut,const D3D_SHADER_MACRO* pDefines)
{
HRESULT hr=S_OK;
ID3DBlob* pErrorBlob=NULL;
DWORD dwShaderFlags=D3DCOMPILE_ENABLE_STRICTNESS;
hr=D3DX11CompileFromFile(szFileName,pDefines,NULL,szEntryPoint,szShaderModel,dwShaderFlags,NULL,NULL,ppBlobOut,&pErrorBlob,NULL);
if(FAILED(hr))
{
printf((char*)pErrorBlob->GetBufferPointer());
}
SAFE_RELEASE(pErrorBlob);
return hr;
}
HRESULT BasicDraw::CreateConstantBuffer(UINT uSize,ID3D11Buffer** ppBuffer)
{
HRESULT hr=S_OK;
D3D11_BUFFER_DESC bd;
ZeroMemory(&bd,sizeof(bd));
bd.BindFlags=D3D11_BIND_CONSTANT_BUFFER;
bd.ByteWidth=uSize;
bd.CPUAccessFlags=0;
bd.Usage=D3D11_USAGE_DEFAULT;
IFR(m_pDevice->CreateBuffer(&bd,NULL,ppBuffer));
return hr;
}
//create vertexshader£¬inputlayout£¬pixelshader£¬vertex buffer index buffer
HRESULT BasicDraw::CreateAppResource()
{
HRESULT hr=S_OK;
RECT rc;
GetClientRect(m_hWnd,&rc);
UINT width=rc.right-rc.left;
UINT height=rc.bottom-rc.top;
//2 Create viewport
D3D11_VIEWPORT vp;
vp.Width=width;
vp.Height=height;
vp.MaxDepth=1.0f;
vp.MinDepth=0.0f;
vp.TopLeftX=0;
vp.TopLeftY=0;
m_pContext->RSSetViewports(1,&vp);
// VertexShader PosCol
ID3DBlob* pBlob=NULL;
IFR(CompileShaderFromFile(L"basicEffect.hlsl","VSPosCol","vs_4_0",&pBlob));
IFR(m_pDevice->CreateVertexShader(pBlob->GetBufferPointer(),pBlob->GetBufferSize(),NULL,&m_pVertexShaderPosCol));
// create InputLayoutPosCol
D3D11_INPUT_ELEMENT_DESC inputLayoutPosCol[]=
{
{"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},
};
UINT numElement=ARRAYSIZE(inputLayoutPosCol);
IFR(m_pDevice->CreateInputLayout(inputLayoutPosCol,numElement,pBlob->GetBufferPointer(),pBlob->GetBufferSize(),&m_pInputLayoutPosCol));
pBlob->Release();
// Create PixelShaderPosCol
IFR(CompileShaderFromFile(L"basicEffect.hlsl","PSPosCol","ps_4_0",&pBlob));
IFR(m_pDevice->CreatePixelShader(pBlob->GetBufferPointer(),pBlob->GetBufferSize(),NULL,&m_pPixelShaderPosCol));
pBlob->Release();
//// VertexShader Pos
//IFR(CompileShaderFromFile(L"basicEffect.hlsl","VSPos","vs_4_0",&pBlob));
//IFR(m_pDevice->CreateVertexShader(pBlob->GetBufferPointer(),pBlob->GetBufferSize(),NULL,&m_pVertexShaderPos));
////Create InputLayout Pos
//D3D11_INPUT_ELEMENT_DESC inputLayoutPos[]=
//{
// {"POSITION",0,DXGI_FORMAT_R32G32B32_FLOAT,0,0,D3D11_INPUT_PER_VERTEX_DATA,0},
//};
////Create InputLayoutPosCol
//numElement=ARRAYSIZE(
Directx11绘制立方体
4星 · 超过85%的资源 需积分: 31 70 浏览量
2011-12-20
21:02:42
上传
评论
收藏 5.46MB ZIP 举报
batilei
- 粉丝: 71
- 资源: 7
最新资源
- Screenshot_20240427_031602.jpg
- 网页PDF_2024年04月26日 23-46-14_QQ浏览器网页保存_QQ浏览器转格式(6).docx
- 直接插入排序,冒泡排序,直接选择排序.zip
- 在排序2的基础上,再次对快排进行优化,其次增加快排非递归,归并排序,归并排序非递归版.zip
- 实现了7种排序算法.三种复杂度排序.三种nlogn复杂度排序(堆排序,归并排序,快速排序)一种线性复杂度的排序.zip
- 冒泡排序 直接选择排序 直接插入排序 随机快速排序 归并排序 堆排序.zip
- 课设-内部排序算法比较 包括冒泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、归并排序和堆排序.zip
- Python排序算法.zip
- C语言实现直接插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序、归并排序、计数排序,并带图详解.zip
- 常用工具集参考用于图像等数据处理
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈