游戏编程之十 图像引擎DirectXDraw

简介: 游戏编程之十 图像引擎DirectXDraw

图像引擎DirectXDraw


 目前win95下比较常用的图像引擎是DirectX,国内资料比较少,我给大家推荐过<<高性能WINDOWS图形设计>>这本书,大家不妨找一下.

 在我们的游戏引擎中,目前使用的也是DirectX,网上见到有关DirectX的简化接口的对象库,没有使用过,不知如何,最好是自己做这些对象,灵活些.

图像引擎在游戏中的作用是这样的,设置显示模式,管理操作一种特殊图像表面,显示到屏

幕.  

图像引擎对象:

class DirectDrawWin 
{ 
 HWND hWnd; 
 BOOL IsUse; 
 int  winWidth,winHeight; 
 LPDIRECTDRAW2 ddraw2; 
 LPDIRECTDRAWSURFACE primsurf; 
 LPDIRECTDRAWPALETTE palette; 
 CDirectPAGE bakDirectPAGE;//背景表面,是CPICPAGE的继承对象CDirectPAGE的实例 
 LPDIRECTDRAWCLIPPER clipper; 
 RECT displayrect; 
 int displaydepth; 
 WORD loREDbit, numREDbits; 
 WORD loGREENbit, numGREENbits; 
 WORD loBLUEbit, numBLUEbits; 
public: 
 DirectDrawWin(); 
 ~DirectDrawWin(); 
 BOOL IsWorking(void); 
 int OnCreate(HWND _hWnd,BOOL IsFullWin=FALSE,int colors=16,int 
width=640,int height=480); 
 void DrawScene(); 
  BOOL ClearSurface( LPDIRECTDRAWSURFACE surf, DWORD clr, RECT* rect=0 ); 
  BOOL ClearSurface( LPDIRECTDRAWSURFACE surf, DWORD r, DWORD g, DWORD b,RECT* rect=0 ); 
 BOOL BltSurface(LPDIRECTDRAWSURFACE destsurf,LPDIRECTDRAWSURFACE srcsurf, int   srcInX, 
             int srcInY,DWORD flap, RECT *DecView=NULL,RECT *souRectBlt=NULL,//源图片目标区 
             RECT *lpFillRect=NULL); 
 CPICPAGE  *GetDecDrawPage(void); 
 LPDIRECTDRAWSURFACE CreateSurface( DWORD w, DWORD h ); 
 HRESULT SetColorKey(IDirectDrawSurface *pdds, COLORREF rgb); 
//====================================================================== 
private: 
 void SetHWnd(HWND _hWnd); 
 HWND GetSafeHwnd(){return hWnd;}; 
 BOOL CreateFlippingSurfaces(); 
 void OnDestroy(); 
 DWORD RGBtoPixel(DWORD r, DWORD g, DWORD b); 
 void GetSurfaceRect(LPDIRECTDRAWSURFACE surf,RECT *lpRc); 
 DWORD ColorMatch(IDirectDrawSurface *pdds, COLORREF rgb); 
 BOOL GetSurfaceRect( LPDIRECTDRAWSURFACE surf, RECT& rect); 
// 
 WORD LowBitPos( DWORD dword ); 
 WORD HighBitPos( DWORD dword ); 
 BOOL StorePixelFormatData(); 
 BOOL DetectDisplayMode(); 
}; 

 大家可以看到,对外的接口有限,主要是初始设置OnCreate,输出到屏幕DrawScene,然后是表面的生成CreateSurface和图像操作ClearSurface,BltSurface; 初始设置OnCreate():初始DrectX,设置显示模式,申请前表面,背景表面.对于即时滚屏的游戏,为了加快速度,可以将背景表面设置得比显示区大,这样滚动时只要局部更改活动区,设置DrawScene时的起始位置即可.但我们没有使用这项技巧,我们的系统设计原则之一是:尽量少用技巧,靠系统设计提高速度,而不是局部技巧,原因是技巧的适应范围一般有限.系统尽量要求通用.

 

 表面的生成和图像操作被一个叫CPICPAGE的通用图像页调用,CPICPAGE是一个包括各种位图格式的统一管理对象,游戏在进行图像操作时,不直接与DirectX图像表面打交道,CPICPAGE扩展了DirectX图像操作功能,比如带alpha通道的BLT,以及带亮度的BLT,直接对表面的Line,DrawTxt等.BltSurface()是一个包括许多剪裁定位输求的函数.

 

 对于窗口模式下的DrawScene,为了避免屏幕产生图像撕裂现象,可以利用垂直同步刷新同步地更新屏幕,为了减少此过程的等待时间,可以使用多线程技术.

  为了加快游戏显示速度,在使用DirectX中有许多可以挖掘的技巧.

   有关DirectX的部分我不作详细介绍,网上有一部分资料,另外可参阅<<高性能WINDOWS图形设计>>一书,我们的这个对象就是在其书的基础上简化而来,需要这部分源代码的朋友可来信与我们联系。


