最近要做项工作,需要将游戏代码中原本的DirectX8.1SDK库升级到9.0。

整理思路如下:

一、命名统一问题

D8和D9内部细节本来就有很多变化,但先从表面上来看,D8和D9的类型函数名字,都存在或多或少的

差异,为了整合以前的代码,如果将类型名字一一作改变,那代码变动量将十分的巨大。通过宏命名方式

将会节省很多时间,举例如下:

#ifdef D3DX9
#include <d3dx9.h>
typedef IDirect3DDevice9 Device;
typedef IDirect3D9 Direct3D;
typedef IDirect3DVertexBuffer9 VertexBuffer ;
typedef IDirect3DIndexBuffer9 IndexBuffer;
typedef IDirect3DTexture9 Texture ;
typedef D3DMATERIAL9 Material;
typedef IDirect3DSurface9 Surface;
typedef void YVOID;
#define Direct3DCreate Direct3DCreate9
#endif

#ifdef D3DX8
#include <d3dx8.h>
typedef BYTE YVOID;
typedef IDirect3DDevice8 Device;
typedef IDirect3D8 Direct3D;
typedef IDirect3DVertexBuffer8 VertexBuffer ;
typedef IDirect3DIndexBuffer8 IndexBuffer;
typedef IDirect3DTexture8 Texture ;
typedef D3DMATERIAL8 Material;
typedef IDirect3DSurface8 Surface;
#define Direct3DCreate Direct3DCreate8
#endif

可以将其放入一个公用的文件中,如Common.h文件,然后需要用到的包含此文件。同理,D8和D9所需要的库也不通,可通过同样的方式,将其库导入。
ifdef D3DX9
#pragma comment(lib , "d3d9")
#pragma comment(lib , "d3dx9")
#endif
#ifdef D3DX8
#pragma comment(lib , "d3d8")
#pragma comment(lib , "d3dx8")
#endif

原游戏代码虽然十分巨大,通过宏命名后,将会使代码结构变的简单,如果再想更改到别的版本将会省很多工作量。剩下的大部分工作,将是对各个函数,方法属性的细节作版本不同的细微调整。

二、 细节变化

1、函数参数变化:
SetIndices少了参数BaseVertexIndex,,加到DrawIndexedPrimitive了。
DrawIndexedPrimitive增加第二个参数BaseVertexIndex,第一个顶点相对于顶点缓冲首地址的偏移数

CreateTexture
CreateVolumeTexture
CreateCubeTexture
CreateVertexBuffer
CreateIndexBuffer
CreateRenderTarget
CreateDepthStencilSurface 增加最后一个参数pSharedHandle,Reserverd.

GetBackBuffer
GetDisplayMode增加第一个参数iSwapChain,交换链

SetStreamSource增加了第三个参数OffsetInBytes

GetGammaRamp
SetGammaRamp
GetAdapterModeCount
EnumAdapterModes增加第二参数D3DFORMART

GetAdapterIdentifier:第二参数默认值改变,宏正好相反
D8:GetAdapterIdentifier(D3DADAPTER_DEFAULT, D3DENUM_NO_WHQL_LEVEL , &identifier)=
D9:GetAdapterIdentifier(D3DADAPTER_DEFAULT,0 ,&identifier)

D8:GetAdapterIdentifier(D3DADAPTER_DEFAULT, 0 , &identifier)=
D9:GetAdapterIdentifier(D3DADAPTER_DEFAULT,D3DENUM_WHQL_LEVEL ,&identifier)

CheckDeviceType
GetDeviceCaps模式有所变化,具体见SDK,举例如下:
//CheckDeviceType函数区别,   CheckDeviceType和GetDeviceCaps配合使用验证适配器上的设备对希望使用的功能的支持度
#ifdef D3DX8
 if(FAILED(m_pD3D->CheckDeviceType(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,currentmode.Format,currentmode.Format,true)))
  return E_FAIL;
 if(FAILED(m_pD3D->CheckDeviceType(D3DADAPTER_DEFAULT,D3DDEVTYPE_REF,currentmode.Format,currentmode.Format,true)))
  return E_FAIL;
 if(FAILED(m_pD3D->CheckDeviceType(D3DADAPTER_DEFAULT,D3DDEVTYPE_SW,currentmode.Format,currentmode.Format,true)))
 {
  //return E_FAIL;//调用失败
 }
#endif
#ifdef D3DX9
 if(FAILED(m_pD3D->CheckDeviceType(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,currentmode.Format,D3DFMT_UNKNOWN,true))) //D3DFMT_UNKNOWN for window mode
  return E_FAIL;
 if(FAILED(m_pD3D->CheckDeviceType(D3DADAPTER_DEFAULT,D3DDEVTYPE_REF,currentmode.Format,D3DFMT_UNKNOWN,true)))
  return E_FAIL;
 if(FAILED(m_pD3D->CheckDeviceType(D3DADAPTER_DEFAULT,D3DDEVTYPE_SW,currentmode.Format,D3DFMT_UNKNOWN,true)))
 {
 // return E_FAIL; //失败,第3方插件没有?
 }
 if(FAILED(m_pD3D->CheckDeviceType(D3DADAPTER_DEFAULT,D3DDEVTYPE_NULLREF,currentmode.Format,D3DFMT_UNKNOWN,true)))
 {
 // return E_FAIL; //永远失败
 }
