﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-swo2006-文章分类-3d</title><link>http://www.cppblog.com/swo2006/category/3196.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 22 May 2008 01:02:07 GMT</lastBuildDate><pubDate>Thu, 22 May 2008 01:02:07 GMT</pubDate><ttl>60</ttl><item><title>使用C++和Directx开发GUI</title><link>http://www.cppblog.com/swo2006/articles/11648.html</link><dc:creator>swo</dc:creator><author>swo</author><pubDate>Thu, 24 Aug 2006 07:11:00 GMT</pubDate><guid>http://www.cppblog.com/swo2006/articles/11648.html</guid><wfw:comment>http://www.cppblog.com/swo2006/comments/11648.html</wfw:comment><comments>http://www.cppblog.com/swo2006/articles/11648.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/swo2006/comments/commentRss/11648.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/swo2006/services/trackbacks/11648.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 看起来我在做发明车轮的浪费时间的事--windows已经有一套非常复杂功能完善的GUI.不幸的是windows的GUI适用于办公软件,而这通常不适合游戏软件.游戏一般需要比windows更精确的控制(例如,使用自己的GUI实现用alpha混合创造的部分透明的窗口比较容易,而使用windows的GUI则几乎做不到).																																		...&nbsp;&nbsp;<a href='http://www.cppblog.com/swo2006/articles/11648.html'>阅读全文</a><img src ="http://www.cppblog.com/swo2006/aggbug/11648.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/swo2006/" target="_blank">swo</a> 2006-08-24 15:11 <a href="http://www.cppblog.com/swo2006/articles/11648.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>游戏UI设计1</title><link>http://www.cppblog.com/swo2006/articles/11635.html</link><dc:creator>swo</dc:creator><author>swo</author><pubDate>Thu, 24 Aug 2006 03:23:00 GMT</pubDate><guid>http://www.cppblog.com/swo2006/articles/11635.html</guid><wfw:comment>http://www.cppblog.com/swo2006/comments/11635.html</wfw:comment><comments>http://www.cppblog.com/swo2006/articles/11635.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/swo2006/comments/commentRss/11635.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/swo2006/services/trackbacks/11635.html</trackback:ping><description><![CDATA[
		<table style="border-collapse: collapse;" id="table2" border="0" cellpadding="0" width="100%">
				<tbody>
						<tr>
								<td bgcolor="#f7ebde">
										<br />
		1.1 Surfaces之封装CXSurface<br /><br />
		1、Surfaces是什么：<br />
		　　通俗的讲surfaces就是一个二维的矩形平面。在DX9中，与其对应的com接口为IDirect3DSurface9，LPDIRECT3DSURFACE9。<br /><br />
		2、Surfaces的作用：<br />
		　　作为一个矩形平面，surfaces用来在屏幕上显示平面图象，即从文件中读取图象数据呈现给用户。<br /><br />
		3、IDirect3DSurface9的使用一般过程：<br />
		　　声明： LPDIRECT3DSURFACE9<br />
		　　创建： CreateOffscreenPlainSurface(…)<br />
		　　获取图象信息： D3DXGetImageInfoFromFile(…)<br />
		　　装载到surfaces中： D3DXLoadSurfaceFromFile(…)<br />
		　　获取back buffer地址： GetBackBuffer(…)<br />
		　　显示： UpdateSurface(…)<br />
		　　释放内存 Release()<br /><br />
		代码段如下：<br /><br />
		LPDIRECT3DSURFACE9 g_Surface =NULL;<br />
		D3DXIMAGE_INFO Info;<br />
		D3DXGetImageInfoFromFile("D:\image.jpg", &amp;Info);<br />
		g_pd3dDevice-&gt;CreateOffscreenPlainSurface(Info.Width, Info.Height, 
		Info.Format, &amp;g_Surface, NULL);<br />
		D3DXLoadSurfaceFromFile(g_Surface, NULL, NULL, "D:\image.jpg", NULL, 
		D3DX_FILTER_NONE, 0xFF000000, NULL);<br /><br />
		//--------------------------------------------------------------------------------------------------<br />
		LPDIRECT3DSURFACE9 BackBuffer = NULL;<br />
		g_pd3dDevice-&gt;GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO, &amp;BackBuffer);<br />
		g_pd3dDevice-&gt;UpdateSurface(g_Surface, NULL, BackBuffer, NULL);<br />
		if(BackBuffer != NULL)<br />
    BackBuffer-&gt;Release();<br /><br />
		//---------------------------------------------------------------------------------------------------<br />
		if(g_Surface!= NULL)<br />
    g_Surface -&gt;Release();<br /><br />
		　　由上述过程可以看到，IDirect3DSurface9的使用虽然不十分复杂，但有点不方便 
		——创建和释放总要成对出现，使用过程中还穿插着LPDIRECT3DDEVICE9接口。这些若用一个类封装起来，使用就要方便的多。<br /><br />
		4、如何封装：<br />
		　　按照surfaces的功能，创建它就用来显示图象。因此要有读取图象的接口和显示图象的接口。又要与LPDIRECT3DDEVICE9设备接口关联，因此需要一个设置设备的接口。如下所示：<br /><br />
		1、声明及释放<br />
		　　声明： LPDIRECT3DSURFACE9<br />
		　　释放内存 Release()<br /><br />
		2、关联图像：LoadFromFile<br />
		　　获取图象信息： D3DXGetImageInfoFromFile(…)<br />
		　　创建： CreateOffscreenPlainSurface(…)<br />
		　　装载到surfaces中： D3DXLoadSurfaceFromFile(…)<br /><br />
		3、显示图象 Render<br />
		　　获取缓存地址： GetBackBuffer(…)<br />
		　　显示： UpdateSurface(…)<br /><br />
		4、关联设备接口 SetDevice<br /><br />
		所以CXSurface的定义如下：<br /><br />
		class CXSurface<br />
		{<br />
		protected:<br />
    LPDIRECT3DSURFACE9 m_Surface;<br />


   


		LPDIRECT3DSURFACE9 m_BackBuffer; //Back buffer<br />


   


		LPDIRECT3DDEVICE9 m_pDevice; //Direct3D的设备指针<br />
		public:<br />


   


		CXSurface(LPDIRECT3DDEVICE9 pDevice);<br />


   


		~CXSurface();<br />


   


		HRESULT LoadFromFile(LPCSTR Path);<br />


   


		void Render(void);<br />
		};<br /><br /><br />
		1.2 Textures &amp; Sprite 之封装CXTexture &amp; CXSprite<br /><br />
		1、何为Textures<br />
		　　Textures是在屏幕上显示的平面图形，它能够提供比 surface 
		更多的图形处理效果——移动、缩放、旋转及作为纹理皮肤粘贴在3D模型上。在Direct3D中，其封装的接口为IDirect3DTexture9。<br /><br />
		2、何为Sprite<br />
		　　IDirect3DTexture9能从文件中读取纹理数据，但由于Textures不能直接复制到 back 
		buffer，因此在屏幕上绘制Textures之前，需要另一个接口——ID3DXSprite（精灵）。ID3DXSprite能够把若干个Textures 
		复制给back buffer，因此需要ID3DXSprite的一个实例就可以绘制所有的纹理。<br />
		　　所以，IDirect3DTexture9用来存放程序所需的纹理，但它本身又不能绘制纹理，需要借助接口ID3DXSprite。<br /><br />
		3、IDirect3DTexture9和ID3DXSprite的使用过程<br />
		　　定义：~<br />
		　　创建：D3DXCreateTextureFromFile<br />
		　　　　　D3DXCreateSprite<br />
		　　创建变换矩阵： D3DXMatrixTransformation2D<br />
		　　变换： SetTransform<br />
		　　绘制图象： Draw<br />
		　　释放内存： ~<br /><br />
		代码如下：<br /><br />
		D3DXCreateTextureFromFile(g_pd3dDevice, "c:\\image.bmp”, &amp;g_Texture);<br />
		D3DXCreateSprite(g_pd3dDevice, &amp;g_Sprite);<br /><br />
		//--------------------------------------------------------------------------<br />
		D3DXVECTOR2 Translation;<br />
		Translation.x = 500;<br />
		Translation.y = 500;<br />
		D3DXVECTOR2 Scaling;<br />
		Scaling.x = 1.0;f<br />
		Scaling.y = 1.0f;<br />
		D3DXMATRIX Mat;<br />
		D3DXMatrixTransformation2D(&amp;Mat, NULL, 0, &amp;Scaling, NULL, 0, 
		&amp;Translation);<br />
		g_Sprite-&gt;Begin(0);<br />
		g_Sprite-&gt;SetTransform(&amp;<br />
		g_Sprite-&gt;Draw(g_Texture,<br />
		g_Sprite-&gt;End();<br /><br />
		4、 如何封装<br />
		　　从以上的基本过程可以看到，CXTexture需要完成的功能：提供与LPDIRECT3DDEVICE9的接口，与纹理文件文件关联，对纹理进行处理（缩放、旋转……）。<br /><br />
		class CXTexture<br />
		{<br />
		protected:<br />
    LPDIRECT3DTEXTURE9 m_Texture;<br />


   


		LPDIRECT3DDEVICE9 m_pDevice;<br />


   


		D3DXVECTOR2 m_RotationCenter;<br />


   


		D3DXVECTOR2 m_Translation;<br />


   


		D3DXVECTOR2 m_Scaling;<br />


   


		FLOAT m_Rotation;<br />


   


		RECT m_SrcRect;<br />
		public:<br />


   


		CXTexture(LPDIRECT3DDEVICE9 pDevice);<br />


   


		~CXTexture();<br /><br />


   


		LPDIRECT3DTEXTURE9 GetTexture() const {return m_Texture;}<br />


   


		void SetTexture(LPDIRECT3DTEXTURE9 Texture) const {m_Texture = Texture;}<br />


   


		LPDIRECT3DDEVICE9 GetDevice() const {return m_pDevice;}<br />


   


		void SetDevice(LPDIRECT3DDEVICE9 pDevice) const {m_pDevice = pDevice;}<br />


   


		D3DXVECTOR2 GetRotationCenter() const {return m_RotationCenter;}<br />


   


		void SetRotationCenter(D3DXVECTOR2 RotationCenter) {m_RotationCenter = 
		RotationCenter;}<br />


   


		D3DXVECTOR2 GetTranslation() const {return m_Translation;}<br />


   


		void SetTranslation (D3DXVECTOR2 Translation) const {m_Translation = 
		Translation;}<br />


   


		D3DXVECTOR2 GetScaling() const {return m_Scaling;}<br />


   


		void SetScaling(D3DXVECTOR2 Scaling) const {m_Scaling = Scaling;}<br />


   


		FLOAT GetRotation() const {return m_Rotation;}<br />


   


		void SetRotation (FLOAT Rotation) const {m_Rotation = Rotation;}<br />


   


		RECT GetRect() const {return m_SrcRect;}<br />


   


		void SetRect(RECT SrcRect) const {m_SrcRect = SrcRect;}<br />


   


		HRESULT LoadFromFile(char* Path);<br />
		};<br /><br />
		CXSprite的主要功能就是在屏幕上显示 CXTexture，因此需要有与 LPDIRECT3DDEVICE9 接口和 
		CXTexture连接的函数。<br /><br />
		class CXSprite<br />
		{<br />
		protected:<br />


   


		LPD3DXSPRITE m_Sprite;<br />


   


		LPDIRECT3DDEVICE9 m_pDevice;<br />
		public:<br />


   


		CXSprite (LPDIRECT3DDEVICE9 pDevice);<br />


   


		~CXSprite ();<br /><br />
   


		LPD3DXSPRITE GetSprite() const {return m_Sprite;}<br />


   


		void SetSprite(LPD3DXSPRITE Sprite) const {m_Sprite = Sprite;}<br />


   


		LPDIRECT3DDEVICE9 GetDevice() const {return m_pDevice;}<br />


   


		void SetDevice(LPDIRECT3DDEVICE9 pDevice) const {m_pDevice = pDevice;}<br />


   


		HRESULT DrawTexture(CXTexture* Texture);<br />
		};<br /><br /><br />
		1.3 Keyboard &amp; Mouse之封装CXKeyboard &amp; CXMouse<br /><br />
		1、何为Keyboard &amp; Mouse<br />
		　　“地球人都知道”。DX9提供的接口 IDirectInputDevice8。<br /><br />
		2、二者的功能<br />
		　　Keyboard：读取键盘的按键信息<br />
		　　Mouse：读取鼠标的按键、位置信息，设置光标属性(如用图片表示光标)。<br /><br />
		3、使用过程<br />
		　　创建 IDirectInput8 对象 DirectInput8Create<br />
		　　创建 IDirectInput8 设备（键盘、鼠标等） CreateDevice<br />
		　　设置设备属性 SetCooperativeLevel<br />
		　　SetDataFormat<br />
		　　获取设备使用权 Acquire<br />
		　　读取设备传入的数据 GetDeviceState<br />
		　　释放设备及 IDirectInput8 Release<br /><br />
		设置鼠标光标过程：<br />
		　　创建光标图片资源： 参照surfaces<br />
		　　设置光标为指定的图片 SetCursorProperties<br />
		　　设置光标的初始位置 SetCursorPosition<br />
		　　显示光标 ShowCursor<br /><br />
		程序段如下：<br /><br />
		LPDIRECTINPUT8 g_lpDI;<br />
		LPDIRECTINPUTDEVICE8 g_Keyboard; <br />
		LPDIRECTINPUTDEVICE8 g_Mouse<br /><br />
		//========================================================<br />
		HRESULT Result = DirectInput8Create(g_hInst, DIRECTINPUT_VERSION, 
		IID_IDirectInput8, (void**)&amp;g_lpDI, NULL);<br /><br />
		if(SUCCEEDED(Result))<br />
		{<br />
    //创建键盘设备<br />
    Result = g_lpDI-&gt;CreateDevice(GUID_SysKeyboard, 
		&amp;g_lpDIDevice, NULL);<br />


   


		if(SUCCEEDED(Result))<br />


   


		{<br />


       
g_lpDIDevice-&gt;SetCooperativeLevel(g_hWnd, DISCL_FOREGROUND | 
		DISCL_NONEXCLUSIVE);<br />


       
g_lpDIDevice-&gt;SetDataFormat(&amp;c_dfDIKeyboard);<br />


   


		}<br />
		}<br /><br />
		//-------------------------------------------------------------------------------------------<br />
		//获取按键信息<br />
		if(SUCCEEDED(g_Keyboard-&gt;Acquire())) //Acquire the device<br />
		{<br />


   


		char KeyState[256];<br />


   


		g_Keyboard-&gt;GetDeviceState(sizeof(KeyState),(LPVOID)&amp;KeyState);<br />


   


		//根据KeyState返回的数据就可以判断按下何键<br />
		}<br /><br />
		//====================================================<br />
		//创建鼠标<br />
		g_lpDI-&gt;CreateDevice(GUID_SysMouse, &amp;g_Mouse, NULL);<br />
		g_Mouse-&gt;SetDataFormat(&amp;c_dfDIMouse);<br />
		g_Mouse-&gt;SetCooperativeLevel(g_hWnd, DISCL_EXCLUSIVE | 
		DISCL_FOREGROUND);<br /><br />
		//------------------------------------------------------------------------<br />
		//设置鼠标光标<br />
		//获取光标图片<br />
		D3DXIMAGE_INFO ImageInfo;<br />
		D3DXGetImageInfoFromFile("C:\\Cursor.jpg”, &amp;ImageInfo);<br />
		g_pd3dDevice-&gt;CreateOffscreenPlainSurface(ImageInfo.Width, 
		ImageInfo.Height, ImageInfo.Format, D3DPOOL_DEFAULT, &amp;g_MouseCursor, 
		NULL);<br />
		D3DXLoadSurfaceFromFile(g_MouseCursor, NULL, NULL, ("C:\\Cursor.jpg”, 
		NULL, D3DX_FILTER_NONE, 0xFF000000, NULL);<br /><br />
		//设置成指定的光标<br />
		g_pd3dDevice-&gt;SetCursorProperties(0,0, g_MouseCursor);<br /><br />
		//初试位置<br />
		g_pd3dDevice-&gt;SetCursorPosition(0,0,D3DCURSOR_IMMEDIATE_UPDATE);<br /><br />
		//显示光标<br />
		g_pd3dDevice-&gt;ShowCursor(true);<br /><br />
		//-------------------------------------------------------------------------<br />
		//获取鼠标信息<br />
		if(SUCCEEDED(g_Mouse-&gt;Acquire()))<br />
		{<br />


   


		DIMOUSESTATE State;<br />


   


		g_Mouse-&gt;GetDeviceState(sizeof(DIMOUSESTATE),(LPVOID)&amp;State);<br />


   


		//信息保存在 State中。<br />
		}<br /><br />
		//==============================================<br />
		//释放设备<br />
		if(g_lpDI != NULL)<br />


   


		g_lpDI-&gt;Release();<br /><br />
		4、封装<br />
		　　CXKeyboard的封装<br /><br />
		class CXKeyboard<br />
		{<br />
		private:<br />


   


		LPDIRECTINPUTDEVICE8 m_pDevice;<br />


   


		char m_KeyState[256];<br />
		public:<br />


   


		CXKeyboard (LPDIRECTINPUT8 pInput, HWND hWnd);<br />


   


		~ CXKeyboard();<br /><br />


   


		bool IsKeyPressed(int Key);<br />


   


		HRESULT Update();<br />
		};<br /><br />
		CXMouseSurface的封装<br /><br />
		为了能制作出动画效果的光标，因此需要一个surfaces列表，因此从CXSurface继承一个CXMouseSurface类，使之能够操作多个图片。<br /><br />
		class CXMouseSurface : public CXSurface<br />
		{<br />
		private:<br />


   


		CXMouseSurface* m_pNext;<br />


   


		int MouseSurfaceType;<br />


   


		UINT HotSpotX;<br />


   


		UINT HotSpotY;<br />
		public:<br />


   


		CXMouseSurface* GetNext() {return m_pNext;}<br />


   


		void SetNext(CXMouseSurface* Surf) {m_pNext = Surf;}<br />


   


		int GetSurfaceType() {return MouseSurfaceType;}<br />


   


		void SetSurfaceType(int Type) {MouseSurfaceType = Type;}<br />


   


		UINT GetHotSpotX() {return HotSpotX;}<br />


   


		UINT GetHotSpotY() {return HotSpotY;}<br />


   


		void SetHotSpotX (UINT X) {HotSpotX = X;}<br />


   


		void SetHotSpotY (UINT Y) {HotSpotY = Y;}<br />


   


		CXMouseSurface(LPDIRECT3DDEVICE9 pDevice) : CXSurface(pDevice) {m_pNext 
		= NULL;}<br />


   


		CXMouseSurface() : CXSurface() {m_pNext = NULL;}<br />
		}；<br /><br />
		CXMouse的封装<br /><br />
		class CXMouse<br />
		{<br />
		private:<br />


   


		CXMouseSurface* m_Surface; //指向光标列表<br />


   


		CXMouseSurface* m_CurrentCursorSurface; //当前光标<br />


   


		LPDIRECTINPUTDEVICE8 m_pDevice;<br />


   


		LPDIRECT3DDEVICE9 m_p3DDevice; <br />


   


		DIMOUSESTATE m_State;<br />


   


		LONG m_iX; <br />


   


		LONG m_iY;<br /><br />
		public:<br />


   


		CXMouse (LPDIRECT3DDEVICE9 pDevice, LPDIRECTINPUT8 pInput, HWND hWnd, 
		bool Exclusive);<br />


   


		~ CXMouse();<br /><br />


   


		HRESULT Update();<br />


   


		LONG GetXPos();<br />


   


		LONG GetYPos();<br />


   


		bool IsButtonPressed(int Button);<br />


   


		HRESULT SetCursorImage();<br />


   


		HRESULT SetMouseCursor(char* FilePath, UINT HotSpotX, UINT HotSpotY, int 
		Type);<br />


   


		void AddCursorSurface(CXMouseSurface* Surface);<br />


   


		CXMouseSurface* GetFirstSurface() {return m_Surface;}<br />


   


		bool SetCursor(int Type);<br />


   


		CXMouseSurface* GetCurrentCursor() {return m_CurrentCursorSurface;}<br />


   


		void SetCurrentCursor(CXMouseSurface* Surface) {m_CurrentCursorSurface = 
		Surface;}<br />


   


		void SetCursorPosition(int X, int Y);<br />


   


		HRESULT SetCursorVisible(bool Show);<br />
		};</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.cppblog.com/swo2006/aggbug/11635.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/swo2006/" target="_blank">swo</a> 2006-08-24 11:23 <a href="http://www.cppblog.com/swo2006/articles/11635.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DirectX基础(ZT)</title><link>http://www.cppblog.com/swo2006/articles/11352.html</link><dc:creator>swo</dc:creator><author>swo</author><pubDate>Thu, 17 Aug 2006 07:43:00 GMT</pubDate><guid>http://www.cppblog.com/swo2006/articles/11352.html</guid><wfw:comment>http://www.cppblog.com/swo2006/comments/11352.html</wfw:comment><comments>http://www.cppblog.com/swo2006/articles/11352.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/swo2006/comments/commentRss/11352.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/swo2006/services/trackbacks/11352.html</trackback:ping><description><![CDATA[
		<font style="font-size: 14pt;" color="#295200">
				<b>DirectX基础(ZT)</b>
		</font>
		<table style="table-layout: fixed;" border="0" cellpadding="0" cellspacing="0" width="90%">
				<tbody>
						<tr valign="top">
								<td width="*">1、什么是DirectX ？ 

<p>微软的DirectX软件开发工具包（SDK）提供了一套优秀的应用程序编程接口（APIs），这个编程接口可以提供给你开发高质量、实时的应用程序所需要的各种资源。DirectX技术的出现将极大的有助于发展下一代多媒体应用程序和电脑游戏。</p><p>总的说来，使用DirectX的主要有两个好处：1、为软件开发者提供硬件无关性；2、为硬件开发提供策略。 </p><p>1、为软件开发者提供硬件无关性</p><p>微软开发DirectX，其最主要的目的之一是促进在Windows操作系统上的游戏和多媒体应用程序的发展。在DirectX出现以前，主要的游
戏开发平台是MS-DOS，游戏开发者们为了使他们的程序能够适应各种各样的硬件设备而绞尽脑汁。自从有了DirectX，游戏开发者们便可以获益于
Windows平台的设备无关性，而又不失去直接访问硬件的特性。DirectX主要的目的就是提供象MS-DOS一样简洁的访问硬件的能力，来实现并且
提高基于MS-DOS平台应用软件的运行效果，并且为个人电脑硬件的革新扫除障碍。</p><p>另一方面，微软公司开发DirectX是为了在当前或今后的计算机操作系统上提供给基于Windows平台的应用程序以高表现力、实时的访问硬件的
能力。DirectX在硬件设备和应用程序之间提供了一套完整一致的接口，以减小在安装和配置时的复杂程度，并且可以最大限度的利用硬件的优秀特性。通过
使用DirectX所提供的接口，软件开发者可以尽情的利用硬件所可能带来的高性能，而不用烦恼于那些复杂而又多变的硬件执行细节。</p><p>一个高表现力的基于Windows平台的游戏将得益于以下几种技术： </p><p>专为提高图形运算及快速反应能力而设计的加速卡（Accelerator cards） <br />即插即用以及其它Windows软硬件 <br />内建于Windows的通信服务, 包括DirectPlay </p><p>2、为硬件开发提供策略</p><p>DirectX的另外一个重要的目的是给硬件厂商提供开发策略，他们可以从高性能程序的开发者和独立的硬件供应商（independent
hardware vendors IHVs）那里得到反馈。所以，在DirectX
程序员参考书中有时可能会提供那些还不存在的硬件加速设备的技术细节。在很多时候，软件可以模拟这些特性，在另外一些情况下，软件根据硬件的指标判断出其
特性，并且可以忽略那些硬件并不支持的性能。</p><p>已经和将要实现的显示设备的特性包括： </p><p>覆盖(Overlays)，由于它的被支持，在图形设备接口中，窗口中的换页（page flipping）将成为可用。换页是用来在整个屏幕上显示画面的双缓冲（double-buffer）方案。 <br />精灵引擎(Sprite engines)，使精灵（不规则图形）覆盖更容易。 <br />插补延展(Stretching with interpolation)，它可以更有效的保存显示内存，因为它可以使小幅画面延展到整个屏幕。 <br />Alpha 融合(Alpha blending)，它可以在硬件像素层（hardware-pixel level)上混合颜色。 <br />带有透视修正（perspective-correct)贴图的3D加速器，它允许你在3D表面上贴图。比如，你可以在用3D软件制作的城堡的走廊里贴上砖块的位图来显示出透视效果。 <br />为3D图象进行的位操作将 Z 方向考虑在内。 </p><p>标准2兆显示内存，这在3D游戏中是最小需求。 <br />压缩标准，这将允许你在显存中储存更多的信息。这个标准不论是在软件还是硬件中执行都会相当快。它将被用在贴图中并且包含透明压缩。 </p><p>将要被包括的声音设备的新特性包括： </p><p>硬件及其外设可以提供空间环绕立体声效果。 <br />声卡上内置音频内存。 <br />音频-视频一体卡可共享其上的内存。 <br />另外，视频回放将得益于今后的与DirectX相兼容硬件加速设备。今后的DirectX版本中的一个特性是将支持硬件加速YUV视频解码。</p><p><br />--------------------------------------------------------------------------------</p><p>2、DirectX的组件</p><p>DirectX SDK为基于Windows平台的应用程序提供了以下几个组件。 </p><p>DirectDraw ：通过直接访问显示硬件来提供高级的图象处理能力。 <br />DirectSound ：它提供了软硬件的低延迟声音混频（low_latency sound mixing）和回放（Playback），硬件加速，以及直接访问音频设备的能力。 <br />DirectPlay ：它明确的提供了通用环境连接能力（generalized communication capabilities），来简化你应用程序之间的通讯服务。 <br />Direct3D ：它为主流的桌上型计算机和Internet用户提供实时的、交互的3D技术。 <br />DirectInput ：它简化你的应用程序访问鼠标、键盘和操纵杆设备的能力。 <br />DirectSetup ：一套简单的API向你提供安装DirectX部件的功能。 <br />AutoPlay ：它也是Win95操作系统的一个特性，当你在光驱内放上光盘，指定的应用程序会自动执行。 </p><p>--------------------------------------------------------------------------------</p><p>3、关于DirectDraw</p><p>DirectDraw是DirectX
SDK大家族中的一员，也是其中最主要的一个部件。DirectDraw允许程序员直接的操作显存、硬件位图映射以及硬件覆盖和换页技术。它在提供这些功
能的同时，也使其与现在的基于Microsoft Windows的应用程序和设备驱动程序相兼容。 </p><p>DirectDraw是一个软件接口，它在提供直接访问显示设备的同时，与Windows图形设备接口（GDI）相兼容。DirectDraw不是
一个高层的图形程序编程接口，它为游戏和Windows子系统软件（例如：3D图形包和数字视频编码）提供了一种与设备无关的途径，以获得访问特定的显示
设备的某些高级特性的能力。</p><p>DirectDraw适用于种类众多的的显示设备，从简单的SVGA显示器到提供裁剪、缩放、和支持非RGB颜色格式的高级硬件实现设备。设计这样
的接口是为了让你的应用程序能够列举低层硬件的能力，并且对那些支持的硬件加速特性加以利用。那些在硬件设备中不能实现的特性，DirectX将仿真出
来。 </p><p>DirectDraw提供了以下几个优点，这些好处在以前只有那些专为特定显示设备所写的软件才能利用。 </p><p>支持双缓冲和换页图形 <br />访问、控制显示卡的位图映射 <br />支持3D z-buffers （z缓存） <br />支持z方向（z-ordering）硬件辅助覆盖。 <br />访问图形缩放硬件 <br />仿真访问标准的和增强的显示设备内存空间 <br />DirectDraw
的任务是用与设备无关的途径来提供依赖于设备的访问显示内存的方法。本质上，DirectDraw管理显示内存。你的应用程序只需要懂得那些一般的关于硬
件与设备有关的知识，比如RGB和YUV色彩格式和两条光栅线之间的pitch（宽距）
。在需要利用位转换或操作调色板寄存器时，你不需要为调用过程中的细节而烦恼。使用DirectDraw，你可以方便的操作显示内存，充分的利用不同类型
的显示设备的位转换和颜色压缩能力，而不需要依赖于某一个特定的硬件。 </p><p>DirectDraw给运行于Windows 95和Windows NT 4.0或更高版本的计算机提供了一个高性能的的游戏图象引擎。 </p><p><br />--------------------------------------------------------------------------------</p><p>4、为什么要使用DirectDraw?</p><p>无庸置疑，人们之所以利用DirectDraw来开发各种游戏以及多媒体应用软件，是因为DirectDraw可以为他们的应用程序带来许多强大的功能提升。</p><p>DirectDraw可以充分评估视频硬件的能力，只要可能，它就会对其某一特性加以利用。例如，如果你的显卡支持硬件Blit，
DirectDraw就会将位图映射这一操作分派给显卡来完成，极大的提升运行速度。此外，当某硬件不支持某项特性时，DirectDraw还提供了硬件
仿真层（HEL）以完成这项操作。 <br />DirectDraw的硬件抽象层（HAL）提供了一个统一的接口，通过它，开发者可以直接的操作显示存储器和视频存储器，从系统硬件中获取最大的表现能力。 <br />DirectDraw运行于Windows95操作系统之上，从系统所提供的32位内存寻址和平面内存模型中获益。DirectDraw将视频和系统存储器视为整块的空间，而不是碎片的集合。如果你曾使用过区段偏移寻址，你将很快就喜爱上这种“平面”内存模型。 <br />对于全屏模式的应用程序，DirectDraw使得多后台缓存的换页操作变得极为容易。 <br />支持窗口和全屏模式应用程序的裁减。 <br />支持3-D z缓存。 <br />支持带z轴方向的硬件辅助覆盖。 <br />可访问图象缩放硬件。 <br />可同时访问标准的和增强的显示设备内存区。 <br />其它的特性，包括动态改变调色板、独占访问硬件、和分辨率切换等等。 <br />合理和有效的利用DirectDraw的这些特性将使开发者很容易就能够写出比基于标准的Windows GDI应用程序，甚至MS-DOS应用程序还要优秀的作品。</p><p><br />--------------------------------------------------------------------------------</p><p>5、DirectX 5.0的新特性</p><p><br />DirectX5.0版本比3.0版拥有更多的创新和新特性（注意：并不存在4.0版）。尽管这样，你用以前版本写的DirectX应用程序同样可以不加修改的运行于DirectX5.0环境中。以下将介绍的是DirectX 5.0中DirectDraw接口的新特性。</p><p>首先，DirectDraw支持Windows98和Windows NT
5.0的多显示器系统。例如，在多显示器环境下，同一台电脑使用两套不同的显示设备和显示器，用户可以将不同的画面显示在两个显示屏幕上，甚至将一个窗口
从一个显示器拖拽到另一个显示器上。DirectDraw5.0支持这样一个系统，允许应用程序在这样的环境中直接的访问和操纵硬件加速特性。</p><p>其次，DirectDraw已经使视频端口（Video-port）具有新的性能，它允许应用程序直接控制数据流从一个硬件视频端口流向一个位于显存中的DirectDraw页面上。这样，使得视频图象的输入和输出对DirectDraw来说都变得极为便利和快速。</p><p>除此之外，DirectDraw的HEL（硬件仿真层）现在可以充分利用Pentium
MMX处理器所带来的多媒体性能的提升。当你第一次创建页面的时候，DirectDraw会测试你的电脑芯片是否支持MMX。而在一台非Pentium
MMX级别电脑上，这个测试会在调试程序的时候给出一个良性的异常信息，而这个异常并不会影响到你的应用程序执行的稳定性。</p><p>DirectDraw接口现在还支持离屏页面的宽度大于主页面的宽度。你可以创建这些页面而不用顾及它的大小，而在以前的版本中，你经常会为了不使页面宽度大于主页面而将其分割开来。</p><p>DirectDraw接口现在已经能够支持高级图形端口（AGP）构架。在装备了AGP显卡的系统中，DirectDraw程序开发者将从AGP显卡的大容量和高传输速率中获益。</p><p><br />--------------------------------------------------------------------------------</p><p>6、部件对象模型（COM）</p><p>DirectX是基于COM的一套软件编程接口。</p><p>部件对象模型（Component Object Model, COM）是OLE 的基础。COM
为OLE提供了编程模型和二进制标准。COM定义并实现了软部件（如应用程序、数据对象、控件及服务）机制，并把它们统称为“对象”。每个软部件对象由数
据以及访问数据的函数组成，访问软部件对象数据的函数的集合称为“接口”。</p><p>从这里可以看出，COM
的设计与C++类非常相似，即一个软部件对象具有一个内部数据结构和一组外部接口函数，允许通过接口函数对数据进行访问。因此Microsoft公司把根
据COM执行的对象统称为Windows对象。但Windows对象与C++中的对象有明显的差别，Windows对象中没有公共数据，也没有成员函数，
因此不能直接访问数据，也就是说数据是全封装的。</p><p>对象的提供者或服务器必须指明一个或多个接口的定义，每个接口都是相互关联的一组函数，执行对象的一个特性。每个对象的一个用户（或称为“客户”）
必须拥有一个接口指针才能访问对象。当客户有了这个指针后，就可以使用这个对象而无需知道对象的含义，即使客户运行在不同的进程、不同的机器、不同的操作
系统、由不同的软件开发而使用不同的语言，或者版本不同。</p><p>DirectX
SDK接口被创建在COM编程层次表中很基础的一层。每一个代表设备的对象的接口，比如IDirectDraw、IDirectSound、和
IDirectPlay，是直接从IUnknown
OLE接口中派生下来的。这些基本对象的创建被操作于在该对象的动态连接库中，要比用Win32中专门用来创建COM对象的
CoCreateInstance函数要好得多。 </p><p>特别的是，DirectX
SDK对象模型为每一个设备提供一个主要的对象。其它的设备对象是由这个主要对象派生下来的。例如，DirectDraw对象代表显示设备。你可以用它来
创建代表显存的主页面（DirectDrawSurface）对象，和代表硬件调色板的调色板（DirectDrawPalette）对象；相似的，
DirectSound对象代表声卡，并且创建DirectSoundbuffer对象来代表声卡上的声音数据。</p><p><br /></p></td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.cppblog.com/swo2006/aggbug/11352.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/swo2006/" target="_blank">swo</a> 2006-08-17 15:43 <a href="http://www.cppblog.com/swo2006/articles/11352.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>