directx surface

SDL2是跨平台的图形库,在windows上使用的是directx的surface来实现的,surface可以用来开发视频播放之类的。

贴代码.

  1 #include <windows.h>
  2 #include <d3d9.h>
  3
  4 #pragma comment(lib, "d3d9.lib")
  5
  6
  7 /*常量定义*/
  8 #define WINDOW_WIDTH      640         //窗口尺寸
  9 #define WINDOW_HEIGHT     480
 10
 11
 12 /*变量定义*/
 13 HWND                m_hwnd;
 14
 15 IDirect3DDevice9*    m_device;        //d3d设备
 16 IDirect3DSurface9*    m_surface;        //directx表面
 17 D3DSURFACE_DESC        m_surfacedesc;    //表面描述
 18
 19 LRESULT CALLBACK sWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 20 {
 21     switch (msg)
 22     {
 23     case WM_PAINT:
 24         //draw();
 25         break;
 26     case WM_KEYDOWN:
 27         switch (wParam)
 28         {
 29         case VK_ESCAPE:
 30             SendMessage(hwnd, WM_CLOSE, 0, 0);
 31             break;
 32         }
 33         break;
 34     case WM_DESTROY:
 35
 36         PostQuitMessage(0);
 37         break;
 38     }
 39     return DefWindowProc(hwnd, msg, wParam, lParam);
 40 }
 41
 42 void draw()
 43 {
 44     //渲染到离屏表面
 45     //取得指向内存区的指针
 46     D3DLOCKED_RECT lockedRect;
 47     m_surface->LockRect(&lockedRect, 0, 0);
 48
 49     DWORD* imageData = (DWORD*)lockedRect.pBits;
 50
 51     for (UINT i = 0; i < m_surfacedesc.Height; i++)
 52     {
 53         for (UINT j = 0; j < m_surfacedesc.Width; j++)
 54         {
 55             UINT index = i * lockedRect.Pitch / 4 + j;
 56             imageData[index] = 0xffffff00;
 57         }
 58     }
 59
 60     m_surface->UnlockRect();
 61
 62
 63     //渲染
 64     m_device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xffffffff, 1.0f, 0);
 65     m_device->BeginScene();
 66
 67     IDirect3DSurface9 * pBackBuffer = NULL;
 68
 69     m_device->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &pBackBuffer);
 70     m_device->StretchRect(m_surface, NULL, pBackBuffer, NULL, D3DTEXF_LINEAR);
 71
 72     m_device->EndScene();
 73     m_device->Present(0, 0, 0, 0);
 74
 75     pBackBuffer->Release();
 76 }
 77
 78 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
 79 {
 80     WNDCLASSEX winClass;
 81
 82     winClass.lpszClassName = "DirectSurface";
 83     winClass.cbSize = sizeof(WNDCLASSEX);
 84     winClass.style = CS_HREDRAW | CS_VREDRAW;
 85     winClass.lpfnWndProc = sWndProc;
 86     winClass.hInstance = hInstance;
 87     winClass.hIcon = NULL;
 88     winClass.hIconSm = NULL;
 89     winClass.hCursor = LoadCursor(NULL, IDC_ARROW);
 90     winClass.hbrBackground = NULL;
 91     winClass.lpszMenuName = NULL;
 92     winClass.cbClsExtra = 0;
 93     winClass.cbWndExtra = 0;
 94
 95     if (!RegisterClassEx(&winClass))
 96     {
 97         MessageBox(NULL, TEXT("This program requires Windows NT!"), "error", MB_ICONERROR);
 98         return 1;
 99     }
100
101     m_hwnd = CreateWindowEx(NULL,
102         "DirectSurface",                    // window class name
103         "Draw Surface",            // window caption
104         WS_OVERLAPPEDWINDOW,         // window style
105         CW_USEDEFAULT,                // initial x position
106         CW_USEDEFAULT,                // initial y position
107         WINDOW_WIDTH,                        // initial x size
108         WINDOW_HEIGHT,                        // initial y size
109         NULL,                        // parent window handle
110         NULL,                        // window menu handle
111         hInstance,                    // program instance handle
112         NULL);                        // creation parameters
113
114     //初始化directx
115     D3DDEVTYPE deviceType = D3DDEVTYPE_HAL;
116
117     HRESULT hr = 0;
118
119     // Step 1: Create the IDirect3D9 object.
120
121     IDirect3D9* d3d9 = 0;
122     d3d9 = Direct3DCreate9(D3D_SDK_VERSION);
123
124     if (!d3d9)
125     {
126         ::MessageBox(0, "Direct3DCreate9() - FAILED", 0, 0);
127         return 0;
128     }
129
130     // Step 2: Check for hardware vp.
131
132     D3DCAPS9 caps;
133     d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT, deviceType, &caps);
134
135     int vp = 0;
136     if (caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
137         vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
138     else
139         vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
140
141     // Step 3: Fill out the D3DPRESENT_PARAMETERS structure.
142
143     D3DPRESENT_PARAMETERS d3dpp;
144     d3dpp.BackBufferWidth = WINDOW_WIDTH;
145     d3dpp.BackBufferHeight = WINDOW_HEIGHT;
146     d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
147     d3dpp.BackBufferCount = 1;
148     d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
149     d3dpp.MultiSampleQuality = 0;
150     d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
151     d3dpp.hDeviceWindow = m_hwnd;
152     d3dpp.Windowed = true;
153     d3dpp.EnableAutoDepthStencil = true;
154     d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;
155     d3dpp.Flags = 0;
156     d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
157     d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
158
159     // Step 4: Create the device.
160
161     hr = d3d9->CreateDevice(
162         D3DADAPTER_DEFAULT, // primary adapter
163         deviceType,         // device type
164         m_hwnd,               // window associated with device
165         vp,                 // vertex processing
166         &d3dpp,             // present parameters
167         &m_device);            // return created device
168
169     if (FAILED(hr))
170     {
171         // try again using a 16-bit depth buffer
172         d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
173
174         hr = d3d9->CreateDevice(
175             D3DADAPTER_DEFAULT,
176             deviceType,
177             m_hwnd,
178             vp,
179             &d3dpp,
180             &m_device);
181
182         if (FAILED(hr))
183         {
184             d3d9->Release(); // done with d3d9 object
185             ::MessageBox(0, "CreateDevice() - FAILED", 0, 0);
186             return 0;
187         }
188     }
189
190     d3d9->Release(); // done with d3d9 object
191
192     m_device->CreateOffscreenPlainSurface(WINDOW_WIDTH, WINDOW_HEIGHT, D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &m_surface, NULL);
193     m_surface->GetDesc(&m_surfacedesc);
194
195
196     ShowWindow(m_hwnd, SW_SHOW);
197     UpdateWindow(m_hwnd);
198
199     MSG    msg;
200     ZeroMemory(&msg, sizeof(msg));
201
202     while (TRUE)
203     {
204         if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
205         {
206
207             if (msg.message == WM_QUIT)
208                 break;
209
210             // translate any accelerator keys
211             TranslateMessage(&msg);
212
213             // send the message to the window proc
214             DispatchMessage(&msg);
215         } // end while
216
217         draw();
218     }
219
220     //释放资源
221     m_device->Release();
222     if (m_surface)
223         m_surface->Release();
224
225     return 0;
226 }
时间: 2024-11-10 15:24:06

