Direct3D C语言的例子

  几乎所有的D3D例子都是用COM和C++写的。C语言可以用D3D吗,StackOverflow上给出了答案:directx-programming-in-c

1 hr = IDirect3D9_GetDeviceCaps(d3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &d3dcaps9);
2 hr = IDirect3D9_GetAdapterDisplayMode(d3d, D3DADAPTER_DEFAULT, &d3ddm);
3 hr = IDirect3D9_CreateDevice(d3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, game_window, D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_MULTITHREADED, &d3dpp, &d3d_dev);

  按照这种格式,可以用C语言写出Direct3D的Demo:

  1 #include<d3d9.h>
  2
  3 #pragma comment(lib, "d3d9.lib")
  4
  5 #define WINDOW_CLASS "UGPDX"
  6 #define WINDOW_NAME  "Drawing Lines"
  7
  8 // Function Prototypes...
  9 BOOL InitializeD3D(HWND hWnd, BOOL fullscreen);
 10 BOOL InitializeObjects();
 11 void RenderScene();
 12 void Shutdown();
 13
 14
 15 // Direct3D object and device.
 16 LPDIRECT3D9 g_D3D = NULL;
 17 LPDIRECT3DDEVICE9 g_D3DDevice = NULL;
 18
 19 // Vertex buffer to hold the geometry.
 20 LPDIRECT3DVERTEXBUFFER9 g_VertexBuffer = NULL;
 21
 22
 23 // A structure for our custom vertex type
 24 typedef struct
 25 {
 26     float x, y, z, rhw;
 27     unsigned long color;
 28 }stD3DVertex;
 29
 30 // Our custom FVF, which describes our custom vertex structure.
 31 #define D3DFVF_VERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)
 32
 33
 34 LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
 35 {
 36     switch (msg)
 37     {
 38     case WM_DESTROY:
 39         PostQuitMessage(0);
 40         return 0;
 41         break;
 42
 43     case WM_KEYUP:
 44         if (wp == VK_ESCAPE) PostQuitMessage(0);
 45         break;
 46     }
 47
 48     return DefWindowProc(hWnd, msg, wp, lp);
 49 }
 50
 51
 52 int WINAPI WinMain(HINSTANCE hInst, HINSTANCE prevhInst,
 53     LPSTR cmdLine, int show)
 54 {
 55     // Register the window class
 56     WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc,
 57         0, 0, GetModuleHandle(NULL), NULL, LoadCursor(NULL,IDC_ARROW),
 58         NULL, NULL, WINDOW_CLASS, NULL };
 59     RegisterClassEx(&wc);
 60
 61     // Create the application‘s window
 62     HWND hWnd = CreateWindow(WINDOW_CLASS, WINDOW_NAME,
 63         WS_OVERLAPPEDWINDOW, 100, 100,
 64         640, 480, GetDesktopWindow(), NULL,
 65         wc.hInstance, NULL);
 66
 67     // Initialize Direct3D
 68     if (InitializeD3D(hWnd, FALSE))
 69     {
 70         // Show the window
 71         ShowWindow(hWnd, SW_SHOWDEFAULT);
 72         UpdateWindow(hWnd);
 73
 74         // Enter the message loop
 75         MSG msg;
 76         ZeroMemory(&msg, sizeof(msg));
 77
 78         while (msg.message != WM_QUIT)
 79         {
 80             if (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
 81             {
 82                 TranslateMessage(&msg);
 83                 DispatchMessage(&msg);
 84             }
 85             else
 86                 RenderScene();
 87         }
 88     }
 89
 90     // Release any and all resources.
 91     Shutdown();
 92
 93     // Unregister our window.
 94     UnregisterClass(WINDOW_CLASS, wc.hInstance);
 95     return 0;
 96 }
 97
 98
 99 BOOL InitializeD3D(HWND hWnd, BOOL fullscreen)
