zoukankan      html  css  js  c++  java
  • D3D 练习小框架

    自己练习D3D 程序搭的小框架,记录在这里,将来看到好回顾自己独自摸索的苦逼样子。

    #pragma once
    
    #pragma comment(lib,"d3d9.lib")
    #pragma comment(lib,"d3dx9.lib")
    
    #include<d3d9.h>
    #include<d3dx9.h>
    
    struct CUSTOMVERTEX
    {
    	float x;
    	float y;
    	float z;
    	float rhw;
    };
    
    #define D3DFVF_CUSTOMVERTEX D3DFVF_XYZRHW
    
    HRESULT InitD3D(HWND hWnd);
    void CleanUp();
    void Render();
    LRESULT CALLBACK MsgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam);
    HRESULT InitD3DVertexBuffer();
    
    //TODO: 0 declare d3d variables.
    LPDIRECT3D9 g_pd3d=NULL;
    LPDIRECT3DDEVICE9 g_pd3dDevice9=NULL;
    LPDIRECT3DVERTEXBUFFER9 g_pd3dVB=NULL;
    
    //application entry point.
    INT WINAPI wWinMain(
    	HINSTANCE,
    	HINSTANCE,
    	LPWSTR,
    	INT)
    {
    	//initialize wnd class.
    	WNDCLASSEX wcex;
    	wcex.cbClsExtra=0;
    	wcex.cbSize=sizeof(wcex);
    	wcex.cbWndExtra=0;
    	wcex.hbrBackground=NULL;
    	wcex.hCursor=NULL;
    	wcex.hIcon=NULL;
    	wcex.hIconSm=NULL;
    	wcex.hInstance=GetModuleHandle(NULL);
    	wcex.lpfnWndProc=MsgProc;
    	wcex.lpszClassName=L"Self001";
    	wcex.lpszMenuName=NULL;
    	wcex.style=CS_CLASSDC;
    
    	//register wnd class.
    	RegisterClassEx(&wcex);
    
    	//create window.
    	HWND hWnd=CreateWindowEx(
    		WS_EX_OVERLAPPEDWINDOW,
    		L"Self001",
    		L"Self001 Window",
    		WS_OVERLAPPEDWINDOW,
    		100,
    		100,
    		300,
    		300,
    		NULL,
    		NULL,
    		wcex.hInstance,
    		NULL);
    
    	//init d3d
    	if(SUCCEEDED(InitD3D(hWnd)))
    	{
    		//show window.
    		ShowWindow(hWnd,SW_SHOWDEFAULT);
    		UpdateWindow(hWnd);
    
    		//message loop.
    		MSG msg;
    		ZeroMemory(&msg,sizeof(msg));
    		while(msg.message != WM_QUIT)
    		{
    			if(PeekMessage(&msg,hWnd,0,0,PM_REMOVE))
    			{
    				TranslateMessage(&msg);
    				DispatchMessage(&msg);
    			}
    			else
    			{
    				Render();
    			}
    		}
    	}
    
    	//unregister wnd class.
    	UnregisterClass(L"Self001",wcex.hInstance);
    
    	return 0;
    }
    
    //init d3d.
    HRESULT InitD3D(HWND hWnd)
    {
    	//create d3d.
    	g_pd3d=Direct3DCreate9(D3D_SDK_VERSION);
    	if(g_pd3d == NULL)
    	{
    		return E_FAIL;
    	}
    
    	//initialize d3d present parameters.
    	D3DPRESENT_PARAMETERS d3dpp;
    	ZeroMemory(&d3dpp,sizeof(d3dpp));
    	d3dpp.Windowed=TRUE;
    	d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
    	d3dpp.BackBufferFormat=D3DFMT_UNKNOWN;
    
    	//create d3d device.
    	if(FAILED(g_pd3d->CreateDevice(
    		D3DADAPTER_DEFAULT,
    		D3DDEVTYPE_HAL,
    		hWnd,
    		D3DCREATE_SOFTWARE_VERTEXPROCESSING,
    		&d3dpp,
    		&g_pd3dDevice9)))
    	{
    		return E_FAIL;
    	}
    
    	//init vertex buffer.
    	if(FAILED(InitD3DVertexBuffer()))
    	{
    		return E_FAIL;
    	}
    
    	return S_OK;
    }
    
    //clean up d3d.
    void CleanUp()
    {
    	//TODO: 3 clean up d3d.
    	if(g_pd3dVB != NULL)
    	{
    		g_pd3dVB->Release();
    	}
    
    	//release device.
    	if(g_pd3dDevice9 != NULL)
    	{
    		g_pd3dDevice9->Release();
    	}
    
    	//release d3d.
    	if(g_pd3d != NULL)
    	{
    		g_pd3d->Release();
    	}
    }
    
    //render the scene.
    void Render()
    {
    	//clear target.
    	g_pd3dDevice9->Clear(
    		0,
    		NULL,
    		D3DCLEAR_TARGET,
    		D3DCOLOR_XRGB(0,0,0),
    		1.0f,
    		0);
    
    	//draw primitive.
    	if(SUCCEEDED(g_pd3dDevice9->BeginScene()))
    	{
    		//TODO: 2 render d3d.
    		g_pd3dDevice9->SetStreamSource(0,g_pd3dVB,0,sizeof(CUSTOMVERTEX));
    		g_pd3dDevice9->SetFVF(D3DFVF_CUSTOMVERTEX);
    		g_pd3dDevice9->DrawPrimitive(D3DPT_TRIANGLELIST,0,1);
    
    		g_pd3dDevice9->EndScene();
    	}
    
    	//present sence.
    	g_pd3dDevice9->Present(NULL,NULL,NULL,NULL);
    }
    
    //window message handler.
    LRESULT CALLBACK MsgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
    {
    	switch(msg)
    	{
    	case WM_DESTROY:
    		CleanUp();
    		return 0L;
    	}
    
    	return DefWindowProc(hWnd,msg,wParam,lParam);
    }
    
    //init d3d vertex buffer.
    HRESULT InitD3DVertexBuffer()
    {
    	//TODO: 1 init vertex buffer data.
    	//create vertex data.
    	CUSTOMVERTEX vertices[3]=
    	{
    		{50.0f,250.0f,1.0f,1.0f},
    		{150.0f,50.0f,1.0f,1.0f},
    		{250.0f,250.0f,1.0f,1.0f}
    	};
    
    	//create vertex buffer.
    	if(FAILED(g_pd3dDevice9->CreateVertexBuffer(
    		sizeof(vertices),
    		0,
    		D3DFVF_CUSTOMVERTEX,
    		D3DPOOL_DEFAULT,
    		&g_pd3dVB,
    		NULL)))
    	{
    		return E_FAIL;
    	}
    
    	//file vertex buffer.
    	void* pVertices=NULL;
    	if(FAILED(g_pd3dVB->Lock(0,sizeof(vertices),&pVertices,0)))
    	{
    		return E_FAIL;
    	}
    
    	memcpy(pVertices,vertices,sizeof(vertices));
    
    	g_pd3dVB->Unlock();
    
    	return S_OK;
    }
    


     

    1.配置好d3d sdk 路径。

    2.打开任务栏,调到凝视,開始练习。

  • 相关阅读:
    吴恩达《深度学习》第一门课(3)浅层神经网络
    吴恩达《深度学习》第一门课(2)神经网络的编程基础
    吴恩达《深度学习》第一门课(1)深度学习引言
    吴恩达《机器学习》课程总结(19)总结
    吴恩达《机器学习》课程总结(17)大规模机器学习
    吴恩达《机器学习》课程总结(16)推荐系统
    吴恩达《机器学习》课程总结(15)异常检测
    吴恩达《机器学习》课程总结(18)应用实例:图片文字识别
    吴恩达《机器学习》课程总结(14)降维
    吴恩达《机器学习》课程总结(13)聚类
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4287721.html
Copyright © 2011-2022 走看看