博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[direct-X] direct-X最小框架
阅读量:6352 次
发布时间:2019-06-22

本文共 6839 字,大约阅读时间需要 22 分钟。

 

1 #include
2 3 #pragma comment(lib, "d3d9.lib") 4 #pragma comment(lib, "d3dx9.lib") 5 6 #define WINDOW_CLASS "UGPDX" 7 #define WINDOW_NAME "Blank D3D Window" 8 9 10 // Function Prototypes... 11 bool InitializeD3D(HWND hWnd, bool fullscreen); 12 void RenderScene(); 13 void Shutdown(); 14 15 16 // Direct3D object and device. 17 LPDIRECT3D9 g_D3D = NULL; 18 LPDIRECT3DDEVICE9 g_D3DDevice = NULL; 19 20 //========================================================================================================== 21 LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) 22 { 23 switch(msg) 24 { 25 case WM_DESTROY: 26 PostQuitMessage(0); 27 return 0; 28 break; 29 30 case WM_KEYUP: 31 if(wParam == VK_ESCAPE) PostQuitMessage(0); 32 break; 33 } 34 35 return DefWindowProc(hWnd, msg, wParam, lParam); 36 } 37 //========================================================================================================== 38 int WINAPI WinMain(HINSTANCE hInst, HINSTANCE prevhInst, LPSTR cmdLine, int show) 39 { 40 // Register the window class 41 WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L, 42 GetModuleHandle(NULL), NULL, NULL, NULL, NULL, 43 WINDOW_CLASS, NULL }; 44 RegisterClassEx(&wc); 45 46 // Create the application's window 47 HWND hWnd = CreateWindow(WINDOW_CLASS, WINDOW_NAME, WS_OVERLAPPEDWINDOW, 48 100, 100, 640, 480, GetDesktopWindow(), NULL, 49 wc.hInstance, NULL); 50 51 // Initialize Direct3D 52 if(InitializeD3D(hWnd,false)) 53 { 54 // Show the window 55 ShowWindow(hWnd, SW_SHOWDEFAULT); 56 UpdateWindow(hWnd); 57 58 // Enter the message loop 59 MSG msg; 60 ZeroMemory(&msg, sizeof(msg)); 61 62 while(msg.message != WM_QUIT) 63 { 64 if(PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)) 65 { 66 TranslateMessage(&msg); 67 DispatchMessage(&msg); 68 } 69 else 70 RenderScene(); 71 } 72 } 73 74 // Release any and all resources. 75 Shutdown(); 76 77 // Unregister our window. 78 UnregisterClass(WINDOW_CLASS, wc.hInstance); 79 return 0; 80 } 81 //==================================================================================== 82 //InitializeD3D函数的参数有窗口句柄hWnd,标识窗口是否全屏的标识符fullscreen 83 // (窗口句柄是在调用CreateWindows()函数创建窗口句柄时,返回给WinMain()函数的数值) 84 //1、Direct3DCreat9()函数将创建一个Direct3D接口对象,并返回该对象 85 //2、GetAdapterDisplayMode()将返回当前的显示信息,分辨率、显示格式、显示器的刷新频率等。该函数的参数包括正在查询的适配器以及保存信息的显示模式对象。将D3DADAPTER_DEFAULT发送给函数,详细说明代码,通过这些代码可以获取想要的主显卡信息。 86 // (D3DPRESENT_PARAMETERS结构用于定义Direct3D窗口的显示信息。这样可以设置正在创建窗口的期望宽度和高度,刷新率,显示模式为全屏或窗口,后天缓存数目等) 87 //3、CreateDevice()主要负责创建Direct3D设备对象,该对象用于向屏幕渲染图形 88 // (CreateDevice()函数中的1\Adapter。该参数用于指定正在使用的显卡。 89 // 2\DeviceType是一个标识符,用于指定Direct3D中的渲染方式。该参数的参数值可以是采用硬件渲染的D3DDEVTYPE_HAL、采用软件渲染的D3DDEVTYPE_REF、不需要软硬件支持的D3DDEVTYPE_NULLREF,或是采用要进行渲染工作的可插拔软件的D3DDEVTYPE_SW。软件渲染标识符允许运行Direct3D程序,它可以使用硬件不支持的特性。软件渲染存在的问题是渲染速度慢,尤其是在开发游戏时。 90 // 3\hFocusWindow是一个窗口句柄 91 // 4\BehaviorFlags是标识符组合,用于指定设备的运行方式 92 // 5\pPresentationParameter是一个指针,它指向该函数前面创建的D3DPRESENT_PARAMTERS结构 93 // 6\ppReturnedDeviceInterface是一个指针,它指向新创建的Direct3D设备对象。如果该对象为NULL(空),或是函数返回除D3D_OK以外的值,那么Direct3D设备的创建失败。 94 //一旦完成Direct3D的设置和创建,就可以随意渲染屏幕。初始化阶段的CreateDevice()函数中创建的设备对象可以完成Direct3D中的渲染工作。渲染屏幕开始先要清屏为指定的颜色,告知Direct3D将要开始绘制新场景,渲染想要渲染的物体,完成屏幕渲染,在屏幕上显示渲染结果。 95 //==================================================================================== 96 bool InitializeD3D(HWND hWnd, bool fullscreen) 97 { 98 D3DDISPLAYMODE displayMode; 99 100 // Create the D3D object.101 102 g_D3D = Direct3DCreate9(D3D_SDK_VERSION);103 if(g_D3D == NULL) return false;104 105 // Get the desktop display mode.106 if(FAILED(g_D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &displayMode)))//107 return false;108 109 // Set up the structure used to create the D3DDevice110 D3DPRESENT_PARAMETERS d3dpp;//定义一个结构体用于定义Direct3D窗口的显示信息(具体见定义处)111 ZeroMemory(&d3dpp, sizeof(d3dpp));112 113 if(fullscreen)114 {115 d3dpp.Windowed = FALSE;//标识符用于指定创建的窗口是否是全屏窗口。116 d3dpp.BackBufferWidth = 640;//窗口宽117 d3dpp.BackBufferHeight = 480;118 }119 else120 d3dpp.Windowed = TRUE;121 d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;//成员变量MultiSampleType、MultiSampleQuality和SwapEffect处理交换效果122 d3dpp.BackBufferFormat = displayMode.Format;123 124 // Create the D3DDevice125 if(FAILED(g_D3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,126 D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_D3DDevice)))127 {128 return false;129 }130 131 return true;132 }133 //==========================================================================================================134 //Clear()函数的参数包括:135 // 1\要清除的矩形数目(0代表清除整个屏幕)136 // 2\定义想要清除的屏幕区域矩形链表(NULL代表整个屏幕)137 // 3\标识要清除内容的标识符4\清除后的颜色5\要设定的深度值6\设定模板缓存值138 // 对标识符参数而言,D3DCLEAR_DEFAULT清除所有的渲染目标,D3DCLEAR_STENCIL清除模板缓存,而D3DCLEAR_ZBUFFER清除深度缓存139 //一旦完成清除工作,渲染函数将调用设备对象的BeginScene()函数,在Direct3D中启动一个新场景。140 //在Direct3D中渲染任何图形前,都必须先调用BeginScene()函数。一旦渲染完要渲染的物体,就调用设备对象的EndScene()函数结束渲染。141 // 记住:每个BeginScene()函数必须有一个与之对应的EndScene()函数。142 //调用设备对象的Present()函数可以完成显示。就目前的学习而言,Present()函数的参数可以全部设为NULL(空)。143 // 第一个参数是正在显示的原始矩形,如果不使用交换链,那么该值必须为NULL(空)。144 // 第二个参数是一个指针,它指向要渲染的最终矩形。145 // 第三个参数是正在显示的窗口的窗口句柄。另外,由于没有用到交换链,所以对正在使用的窗口句柄而言,该值设为NULL(空)。这个正在使用的窗口句柄是在Direct3D初始化过程中为D3DPRESENT_PARAMETERS对象设置的窗口句柄。146 // 最后一个参数是缓存区域,它代表需要更新的最小区域。同样,该参数涉及到交换链,也可以设为NULL(空)。147 //==========================================================================================================148 void RenderScene()149 {150 // Clear the backbuffer.151 g_D3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(100,0,0), 1.0f, 0);152 153 // Begin the scene. Start rendering.154 g_D3DDevice->BeginScene();155 156 // End the scene. Stop rendering.157 g_D3DDevice->EndScene();158 159 // Display the scene.160 g_D3DDevice->Present(NULL, NULL, NULL, NULL);161 }162 163 //==========================================================================================================164 void Shutdown()165 {166 if(g_D3DDevice != NULL) g_D3DDevice->Release();167 if(g_D3D != NULL) g_D3D->Release();168 }169 //==========================================================================================================

 

转载地址:http://yalla.baihongyu.com/

你可能感兴趣的文章
php升级到5.4
查看>>
”由于没有远程桌面授权服务器可以提供许可证,远程会话被中断“的解决方案...
查看>>
freebsd静态路由
查看>>
Oracle技术之ufsdump与ufsrestore(一)
查看>>
JSON 的一些知识
查看>>
zabbix监控windows
查看>>
记录工作与学习的点滴
查看>>
一个perl写的判断ip归属地
查看>>
QEMU Networking
查看>>
我的友情链接
查看>>
docker新建自定义网桥,实现不同主机容器互联
查看>>
在SQL Server中使用SQL语句查询一个存储过程被其它所有的存储过程引用的存储过程名...
查看>>
windows 2003建立RAID-0 , RAID0-1, RAID-5 卷。(vmware环境)
查看>>
向大家推荐一个非常好用的JS日历控件My97DatePicker
查看>>
我的友情链接
查看>>
第三章:javascript: 列表
查看>>
红帽中出现”This system is not registered with RHN”的解决方案
查看>>
Apache Shiro学习笔记(九)Spring集成
查看>>
开始学习hadoop
查看>>
遮罩的CSS样式
查看>>