GraphicsCore包含的类看看表:
Graphics Core 组件 | |
类 | 描述 |
cGraphics | D3D初始化句柄,设置渲染状态,设置纹理、材质、灯光 |
cTexture | 保存一个纹理和一个显示2-D部分纹理的函数 |
cMaterial | 保存一个材质的定义 |
cLight | 包含一个灯光的定义 |
cFont | 封装了ID3DXFont对象 |
cVertexBuffer | 一个使处理顶点缓冲的处理变得简单的类 |
cWorldPosition | 控制一个世界变换矩阵,是你能够快速定位、缩放、旋转对象。 |
cCamera | 包含一个视角变换矩阵,你可以使用对象的接口进行修改 |
cMesh | 包含一个从.x文件读取的网格和材质列表,需要与cObject类一起使用 |
cObject | 这个类描述了一个3-D世界的对象。他控制对象的位置方向、网格、动画状态等 |
cAnimmation | 包含一个从.x文件读取的动画。需要和cObject一起使用 |
2.1 The Graphics System with cGraphics
使用cGraphics可以设置演示模式(display modes)、渲染状态(render states)、清空(clear)设备、等等。当一个cGraphics对象被初始化了,就可以与每个GraphicsCore类联系使用。先看一下cGraphics的声明:
class cGraphics { protected: HWND m_hWnd; // 父窗口句柄 IDirect3D8 *m_pD3D; // Direct3D 对象 IDirect3DDevice8 *m_pD3DDevice; // Device 对象 ID3DXSprite *m_pSprite; // 2-D sprite object(精灵对象) D3DDISPLAYMODE m_d3ddm; // Display mode properties(演示模式) BOOL m_Windowed;// 是否窗口化 BOOL m_ZBuffer; // 是否使用ZBuffer BOOL m_HAL; // 是否使用硬件加速 long m_Width; // display mode的宽 long m_Height; // display mode 的高 char m_BPP; // Bits-per-pixel(比特/像素)of display char m_AmbientRed; // Ambient light red(环境光红色量) char m_AmbientGreen; // Ambient light green(环境光绿色量) char m_AmbientBlue; // Ambient light blue(环境光蓝色量)
public: cGraphics(); // 构造函数 ~cGraphics(); // 析构函数 // Functions to retrieve COM interfaces(找回COM接口的函数) IDirect3D8 *GetDirect3DCOM(); IDirect3DDevice8 *GetDeviceCOM(); ID3DXSprite *GetSpriteCOM(); BOOL Init(); //初始化graphics对象 BOOL Shutdown(); // 释放 graphics 对象 // 使用指定的属性初始化演示模式(display mode) BOOL SetMode(HWND hWnd, BOOL Windowed = TRUE, / BOOL UseZBuffer = FALSE, / long Width = 0, long Height = 0, / char BPP = 0); // 获得演示模式的数量并返回他的信息 long GetNumDisplayModes(); BOOL GetDisplayModeInfo(long Num, D3DDISPLAYMODE *Mode); // 返回指定演示格式的BBP(比特/像素) char GetFormatBPP(D3DFORMAT Format); // 查看如果指定模式存在. // 设置格式和窗口,这时HAL为TRUE则启用硬件加速,为FALSE不使用 BOOL CheckFormat(D3DFORMAT Format, BOOL Windowed, BOOL HAL); BOOL Display(); // Display backbuffer (perform a flip)演示缓冲区(执行一帧) BOOL BeginScene(); // Call before rendering anything在演示(render)任何东西之前调用 BOOL EndScene(); // Call after rendering everything在演示(render)每个东西之后调用 BOOL BeginSprite(); // Call to allow sprite drawing启用精灵绘图 BOOL EndSprite(); // Call to finish sprite drawing关闭精灵绘图 // Functions to clear the display and/or zbuffer(清除函数) BOOL Clear(long Color = 0, float ZBuffer = 1.0f); BOOL ClearDisplay(long Color = 0); BOOL ClearZBuffer(float ZBuffer = 1.0f); // 获得尺寸或BPP long GetWidth(); long GetHeight(); char GetBPP(); // 检查是否启用了硬件加速,是否开启了ZBuffer BOOL GetHAL(); BOOL GetZBuffer(); // 设置投影变换 BOOL SetPerspective(float FOV=D3DX_PI/4, / float Aspect=1.3333f, / float Near=1.0f, float Far=10000.0f); // 设置世界和视角变换 BOOL SetWorldPosition(cWorldPosition *WorldPos); BOOL SetCamera(cCamera *Camera); // 设置当前灯光、材质、纹理 BOOL SetLight(long Num, cLight *Light); BOOL SetMaterial(cMaterial *Material); BOOL SetTexture(short Num, cTexture *Texture); // 设置和活的环境光等级/D3DCOLOR structure BOOL SetAmbientLight(char Red, char Green, char Blue); BOOL GetAmbientLight(char *Red, char *Green, char *Blue); // 是否开启灯光 BOOL EnableLight(long Num, BOOL Enable = TRUE); // 开启 lighting(灯光), zbuffering(深度缓冲), alphablending(alpha混合) // alphatesting(alpha测试).混合有可选择的混合值. BOOL EnableLighting(BOOL Enable = TRUE); BOOL EnableZBuffer(BOOL Enable = TRUE); BOOL EnableAlphaBlending(BOOL Enable = TRUE, / DWORD Src = D3DBLEND_SRCALPHA, / DWORD Dest = D3DBLEND_INVSRCALPHA); BOOL EnableAlphaTesting(BOOL Enable = TRUE); }; |
你可以很好的处理cGraphics,并且所有都是以cGraphics::Init开始的。
现在,你可以枚举出各种不同的演示模式或jump right in 并调用cGraphics::SetMode 用来让球滚动。SetMode函数仅仅只需要一个父窗口的句柄就可以达到最小化的运用。默认的,模式为窗口化的,并且没有ZBuffer。
如果你想使用全屏模式,你可以设置windowed参数为FALSE并指定有效的宽高,BPP值。如果你将这三个值设置为0,SetMode将使用当前桌面的设置。如果你使用窗口化的,并制定了不同于先前的宽高模式,父窗口将重新调整窗口的宽高
NOTE: cGraphics::SetMode函数是非常有用的一个函数。他可以决定是否启用硬件加速和深度缓冲(ZBuffer).如果这两个都不启用,SetMode将是Direct3D努力实现这样的功能,并去掉深度缓冲以使得模式被设置 |
现在,你可能会疑惑下面要干什么。在绘制(render)任何东西之前,你必须首先调用cGraphics::BeginScene函数。绘制完毕,调用cGraphics::EndScene.然后再调用cGraphics::Display去显示你的图像。
现在你可以打开灯光(lights),材质、纹理。
如果要使用灯光,你需要调用EnableLighting函数来启用灯光。Alpha混合可以很好的工作但是你必须指定有效的混合值(源、目标混合)。Alpha测试将帮助你画出那些令人讨厌的透明纹理