想要在D3D中加载2D图片可以使用如下两种方法(我只想到这两种方法,如果有其他方法,请指教)。第一种就是把图片以纹理方式加载,然后以此为纹理绘制一个四边形即可;第二种就是使用2D点精灵,不解释,你懂得;下面分别给出两种方法的代码:

第一种:绘制四边形

#include <d3dx9.h> //----------------------------------------------------------------------------- // Desc: 全局变量 //----------------------------------------------------------------------------- LPDIRECT3D9 g_pD3D = NULL; //Direct3D对象 LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; //Direct3D设备对象 LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL; //顶点缓冲区对象 LPDIRECT3DTEXTURE9 g_pTex = NULL; //纹理 //----------------------------------------------------------------------------- // Desc: 顶点结构 //----------------------------------------------------------------------------- struct CUSTOMVERTEX { FLOAT x, y, z, rhw; FLOAT u, v; }; #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_TEX1) //顶点格式 //----------------------------------------------------------------------------- // Desc: 初始化Direct3D //----------------------------------------------------------------------------- HRESULT InitD3D( HWND hWnd ) { //创建Direct3D对象, 该对象用于创建Direct3D设备对象 if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) return E_FAIL; //设置D3DPRESENT_PARAMETERS结构, 准备创建Direct3D设备对象 D3DPRESENT_PARAMETERS d3dpp; ZeroMemory( &d3dpp, sizeof(d3dpp) ); d3dpp.Windowed = TRUE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; //创建Direct3D设备对象 if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice ) ) ) { return E_FAIL; } //加载纹理 if (FAILED(D3DXCreateTextureFromFile(g_pd3dDevice, L"Water lilies.jpg", &g_pTex))) { return E_FAIL; } return S_OK; } //----------------------------------------------------------------------------- // Desc: 创建并填充顶点缓冲区 //----------------------------------------------------------------------------- HRESULT InitVB() { //顶点数据 CUSTOMVERTEX vertices[] = { { 100.0f, 100.0f, 0.5f, 1.0f, 0.f, 0.f }, { 400.0f, 100.0f, 0.5f, 1.0f, 1.f, 0.f}, { 400.0f, 400.0f, 0.5f, 1.0f, 1.f, 1.f}, { 100.0f, 100.0f, 0.5f, 1.0f, 0.f, 0.f }, { 400.0f, 400.0f, 0.5f, 1.0f, 1.f, 1.f}, { 100.0f, 400.0f, 0.5f, 1.0f, 0.f, 1.f}, }; //创建顶点缓冲区 if( FAILED( g_pd3dDevice->CreateVertexBuffer( 6*sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVB, NULL ) ) ) { return E_FAIL; } //填充顶点缓冲区 VOID* pVertices; if( FAILED( g_pVB->Lock( 0, sizeof(vertices), (void**)&pVertices, 0 ) ) ) return E_FAIL; memcpy( pVertices, vertices, sizeof(vertices) ); g_pVB->Unlock(); return S_OK; } //----------------------------------------------------------------------------- // Desc: 释放创建的对象 //----------------------------------------------------------------------------- VOID Cleanup() { //释放纹理 if(g_pTex != NULL) { g_pTex->Release(); } //释放顶点缓冲区对象 if( g_pVB != NULL ) g_pVB->Release(); //释放Direct3D设备对象 if( g_pd3dDevice != NULL ) g_pd3dDevice->Release(); //释放Direct3D对象 if( g_pD3D != NULL ) g_pD3D->Release(); } //----------------------------------------------------------------------------- // Desc: 渲染图形 //----------------------------------------------------------------------------- VOID Render() { //清空后台缓冲区 g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(45, 50, 170), 1.0f, 0 ); //开始在后台缓冲区绘制图形 if( SUCCEEDED( g_pd3dDevice->BeginScene() ) ) { //在后台缓冲区绘制图形 g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) ); g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX ); g_pd3dDevice->SetTexture(0, g_pTex); g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 2 ); //结束在后台缓冲区绘制图形 g_pd3dDevice->EndScene(); } //将在后台缓冲区绘制的图形提交到前台缓冲区显示 g_pd3dDevice->Present( NULL, NULL, NULL, NULL ); } //----------------------------------------------------------------------------- // Desc: 消息处理 //----------------------------------------------------------------------------- LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) { switch( msg ) { case WM_DESTROY: Cleanup(); PostQuitMessage( 0 ); return 0; } return DefWindowProc( hWnd, msg, wParam, lParam ); } //----------------------------------------------------------------------------- // Desc: 入口函数 //----------------------------------------------------------------------------- INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT ) { //注册窗口类 WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, L"ClassName", NULL }; RegisterClassEx( &wc ); //创建窗口 HWND hWnd = CreateWindow( L"ClassName", L"顶点缓冲区", WS_OVERLAPPEDWINDOW, 200, 100, 600, 500, GetDesktopWindow(), NULL, wc.hInstance, NULL ); //初始化Direct3D if( SUCCEEDED( InitD3D( hWnd ) ) ) { //创建并填充顶点缓冲区 if( SUCCEEDED( InitVB() ) ) { //显示窗口 ShowWindow( hWnd, SW_SHOWDEFAULT ); UpdateWindow( hWnd ); //进入消息循环 MSG msg; ZeroMemory( &msg, sizeof(msg) ); while( msg.message!=WM_QUIT ) { if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) ) { TranslateMessage(&msg); DispatchMessage(&msg); } else { Render(); //渲染图形 } } } } UnregisterClass(L"ClassName", wc.hInstance); return 0; }

