2. The Graphics Core

 

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);

// 查看如果指定模式存在.

// 设置格式和窗口,这时HALTRUE则启用硬件加速,为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(深度缓冲), alphablendingalpha混合)

// alphatestingalpha测试).混合有可选择的混合值.

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值。如果你将这三个值设置为0SetMode将使用当前桌面的设置。如果你使用窗口化的,并制定了不同于先前的宽高模式,父窗口将重新调整窗口的宽高

NOTE: cGraphics::SetMode函数是非常有用的一个函数。他可以决定是否启用硬件加速和深度缓冲(ZBuffer.如果这两个都不启用,SetMode将是Direct3D努力实现这样的功能,并去掉深度缓冲以使得模式被设置

 

现在,你可能会疑惑下面要干什么。在绘制(render)任何东西之前,你必须首先调用cGraphics::BeginScene函数。绘制完毕,调用cGraphics::EndScene.然后再调用cGraphics::Display去显示你的图像。

现在你可以打开灯光(lights,材质、纹理。

如果要使用灯光,你需要调用EnableLighting函数来启用灯光。Alpha混合可以很好的工作但是你必须指定有效的混合值(源、目标混合)。Alpha测试将帮助你画出那些令人讨厌的透明纹理

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值