目录
相关文章
|
1月前
|
图形学
计算机图形学-1-小试牛刀
这段代码使用 OpenGL 和 GLUT 库创建了一个简单的图形窗口,展示了多个几何形状。首先清屏并设置背景为黑色,然后绘制一个白色矩形和一个彩色大三角形。接着绘制三个不同颜色的点,并计算大三角形的中点,绘制一个小三角形。最后,再次计算小三角形的中点,绘制一个更小的三角形。通过 `glutDisplayFunc` 注册显示回调函数 `myDisplay`,并在 `glutMainLoop` 中进入事件处理循环。
|
6月前
|
数据采集 算法 安全
CVPR 2024:给NeRF开透视眼!稀疏视角下用X光进行三维重建,9类算法工具包全开源
【6月更文挑战第28天】CVPR 2024亮点:SAX-NeRF框架开源!融合X光与NeRF,提升3D重建效果。X3D数据集验证,Lineformer+MLG策略揭示物体内部结构,增强几何理解。虽有计算成本及泛化挑战,但为计算机视觉和医学影像开辟新路径。[论文链接](https://arxiv.org/abs/2311.10959)**
198 5
|
7月前
|
存储 PyTorch 算法框架/工具
一体化模型图像去雨+图像去噪+图像去模糊(图像处理-图像复原-代码+部署运行教程)
一体化模型图像去雨+图像去噪+图像去模糊(图像处理-图像复原-代码+部署运行教程)
|
7月前
|
算法 数据可视化 vr&ar
【图形学】探秘图形学奥秘:图形变换的解密与实战
【图形学】探秘图形学奥秘:图形变换的解密与实战
98 0
|
机器学习/深度学习 算法 计算机视觉
CV面试题目总结(三) - 传统图像算法
CV面试题目总结(三) - 传统图像算法
295 0
|
机器学习/深度学习 算法 决策智能
计算机视觉实战(十五)背景建模 (附完整代码)
计算机视觉实战(十五)背景建模 (附完整代码)
291 0
|
机器学习/深度学习 编解码 人工智能
AI降维打击人类画家,文生图引入ControlNet,深度、边缘信息全能复用
AI降维打击人类画家,文生图引入ControlNet,深度、边缘信息全能复用
233 0
|
存储 Python
深度之眼(十六)——Python:有益的探索
深度之眼(十六)——Python:有益的探索
113 0
深度之眼(十六)——Python:有益的探索
|
人工智能 Ubuntu 搜索推荐
Python文本语音识别模块大比拼,看看青铜与王者的差别!
如果把Python比喻成游戏中的一个英雄,你觉得它是谁?对于Dota老玩家来说,我会想到钢琴手卡尔!感觉Python和卡尔一样,除了生孩子什么都可以做的角色。日常生活中,我们会涉及到很多语音播报的场景,比如郭德纲版的高德地图导航、超市门口的红外感知提醒欢迎光临、银行的自助叫号系统,等等...今天就和大家聊聊Python文本转语音,看看这些从青铜到王者的模块。
458 0
|
安全 前端开发 JavaScript
[工具使用]黑暗引擎FOFA(上)
[工具使用]黑暗引擎FOFA
1154 0
[工具使用]黑暗引擎FOFA(上)