第二种:点精灵

#include <d3dx9.h> //----------------------------------------------------------------------------- // Desc: 全局变量 //----------------------------------------------------------------------------- LPDIRECT3D9 g_pD3D = NULL; //Direct3D对象 LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; //Direct3D设备对象 LPDIRECT3DTEXTURE9 g_pTex = NULL; //纹理 LPD3DXSPRITE g_pSprite = NULL; //点精灵 //----------------------------------------------------------------------------- // Desc: 初始化Direct3D //----------------------------------------------------------------------------- HRESULT InitD3D( HWND hWnd ) { //创建Direct3D对象, 该对象用于创建Direct3D设备对象 if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) return E_FAIL; //设置D3DPRESENT_PARAMETERS结构, 准备创建Direct3D设备对象 D3DPRESENT_PARAMETERS d3dpp; ZeroMemory( &d3dpp, sizeof(d3dpp) ); d3dpp.Windowed = TRUE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; //创建Direct3D设备对象 if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice ) ) ) { return E_FAIL; } // 创建点精灵 if (FAILED(D3DXCreateSprite( g_pd3dDevice, &g_pSprite ))) { return E_FAIL; } //加载纹理 if (FAILED(D3DXCreateTextureFromFile(g_pd3dDevice, L"Water lilies.jpg", &g_pTex))) { return E_FAIL; } return S_OK; } //----------------------------------------------------------------------------- // Desc: 释放创建的对象 //----------------------------------------------------------------------------- VOID Cleanup() { //释放纹理 if(g_pTex != NULL) { g_pTex->Release(); } //释放点精灵 if (g_pSprite != NULL) { g_pSprite->Release(); } //释放Direct3D设备对象 if( g_pd3dDevice != NULL ) g_pd3dDevice->Release(); //释放Direct3D对象 if( g_pD3D != NULL ) g_pD3D->Release(); } //----------------------------------------------------------------------------- // Desc: 渲染图形 //----------------------------------------------------------------------------- VOID Render() { //清空后台缓冲区 g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(45, 50, 170), 1.0f, 0 ); //开始在后台缓冲区绘制图形 if( SUCCEEDED( g_pd3dDevice->BeginScene() ) ) { if ( SUCCEEDED( g_pSprite->Begin(D3DXSPRITE_ALPHABLEND) ) ) { g_pSprite->Draw(g_pTex, NULL, NULL, NULL, 0xffffffff); g_pSprite->End(); } //结束在后台缓冲区绘制图形 g_pd3dDevice->EndScene(); } //将在后台缓冲区绘制的图形提交到前台缓冲区显示 g_pd3dDevice->Present( NULL, NULL, NULL, NULL ); } //----------------------------------------------------------------------------- // Desc: 消息处理 //----------------------------------------------------------------------------- LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) { switch( msg ) { case WM_DESTROY: Cleanup(); PostQuitMessage( 0 ); return 0; } return DefWindowProc( hWnd, msg, wParam, lParam ); } //----------------------------------------------------------------------------- // Desc: 入口函数 //----------------------------------------------------------------------------- INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT ) { //注册窗口类 WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, L"ClassName", NULL }; RegisterClassEx( &wc ); //创建窗口 HWND hWnd = CreateWindow( L"ClassName", L"顶点缓冲区", WS_OVERLAPPEDWINDOW, 200, 100, 800, 600, GetDesktopWindow(), NULL, wc.hInstance, NULL ); //初始化Direct3D if( SUCCEEDED( InitD3D( hWnd ) ) ) { //创建并填充顶点缓冲区 if( SUCCEEDED( TRUE ) ) { //显示窗口 ShowWindow( hWnd, SW_SHOWDEFAULT ); UpdateWindow( hWnd ); //进入消息循环 MSG msg; ZeroMemory( &msg, sizeof(msg) ); while( msg.message!=WM_QUIT ) { if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) ) { TranslateMessage(&msg); DispatchMessage(&msg); } else { Render(); //渲染图形 } } } } UnregisterClass(L"ClassName", wc.hInstance); return 0; }