100 {
101     D3DDISPLAYMODE displayMode;
102
103     // Create the D3D object.
104     g_D3D = Direct3DCreate9(D3D_SDK_VERSION);
105     if (g_D3D == NULL) return FALSE;
106
107
108     // Get the desktop display mode.
109     if (FAILED(IDirect3D9_GetAdapterDisplayMode(g_D3D,D3DADAPTER_DEFAULT,
110         &displayMode))) return FALSE;
111
112
113     // Set up the structure used to create the D3DDevice
114     D3DPRESENT_PARAMETERS d3dpp;
115     ZeroMemory(&d3dpp, sizeof(d3dpp));
116
117
118     if (fullscreen)
119     {
120         d3dpp.Windowed = FALSE;
121         d3dpp.BackBufferWidth = 640;
122         d3dpp.BackBufferHeight = 480;
123     }
124     else
125         d3dpp.Windowed = TRUE;
126     d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
127     d3dpp.BackBufferFormat = displayMode.Format;
128
129
130     // Create the D3DDevice
131     if (FAILED(IDirect3D9_CreateDevice(g_D3D,D3DADAPTER_DEFAULT,
132         D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING,
133         &d3dpp, &g_D3DDevice))) return FALSE;
134
135
136     // Initialize any objects we will be displaying.
137     if (!InitializeObjects()) return FALSE;
138
139     return TRUE;
140 }
141
142
143 BOOL InitializeObjects()
144 {
145     unsigned long col = D3DCOLOR_XRGB(255, 255, 255);
146
147     // Fill in our structure to draw an object.
148     // x, y, z, rhw, color.
149     stD3DVertex objData[] =
150     {
151         { 420.0f, 150.0f, 0.5f, 1.0f, col, },
152         { 420.0f, 350.0f, 0.5f, 1.0f, col, },
153         { 220.0f, 150.0f, 0.5f, 1.0f, col, },
154         { 220.0f, 350.0f, 0.5f, 1.0f, col, },
155     };
156
157     // Create the vertex buffer.
158     if (FAILED(IDirect3DDevice9_CreateVertexBuffer(g_D3DDevice,sizeof(objData), 0,
159         D3DFVF_VERTEX, D3DPOOL_DEFAULT, &g_VertexBuffer,
160         NULL))) return FALSE;
161
162     // Fill the vertex buffer.
163     void *ptr;
164
165     if (FAILED(IDirect3DVertexBuffer9_Lock(g_VertexBuffer,0, sizeof(objData),
166         (void**)&ptr, 0))) return FALSE;
167
168     memcpy(ptr, objData, sizeof(objData));
169
170
171     IDirect3DVertexBuffer9_Unlock(g_VertexBuffer);
172
173     return TRUE;
174 }
175
176
177 void RenderScene()
178 {
179     // Clear the backbuffer.
180     IDirect3DDevice9_Clear(g_D3DDevice,0, NULL, D3DCLEAR_TARGET,
181         D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
182
183     // Begin the scene.  Start rendering.
184    IDirect3DDevice9_BeginScene(g_D3DDevice);
185
186     // Render object.
187    IDirect3DDevice9_SetStreamSource(g_D3DDevice,0, g_VertexBuffer, 0,
188         sizeof(stD3DVertex));
189    IDirect3DDevice9_SetFVF(g_D3DDevice,D3DFVF_VERTEX);
190    IDirect3DDevice9_DrawPrimitive(g_D3DDevice,D3DPT_LINELIST, 0, 2);
191
192     // End the scene.  Stop rendering.
193    IDirect3DDevice9_EndScene(g_D3DDevice);
194
195     // Display the scene.
196     IDirect3DDevice9_Present(g_D3DDevice,NULL, NULL, NULL, NULL);
197 }
198
199 void Shutdown()
200 {
201     if (g_D3DDevice != NULL) IDirect3DDevice9_Release(g_D3DDevice);
202     if (g_D3D != NULL) IDirect3D9_Release(g_D3D);
203     if (g_VertexBuffer != NULL) IDirect3DVertexBuffer9_Release(g_VertexBuffer);
204
205     g_D3DDevice = NULL;
206     g_D3D = NULL;
207     g_VertexBuffer = NULL;
208 }

  这里只是画了两条平行的线段,作为一个例子:

  

时间: 2024-08-17 19:20:42

Direct3D C语言的例子的相关文章

gRPC的Go语言使用例子

gRPC刚被Google开源, gRPC是啥? 先照抄一段说明: gRPC是一个高性能.通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf(Protocol Buffers)序列化协议开发,且支持众多开发语言.gRPC提供了一种简单的方法来精确地定义服务和为iOS.Android和后台支持服务自动生成可靠性很强的客户端功能库.客户端充分利用高级流和链接功能,从而有助于节省带宽.降低的TCP链接次数.节省CPU使用.和电池寿命. 这段抄

自学SQL语言的例子(使用MySQL实现)

SQL语言作为一种数据库管理的标准语言有着极为广泛的应用场景,菜鸟入门选用的数据库软件是轻量级的免费(这个极为重要)的MySQL,下载链接如下:http://www.mysql.com/downloads/ ,笔者的程序在MySQL可视化界面WorkBench下编写脚本文件并执行,这比在命令行模式下执行更加便捷且直观.安利一本MySQL菜鸟入门的书籍刘少杰和曾少军编著的<MySQL5.5——从零开始学>这本书(资源自寻,为避免侵权这里就不给出链接了,当然也欢迎直接买本纸质书支持作者). 例子:

go语言从例子开始之Example20.错误处理

Go 语言使用一个独立的·明确的返回值来传递错误信息的.这与使用异常的 Java 和 Ruby 以及在 C 语言中经常见到的超重的单返回值/错误值相比,Go 语言的处理方式能清楚的知道哪个函数返回了错误,并能像调用那些没有出错的函数一样调用. package main import "errors" import "fmt" 按照惯例,错误通常是最后一个返回值并且是 error 类型,一个内建的接口. func f1(arg int) (int, error) {

c语言一个例子对比php学习随记

今天开始学写一些简单的C例子,发现很多和PHP不一样的地方,做个笔记. #include <stdio.h> int main(void) { int a,b; printf("请输入整数a"); //这里是用双引号,不能用单引号,PHP类似的地方可以用单引号,这里需注意 scanf("%d",&a); //获取用户输入值存入a printf("请输入整数b"); scanf("%d",&b);//

go语言从例子开始之Example32.打点器

定时器 是当你想要在未来某一刻执行一次时使用的 - 打点器 则是当你想要在固定的时间间隔重复执行准备的.这里是一个打点器的例子,它将定时的执行,直到我们将它停止. Example: package main import "fmt" import "time" func main() { //打点器和定时器的机制有点相似: //一个通道用来发送数据. //这里我们在这个通道上使用内置的 range 来迭代值每隔500ms 发送一次的值. ticker := time

go语言从例子开始之Example39.使用函数自定义排序

有时候我们想使用和集合的自然排序不同的方法对集合进行排序.例如,我们想按照字母的长度而不是首字母顺序对字符串排序.这里是一个 Go 自定义排序的例子. Example: package main import ( "fmt" "sort" ) //为了在 Go 中使用自定义函数进行排序, //我们需要一个对应的类型. //这里我们创建一个为内置 []string 类型的别名的byLength 类型, type byLength []string //我们在类型中实现

R语言小例子---简易的数据分析和画图

目前有10名儿童(男)的年龄和身高的数据(虚构数据),感兴趣的是升高的分布及体重和年龄的关系. 年龄(岁) 体重(kg) 年龄(岁) 体重(kg) 4 95 6 116 4 97 7 120 5 106 7 121 5 108 8 126 6 114 8 125 使用函数c()以向量的形式输入儿童的年龄和身高数据.然后,使用一些内置的函数获得身高的均值和标准差,以及年龄和体重的相关度. > age <- c(4,4,5,5,6,6,7,7,8,8) > height <- c(95

使用L脚本语言实现分布式计算的例子

一种编程语言要让大家接受需要有一个从理解到使用的过程,之前介绍的L脚本语言的设计思想和语法介绍也可能不那么直观, 后续我会编写一些L脚本语言的例子给大家参考 这里我先来写一个分布式计算的例子 其实分布式计算就是将计算任务分解给不同的计算机,由多个计算机实现共同的计算任务 这里,我们需要有一个管理者计算机,多个工作者计算机 管理者将任务分配给工作者,工作者完成计算任务后交给管理者,最后再由管理者将所有计算结果汇总 下面这个例子是L脚本语言编写的工作者,它不断在一个UDP的端口上监听,如果有发过来的

Java语言进阶过程(转)

[以下肯定是不完整的列表,欢迎补充] Java是一个通用的编程语言,其实可以干很多事,怎么学Java就看怎么用了. 但有一些一般的步骤: 1. 熟悉一种文本编辑器,比如Vim, Emacs, Notepad++, TextMate等.知道哪些是开源的,哪些是闭源的,哪些要收费.养成不用盗版软件的习惯. 2. 安装JDK(建议用你的Linux发行版自带的软件包管理器安装openjdk,过程中可能需要读发行版特定的文档) 3. 写一个Java的Hello world程序,并用命令行工具javac编译