#endif
 //D3DDEVTYPE D9比D8多出D3DDEVTYPE_NULLREF这个类型,但所以使用此类型的设备创建的对象都将无效;而且原本无用的D3DDEVTYPE_SW类型有了新作用
 D3dcaps caps;
#ifdef D3DX8
 if(FAILED(m_pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,&caps)))
  return E_FAIL;
 if(FAILED(m_pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_REF,&caps)))
  return E_FAIL;
 if(FAILED(m_pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_SW,&caps)))//D8中无意义
 {
  // return E_FAIL;  
 }
#endif
#ifdef D3DX9
 if(FAILED(m_pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,&caps)))
  return E_FAIL;
 if(FAILED(m_pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_REF,&caps)))
  return E_FAIL;
 if(FAILED(m_pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_SW,&caps)))//经过IDirect3D9::RegisterSoftwareDevice注册过的第3方设备插件
 {
  // return E_FAIL;   //如果没注册则调用失败
 }
 if(FAILED(m_pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_NULLREF,&caps)))//如上解释,任何调用都会失败
 {
  // return E_FAIL;
 }
#endif

CheckDeviceMultiSampleType增加一个参数pQualityLevels ,可以为NULL

SetRenderTarget:
SetRenderTarget(pRenderTarget,pNewZStencil) →功能分割成两个函数
SetRenderTarget(RenderTargetIndex,pRenderTarget)
SetDepthStencilSurface(pNewZStencil)

GetRenderTarget多了个参数RenderTargetIndex

D3DXAssembleShader 参数增加pDefines,顺序也变了,具体见SDK

2、函数名字改变,同样的功能变更到其他函数中:D8→D9
CreateImageSurface→
CreateOffscreenPlainSurface

SetRenderState(D3DRS_SOFTWAREVERTEXPROCESSING ,BOOL b)→
SetSoftwareVertexProcessing(BOOL b)

SetTextureStageState(一些参数,  )→
SetSamplerState(参数,    )
参数:
D3DTSS_ADDRESSU D3DTSS_ADDRESSV D3DTSS_ADDRESSW D3DTSS_BORDERCOLOR
D3DTSS_MAGFILTER D3DTSS_MINFILTER D3DTSS_MIPFILTER
D3DTSS_MIPMAPLODBIAS  D3DTSS_MAXMIPLEVEL D3DTSS_MAXANISOTROPY D3DTSS_FORCE_DWORD →
D3DSAMP_前缀的
D3DSAMP_ADDRESSU = 1,
D3DSAMP_ADDRESSV = 2,
D3DSAMP_ADDRESSW = 3,
D3DSAMP_BORDERCOLOR = 4,
D3DSAMP_MAGFILTER = 5,
D3DSAMP_MINFILTER = 6,
D3DSAMP_MIPFILTER = 7,
D3DSAMP_MIPMAPLODBIAS = 8,
D3DSAMP_MAXMIPLEVEL = 9,
D3DSAMP_MAXANISOTROPY = 10,
D3DSAMP_SRGBTEXTURE = 11,  原来没有
D3DSAMP_ELEMENTINDEX = 12, 原来没有
D3DSAMP_DMAPOFFSET = 13,   原来没有
D3DSAMP_FORCE_DWORD = 0x7fffffff,

SetVertexShader→
①固定管线FIXED-FUNCTION PIPELINE ,SetFVF
②着色器VertexShader,SetVertexShader
Remark:D9要使用SHADER必须先调用SetVertexDeclaration 再调用SetVertexShader
所以得先通过CreateVertexDeclaration()创建个IDirect3DVertexDeclaration9对象
例如:
VertexElement = {0 , 0 ,D3DDECLTYPE_FLOAT3 , D3DDECLMETHOD_DEFAULT ,D3DDECLUSAGE_POSITION , 0};
CreateVertexDeclaration(VertexElement,&VertexDeclaration);

SetVertexShaderConstant→
SetVertexShaderConstantF

ResourceManagerDiscardBytes→
EvictManagedResources

3、属性,结构改变:

D3DPRESENT_PARAMETERS结构变化如下:
d3dpp.FullScreen_PresentationInterval→
d3dpp.PresentationInterval

GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddm)
d3dpp.BackBufferFormat = d3ddm.Format →
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN  在D8里设为D3DFMT_UNKNOWN 有时候会出错,获取不了当前显示模式。

D3DRENDERSTATETYPE结构变动挺多,具体SDK吧:举个例子
D3DRS_ZBIAS → D3DRS_DEPTHBIAS

D3DTEXTUREFILTERTYPE变动了一些
D3DTEXF_GAUSSIANCUBIC →
D3DTEXF_GAUSSIANQUAD