directx surface的相关文章

最简单的视音频播放示例3:Direct3D播放YUV,RGB(通过Surface)

上一篇文章记录了GDI播放视频的技术.打算接下来写两篇文章记录Direct3D(简称D3D)播放视频的技术.Direct3D应该Windows下最常用的播放视频的技术.实际上视频播放只是Direct3D的"副业",它主要用于3D游戏制作.当前主流的游戏几乎都是使用Direct3D制作的,例如<地下城与勇士>,<穿越火线>,<英雄联盟>,<魔兽世界>,<QQ飞车>等等.使用Direct3D可以用两种方式渲染视频:Surface和

【学习笔记】DirectX应用程序如何初始化

一.使用Windows API创建一个窗口 二.创建一个Swap Chain(交换链) 这一步需要用到一个名为DXGI_SWAP_CHAIN_DESC的结构体,其详细定义如下: typedef struct DXGI_SWAP_CHAIN_DESC { DXGI_MODE_DESC BufferDesc; DXGI_SAMPLE_DESC SampleDesc; DXGI_USAGE BufferUsage; UINT BufferCount; HWND OutputWindow; BOOL W

DirectX中文手册

目  录 第一章 DirectX基础(初级篇) 第一节  什么是DirectX 一.什么是DirectX ? 二.DirectX的组成部分 三.关于DirectDraw 四.为什么要使用DirectDraw? 五.DirectX5.0的新特性? 六.什么是部件对象模型(COM) 七.自我检测 第二节  如何安装和使用DirectX 一.编译库和运行库 二.安装 VC++ 5.0 三.安装 DirectX5.0 的 SDK 四.DirectX 5.0 的文件说明 五.卸载 DirectX 第三节 

Unity Shader——Writing Surface Shaders(0)

从今天起,开始翻译Unity关于shader的官方文档.翻译水平比较一般,目的主要是通过翻译来提升对shader的见解,也让其他人更容易的了解shader.以下开始正文内容: 编写Surface Shaders 和光交互的shader写起来很复杂,有不同的光照类型.阴影选项.渲染路径(正向渲染和延迟渲染),有时shader需要考虑所有的复杂性. Unity中的Surface Shader是一个代码生成器,用它来写光照shader(lit shader)相比于使用低阶的顶点/像素shader(ve

DirectX 因素:构建用于 Windows 8 的音频振荡器

Charles Petzold 下载代码示例 我一直在制造电子乐器作为一种爱好现在大约 35 年. 我开始在晚 20 世纪 70 年代布线了 TTL 和 CMOS 芯片,于是晚得多的软件路由 - - 第一次与多媒体扩展到 1991 年的 Windows 和 Windows 演示文稿基础 (WPF) 中,和在 Silverlight 和 Windows Phone 7 的 MediaStreamSource 类 NAudio 图书馆最近. 就在去年,我专门讨论我触摸的一对夫妇分期付款 & 列去为

DirectX截图黑屏的解决办法

为什么会黑屏? 一句话概括,黑屏是由于DDraw加速引起的! 先说一下DirectX的显示原理,通常我们看到的屏幕上的数据,都是通过Primary Surface送至显示器的,什么是Primary Surface呢?中文叫做主显示表面,也就是说我们当前看到的屏幕上的图像数据是从这个表面来的,除了主表面意外还有离屏表面,叫做OffScreenSuface.这种表面中的数据是不直接显示在屏幕上的.常用的截屏函数也基本上是通过截取Primary Surface中的数据来实现的.现在多数的视频播放软件都

使用DirectX截屏

网上有很多关于DirectX截屏的文章,但大都是屏幕截图,很少有窗口截图,本文则两者都涉及到,先讲如何截取整个屏幕,再讲如何截取某个窗口,其实二者的区别不大,只是某个参数的设置不同而已,最后我们还将扩展到任意区域的截图. 首先看一下截屏用到的函数,最核心的当然是D3DXSaveSurfaceToFile,先看下函数原型 1 HRESULT D3DXSaveSurfaceToFile(2   LPCTSTR pDestFile,3   D3DXIMAGE_FILEFORMAT DestFormat

Surface Shader

SurfaceOutput: input: lighting:光照 shadow:阴影 属性声明类型对应关系: Simpler2D-2D half-Rang fixed4-4元向量 Tags {"RenderType"="Opaque"} 描述一种渲染类型,Opaque:不透明的物体 LOD 200 :层级细节 CGPROGRAM 开始 ENDCG 结束 CG语法,表示CG语言程序片段 pragma 语法: surface :surface shader关键字 su

DirectX Video Processing AppWizard--CDxVideoGraphBase

http://www.ifp.illinois.edu/~chenyq/research/Utils/DxVideoAppWiz/DxVideoAppWiz.html 一个非常棒的DirectX Video Processing AppWizard,备忘.