年度总结之三:底层驱动的改写

来公司的第一项工作就是把引擎的图形驱动层由OpenGL改成Direct3D。

 

整改缘由:

        1. 虽然市面上的大部分显卡都支持OpenGL,但是还是有一部分不支持。

        2. 某些显卡虽然支持OpenGL但是其驱动不支持,目前所知,windows默认的驱动都是不支持OpenGL的。需要玩家下载驱动。

        3. N显卡对OpenGL的某些特性是默认关闭的,需要使用NVemulate工具才能打开;

        4. A卡对OpenGL的支持更是差劲;

  5. 据说glsl的版本划分不是很好;

 

悲催的是,我们的引擎只支持OpenGL。前面的同事告诉我,引擎里有个转换层,把OpenGL转换成了Direct3D。看了以后更郁闷,是dx7。期间还参考了DOOM的代码,是把OpenGL转换成dx8的代码。整理了一下思路,如果按现在的时间进度,要把游戏里所有OpenGL的东东全部干掉,换成dx9还真是来不及。只能在原来的接口基础上加上一层,即函数名称还是OpenGL的API的名称,但是其内部实现换成了dx9的实现。一拍即合,开始实施。

 

        走的弯路就不说了,总的思路是集合渲染流水线,分解成若干模块:

          1. 矩阵管理;

    2. 纹理管理;

     3. 各种渲染状态,alpha相关,depth相关,stencil相关,facecull相关,shademode,renderType,viewport等;

  4. 简单渲染模型类;

  5. D3D设备相关类;

  6. D3D资源管理;

  7. 主要渲染接口的实现;

  8. 删除OpenGL中特有的功能函数;

  9. 添加DirectX9.0c中需要的功能函数;

         10. 一系列状态转换函数;

         11.一系列的矩阵转换函数;

 

       具体技术细节就不一一赘述了,下面就一些遇到的好玩的问题进行总结一下:

  1. OpenGL使用右手坐标系,dx习惯使用左手坐标系,区别就是z轴的方向,前者正向向外,后者向里;

          2. OpenGL的矩阵按列存储,dx的矩阵按行存储,在交互使用之前需要进行转置。

  3. D3D,0.5像素的偏移问题。即,正交投影式,在做纹理映射时,会从像素的中间点开始映射,结果导致绘制出的纹理向左下方偏移0.5个像素。解决方案,在正交投影时,在原始投影矩阵基础上乘一个平移矩阵,即把顶点向右上方平移0.5个像素,这样绘制出的结果就对了。注,透视投影不存在该问题。

  4. OpenGL渲染不存在dp的说法,所以,在渲染组织上,很多都是频繁提交,导致在d3d下效率极低,这也是后来对地形渲染重写的重要原因。

          5. D3D资源管理相关。很基础,此处在进行总结一下:

          资源主要是指:纹理(包括rendertarget)、vertexbuffer、indexbuffer、backbuffer等。

  <1> 纹理除了renderTarget是default,其他的都是managed。因为此引擎目前还不支持动态纹理;

  <2> vertexbuffer除了SkinMesh是default、dynamic、writeonly之外,其它的都是managed的。

          <3> indexbuffer除了terrain是default、dynamic、writeonly之外,其它的都是managed的。

          注:注意使用时lock函数参数的使用不当,会产生效率问题呦!

  6. 引擎中的界面、字体、粒子等的渲染没用到buffer,而是直接用顶点数组,调用DrawPrimitiveUP接口实现的;

  7. 添加了设备丢失的处理,这个一直是dx的漏洞;

  8. D3D中不存在LineLoop,只有把顶点数组中第一个点复制到最后,使用D3DPT_LINESTRIP来实现;

  

       暂时说这么多吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值