• 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_LINELIST,0,2);
    
    		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;
    }
    

    程序结果

    选择图元小心别误选。

  • 相关阅读:
    JavaScript 知识
    Sleep,Hibernate and Hybrid
    CentOS 7 休眠系统
    centos7如何添加开机启动服务/脚本
    linux下执行.sh文件的方法和语法
    systemctl命令
    linux 更新yum源 改成阿里云源
    Supervisor进程管理&开机自启
    Django中的Request和Response
    ORACLE 触发器
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/7027745.html
Copyright © 2020-2023  润新知