变更DirectX SDK版本-DirectX8升级DirectX9相关推荐

  1. DirectX SDK版本与Visual Studio版本

    DirectX SDK版本与Visual Studio版本 对于刚刚接触 DirectShow 的人来说,安装配置是一个令人头疼的问题,经常出现的情况是最基本的 baseclass 就无法编译. 一开 ...

  2. DirectX SDK 重大版本变化记录[转]

    DXSDK 重大版本变化记录 区别细说 dxsdk各个版本对开发工具和平台的支持变化很大,这里记录一下,以免经常弄错. 2004.08  不再支持VC6,不再提供directplay和directsh ...

  3. 网易SDK版本 框架变更下的 升级

    项目中使用了网易的互动SDK 使用第三方SDK,最令人讨厌的事, SDK版本升级时,框架变了,这就不能简单的更换文件了,而是重新调整 这个让人讨厌的事,今天就遇到了,网易互动SDK变更了框架及位置,为 ...

  4. DirectX SDK 9.28版本安装错误S1023

    安装: 最后出现S1023错误: 这是因为系统中已经安装了VC++运行库:并且已安装的版本,高于当前要安装的版本:看下本机情况, 必须把高版本的VC++运行库卸掉,才能安装DirectX SDK:当前 ...

  5. Android升级sdk版本报错问题

    最开始sdk版本设定在26 后来项目中需要引用glide--一个GitHub上的开源工具 在build.gradle中依赖里加入: implementation 'com.github.bumptec ...

  6. DirectX SDK所有版本微软官方的下载页面(转)

    作者:Blues 日期:2007-07-13 DirectX 9.0 Complete Software Development Kit (SDK) :(2002-12-19) http://www. ...

  7. DirectX SDK各版本下载地址备份

    PCHOME 下载 http://download.pchome.net/search-0--directx----------1-1-3.html DirectX 8.0 SDK 开发包       ...

  8. sdk版本过低怎么办_滴滴ElasticSearch平台跨版本升级以及平台重构之路

    导读:滴滴 ElasticSearch 团队经过 7 个月的奋斗,将维护国内的 30 多个 ES 集群,2000 多个 ES 节点,4PB 的数据,从 2.3.3 跨大版本无缝升级到 6.6.1.完成 ...

  9. sdk版本过低怎么办_区块链中的“块”是什么?区块链网络拥堵怎么办?-Gemini双子新约...

    区块链中的"块"是什么? 比特币是基于区块链的,这一点大家都知道.但是这个区块链是什么呢?更准确地说,区块链的各个组成部分是什么呢? 区块链是一个数据块.每个块可以看作是分类帐中的 ...

  10. 游戏编程之三 DirectX SDK简介

    `视频课:[免费]跨平台APP JQuery Mobile开发-1-初探移动开发-张晨光的在线视频教程-CSDN程序员研修院 第三章 DirectX  SDK简介 第一节 关于DirectX SDK ...

最新文章

  1. JS模式:jq中简单的模式--》采摘自js设计(tomxu_version)
  2. Response内置对象
  3. 评分卡上线后如何进行评分卡的监测
  4. jvm性能调优实战 - 39一次大促导致的内存泄漏和Full GC优化
  5. 第三次学JAVA再学不好就吃翔(part92)--Map集合的遍历
  6. spring使用注解@Scheduled执行定时任务
  7. LeetCode 1121. 将数组分成几个递增序列
  8. 星恒发布“超锂S7” 新品 采用第7代锰系多元复合锂技术打造
  9. 【Java每日一题】20170110
  10. .reg注册表文件的编写
  11. win7计算机广告更改,win7电脑弹窗广告怎么彻底关闭_win7去除弹窗广告的步骤
  12. win10微软账户无法连接服务器,Win10系统Microsoft微软帐户无法登陆的解决方法
  13. Apple MFi认证是什么意思?
  14. ES6语法总结(21)--Generator函数的异步应用
  15. 金山是微软VBA的正式授权用户
  16. 最新版FusionCharts2D面积图
  17. 论文阅读笔记:(2021.06, cvpr) Monocular 3D Object Detection: An Extrinsic Parameter Free Approach
  18. 【MPLS】LDP保留的标签
  19. 提高工作效率的重要性 苹果手机用便签软件制定计划
  20. 智能指针实战讲解--龙之介《Effective C++》实验室

热门文章

  1. python免费程序-Python——免费观看全网视频小程序
  2. 计算机文字排版工作过程,计算机文字录入与排版教学计划.doc
  3. c语言锁存器写入1,总线接口作两种用途,为何就要用到锁存器
  4. 发卡机构(POS收单行)代码表
  5. php开源源码管理后台小程序团购,秒杀,分销 高可用
  6. 纯注解整合SSM框架
  7. Matlab生成zipf随机数
  8. 经纬度度分秒转换小数
  9. 联想笔记本连不上手机热点_联想笔记本连不上无线_联想笔记本连不上热点
  10. 软件设计文档——概要设计书