D3D中2D图片的绘制相关推荐

  1. D3D中2D图片的绘制两种方法

    2014/09/19 (转载自:http://blog.csdn.net/rabbit729/article/details/6388703) 想要在D3D中加载2D图片可以使用如下两种方法(我只想到 ...

  2. D3D中基本立体面的绘制

    [转][收藏]2010-09-01 D3D中基本立体面的绘制 提示: 阅读本文需要一定的3D图形学和DirectX9基础,如果你发现阅读困难,请参阅D3D 中基本三角形面的绘制. 本文用到的坐标系统变 ...

  3. C# D3D中2D的使用,做小游戏。。。。半年前写的东西了,拿出来分享,现在看来代码写的乱七八糟的,将就一下吧。。。

    画面如上,代码请下载CSDN"我的下载"里面找,免费,不要分的.... 只是实现了那么一点点功能,问题很多很多,应为一直没时间去修改,所以就没完善.... 这是链接http://s ...

  4. D3D中的纹理贴图(1)

    D3D中的纹理贴图(1) 提示: 阅读本文需要一定的3D图形学和DirectX9基础,如果你发现阅读困难,请参阅 D3D中基本三角形面的绘制. 本文用到的坐标系统变换函数请参阅 DirectX 9的坐 ...

  5. 【Qt】2D绘图之绘制图片

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 简单绘制图片 04. 平移图片 05. 缩放图片 06. 旋转图片 07. 扭曲图片 08. 附录 01. 概述 Qt提供 ...

  6. 在D3D中绘制一个三角形的一个完整过程(学习3D游戏笔记一)

    本笔记是基于Microsfot DirectX 9.0 SDK Update的SimpleSample生成的框架. 在3D场景中,所有的对象和模型均由三角形构成;而三角形由三个顶点构成;每个顶点不仅包 ...

  7. VR制作中必须踩的坑365之042(oculus2、UE4、UE5、VR记录一年的踩坑之旅)2D图片变成3D最快方法:使用怪兽建模(Monster Mash)

    VR制作中必须踩的坑365之041(oculus2.UE4.UE5.VR记录一年的踩坑之旅) Turn 2D Images into 3D Objects with Monster Mash! (Fr ...

  8. 【Qt】2D绘图之绘制图像(二)

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 绘制QImage图像 04. 绘制QPixmap图像 05. 绘制QPicture图像 06. 综合对比 07. 附录 0 ...

  9. 【Qt】2D绘图之绘制简单的图形

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 绘制图形 04. 画笔和画刷 05. 绘制弧线 06. 附录 01. 概述 Qt中提供了强大的2D绘图系统,可以使用同一A ...

最新文章

  1. SpringBoot使用JSP作为模板
  2. 屏幕截图功能的实现------Java篇
  3. java irowset行数,Java CloneableRecord.put方法代码示例
  4. axis WebServices 完美调用天气预报,查询、显示 代码!
  5. linux下线程绑定内核,多线程 – 无法将内核线程绑定到CPU
  6. 大数据翻页_大数据量下的分页解决方法
  7. 巧用路径工具做流线字
  8. 【英语学习】【Daily English】U01 Greetings / L02 What brings you here?
  9. PHP的线程安全与非线程(NTS)安全版本的区别
  10. FileUpload文件上传控件
  11. 服务器lsass系统错误,Win7系统提示Lsass.exe系统错误的原因及解决
  12. linux实时监测cpu温度,Linux 监控CPU 温度
  13. Timer already cancelled 或者 Task already scheduled or cancelled
  14. 全球及中国影视产业渠道建设分析与投融资风险分析报告2021-2027年
  15. D. Little Girl and Maximum XOR(贪心)
  16. 梧桐新叶让我怀念父亲
  17. 什么是软阀值?什么是硬阀值?
  18. Ftp服务器架设与客户端使用--FileZilla
  19. Norbit多波束(iWBMS)和前视声纳(WBMS FLS)的使用简介
  20. 隐私计算加密技术基础系列(中)-RSA加密解析

热门文章

  1. 飞思卡尔芯片解密 MC9S08GB60 芯片特点
  2. 我用 python 做了款可开淘宝店赚钱的工具!
  3. C# 之 扑克游戏 -- 21点规则介绍和代码实现
  4. git push时rejected,解决non-fast-forward errors的办法
  5. APIO10-特别行动队-题解
  6. U-boot中怎么添加配置菜单选项
  7. RFID资产管理在学校固定资产管理中的应用,针对学校资产有效进行管理-新导智能
  8. 滴滴一下,小程序专车来了
  9. vue+海康威视视频插件坑点记录
  10. 机器学习 day15异常检测