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>
    
    //TODO: -1 custom vertex
    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;
    	ZeroMemory(&wcex,sizeof(wcex));
    	wcex.cbSize=sizeof(wcex);
    	wcex.hInstance=GetModuleHandle(NULL);
    	wcex.lpfnWndProc=MsgProc;
    	wcex.lpszClassName=L"Self001";
    	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_LINESTRIP,0,3);
    
    		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[4]=
    	{
    		{50.0f,50.0f,1.0f,1.0f},
    		{50.0f,250.0f,1.0f,1.0f},
    		{250.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;
    	}
    
    	//fill 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;
    }
    

    程序结果

    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    内存泄漏 Memory Leaks 内存优化 MD
    Handler Thread 内部类引起内存泄露分析
    为什么不取消注册BroadcastReceiver会导致内存泄漏
    WebChromeClient 简介 API 案例
    WebViewClient 简介 API 案例
    java.net.URI 简介 文档 API
    android.net.Uri 简介 API
    RV 多样式 MultiType 聊天界面 消息类型 MD
    JS函数声明与定义,作用域,函数声明与表达式的区别
    CSS中table tr:nth-child(even)改变tr背景颜色: IE7,8无效
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4724626.html
Copyright © 2011-2022 走看看