赞
踩
VB6编程:DirectX 2D图形学习日志4:总结前1-3课
教程下载地址:https://download.csdn.net/download/gosub60/13696651
现在,我对源码中出现的一些变量,常量,做了个简单的总结:(原创内容,转载请注明出处,谢谢大家支持。)
一、D3D对象 ( D3D Object)
主要讲述以下几方面的内容:
1.关于D3D对象
微软Direct3D时基于COM的对象和接口的,Direct3D编程的第一步必须建立这个对象。而且程序结束后, 你必须最后释放该对象。
2.建立D3D对象
在VB6中,你可以用如下代码建立一个D3D对象:
Set DirectX8 = New DirectX8 '创建DirectX对象。
Set Direct3D = DirectX8.Direct3DCreate() '使用DirectX对象创建Direct3D对象。
二、D3D设备 ( D3D Device )
1.什么是D3D设备?
一个D3D设备接口可以简单的认为是本机一块显卡的抽象,它包含了显卡所有的硬件参数及状态值,比如 说,显卡显存的数量和起始的线性地址,是否支持深度缓冲(Depth Buffer),雾化(Fog),纹理(Texture) 及MipMap等。
2.D3D设备的功能
在D3D编程中,一个D3D设备接口主要能完成以下的功能模块:
a. 转换功能(Transformation): 主要完成对3D 模型数据的转换,例如,世界转换( World transformation),视转换(View transformation),投影转换(Projection transformation)。
b. 灯光照明功能: 完成对场景的灯光渲染,例如,设置环境光,方向光等。
c. 光栅化显示功能: 根据设置的一些3D或2D状态参数和当前屏幕显示模式以及剪切等情况,将3D或2D图形在屏幕 上显示出来。
3.D3D设备的类型
在DirectX 8.0中,支持三种类型的D3D设备:硬件抽象层设备,参比设备,软件模拟设备,每一种设备可 以认为是一种独立的3D驱动程序,但也各有用途和优势,下面详细说明。
a. 硬件抽象层设备 ( HAL Device):D3D中最主要的设备类型,基于显卡的硬件功能,具有很快的3D或2D硬件 加速功能,能执行硬件或软件的顶点数据处理。缺点是必须有3D显卡支持,目前一块支持DX8或者DX9的3D显卡只需要300元,当然,越好的显卡价格越贵,功能也越多,因此,并不是每种显卡都支持所有的3D功能,所以在使用该设备 时,必须经常查询显卡支持的功能,对不支持的用软件设备来模拟。
b. 软件模拟设备(Software Device): 顾名思义,是用软件的方法来模拟3D的一些功能。依赖于一些特 殊的CPU指令集( 比如,AMD 3D-Now, Intel MMX指令集), 软件模拟设备也能获得较高的3D性能。而 且软件模拟设备具有硬件抽象层设备一样的函数接口,使用方便。缺点是大量占用CPU资源,运行速度 较慢,只适合同硬件抽象层设备配合使用。
c. 参比设备(Reference Device):是微软Direct3D支持的一种附加设别类型,它也依赖于特殊的CPU指令 集,但同软件模拟设备相比,它更注重模拟的精确性,而不是速度方面。所以它一般应用于对3D硬件 的测试和硬件功能的演示上。
4.建立D3D设备:
在DirectX 8.0中,建立一个D3D设备首先要对Direct3D8设备声明:
VB6源码:
Private DirectX8 As DirectX8 '主DirectX对象。
Private Direct3D As Direct3D8 '控制3D一切。
Private Direct3D_Device As Direct3DDevice8 '表示硬件渲染。
其次,在定义相关参数后,再用 Direct3D8 接口中的CreateDevice函数创建:(源码为C++)
该函数原型://创建DX渲染设备(CreateDevice函数)
HRESULT CreateDevice(
UINT Adapter, //显示卡编号
D3DDEVTYPE DeviceType,//设备类型
HWND hFocusWindow,//所属窗口句柄
DWORD BehaviorFlags,//设备行为标志
D3DPRESENT_PARAMETERS* pPresentationParameters, //显示属性参数
IDirect3DDevice8** ppReturnedDeviceInterface //返回的设备接口指针
);
参数解释如下:
Adapter: 显示卡编号,序数所指示的显示器适配器。D3DADAPTER_DEFAULT始终是(默认的)主要的显示器适配器。
DeviceType: 设备类型,在D3DDEVTYPE列举的成员,表示预设类型的驱动器类型,在HAL(Hardware Accelerator,硬件加速)和REF(Reference Rasterizer,一调试工具)之间选择。这里有第三个选项,软件渲染,作用是设计能支持自定义渲染的插件。DirectX DDK(驱动程序开发工具包)就能做到,但如果你能自己写出3D渲染器的话,是不太可能使用VB的J……请指定参数D3DDEVTYPE_HAL(硬件加速)或D3DDEVTYPE_REF(软件模拟) 。,如果预设的设备类型是无效的,即如果不支持硬件加速,调用此函数就会失败,你就不能创建设备。
hFocusWindow: 所属窗口句柄,与设备相关的窗口句柄,你想在哪个窗口绘制就写那个窗口的句柄。前述的例子默认的窗口均是:frmMain
BehaviorFlags: 设定为D3DCREATE_SOFTWARE_VERTEXPROCESSING(软件顶点处理) 或者D3DCREATE_HARDWARE_VERTEXPROCESSING(硬件顶点处理) ,使用前应该用d3dcaps来检测用户计算机是否支持硬件顶点处理功能。前述的例子默认的是:D3DCREATE_SOFTWARE_VERTEXPROCESSING(软件顶点处理)
PresentationParameters: 一个D3DPRESENT_PARAMETERS 类型的变量,用于指定将要创建设备的各种信息(关于D3DPRESENT_PARAMETERS 类型的结构在下一文章中注释)
ppReturnedDeviceInterface: 一个DIRECT3DDEVICE9类型的指针用来返回创建的设备
**返回值:**如果函数调用成功,返回值是D3D_OK。如果这个方法行不通,返回值可以是下列返回值的其中之一: D3DERR_INVALIDCALL :这个函数的调用是无效的时候返回。例如,函数的参数为一个无效值。 D3DERR_NOTAVAILABLE :当前设备不支持所设类型的时候返回。 请 D3DERR_OUTOFVIDEOMEMORY :没有足够的显存执行操作的时候返回。
三、关于:GetAdapterDisplayMode(获取适配器显示模式) 该函数原型如下(C++源码):
//获得显卡的显示模式(GetAdapterDisplayMode)
HRESULT IDirect3D::GetAdapterDisplayMode(
UINT Adapter, //显卡号
D3DDISPLAYMODE* pMode //显示模式
);
参数解释:
Adapter: 代表需要获得信息的显示器适配器。D3DADAPTER_DEFAULT始终是(默认的)主要的显示器适配器。
pMode: 一个用于获得显示器信息的指针
在前述VB6里源码是:
Dim Display_Mode As D3DDISPLAYMODE '显示模式说明
Direct3D.GetAdapterDisplayMode D3DADAPTER_DEFAULT, Display_Mode
四、关于:D3D显示模式(D3DDISPLAYMODE),该结构体原型如下(C++源码)
//显示模式结构体(D3DDISPLAYMODE)
ypedef struct _D3DDISPLAYMODE{
UINT Width; //屏幕像素宽度
UINT Height; //屏幕像素高度
UINT RefreshRate; //刷新率
D3DFORMAT Format; //显卡使用的各种绘图表面格式
}D3DDISPLAYMODE;
参数解释如下:
Width: 类型:Unit(一个无符号的INT。 范围是0到4294967295十进制。关于windows的数据类型可参考:Windows数据类型(BaseTsd.h)-Win32应用| 微软文档) 屏幕宽度,以像素为单位。
Height: 类型:Unit ,屏幕高度,以像素为单位。
RefreshRate: 类型:Unit,刷新率。值0表示适配器默认值。
D3DFORMAT Format: 类型:D3DFORMAT,所述的构件D3DFORMAT枚举类型,描述了显示模式的表面格式:颜色深度。D3DFORMAT枚举类型可以参考D3DFORMAT (D3D9Types.h) - Win32 apps
如果使用VB6定义 D3DFORMAT枚举类型那么可以如下:
'VB6定义D3DFORMAT枚举类型 Enum CONST_D3DFORMAT D3DFMT_UNKNOWN = 0 D3DFMT_R8G8B8 = 20 '(&H14) D3DFMT_A8R8G8B8 = 21 '(&H15) D3DFMT_X8R8G8B8 = 22 '(&H16) D3DFMT_R5G6B5 = 23 '(&H17) D3DFMT_X1R5G5B5 = 24 '(&H18) D3DFMT_A1R5G5B5 = 25 '(&H19) D3DFMT_A4R4G4B4 = 26 '(&H1A) D3DFMT_R3G3B2 = 27 '(&H1B) D3DFMT_A8 = 28 '(&H1C) D3DFMT_A8R3G3B2 = 29 '(&H1D) D3DFMT_X4R4G4B4 = 30 '(&H1E) D3DFMT_A8P8 = 40 '(&H28) D3DFMT_P8 = 41 '(&H29) D3DFMT_L8 = 50 '(&H32) D3DFMT_A8L8 = 51 '(&H33) D3DFMT_A4L4 = 52 '(&H34) D3DFMT_V8U8 = 60 '(&H3C) D3DFMT_L6V5U5 = 61 '(&H3D) D3DFMT_X8L8V8U8 = 62 '(&H3E) D3DFMT_Q8W8V8U8 = 63 '(&H3F) D3DFMT_V16U16 = 64 '(&H40) D3DFMT_W11V11U10 = 65 '(&H41) D3DFMT_D16_LOCKABLE = 70 '(&H46) D3DFMT_D32 = 71 '(&H47) D3DFMT_D15S1 = 73 '(&H49) D3DFMT_D24S8 = 75 '(&H4B) D3DFMT_D24X8 = 77 '(&H4D) D3DFMT_D24X4S4 = 79 '(&H4F) D3DFMT_D16 = 80 '(&H50) D3DFMT_VERTEXDATA = 100 '(&H64) D3DFMT_INDEX16 = 101 '(&H65) D3DFMT_INDEX32 = 102 '(&H66) D3DFMT_DXT1 = 827611204 '(&H31545844) D3DFMT_DXT2 = 844388420 '(&H32545844) D3DFMT_DXT3 = 861165636 '(&H33545844) D3DFMT_DXT4 = 877942852 '(&H34545844) D3DFMT_DXT5 = 894720068 '(&H35545844) D3DFMT_YUY2 = 844715353 '(&H32595559) D3DFMT_UYVY = 1498831189 '(&H59565955) End Enum
'颜色深度概念:颜色深度是指每个像素可以显示的颜色数,一般是用“位-Bit”为单位来描述的。
'举例说明:
’ (1)如果一个图片支持256种颜色(如GIF格式),那么就需要256=2^8 个不同的值来表示不同的颜色。也就是从0到255,用二进制表示就是从00000000到11111111,总共需要8位二进制数,所以颜色深度是8 Bit。
’
’ (2)如果是BMP格式,则最多可以支持红、绿、蓝各256种,不同的红绿蓝组合可以构成256的3次方种颜色,就需要3个8位的2进制数,总共24位,所以颜色深度是24 Bit。
’
’ (3)还有PNG格式,这种格式除了支持24位的颜色外,还支持alpha通道(就是控制透明度用的),总共是32位,所以颜色深度是32 Bit。颜色深度越大,图片占的空间越大。
’
综上所述,在VB6中如果有需要,我们可以定义以下D3DDISPLAYMODE,源码如下:
'定义显示模式结构体
Type D3DDISPLAYMODE
Width As Long
Height As Long
RefreshRate As Long
Format As CONST_D3DFORMAT
End Type
不过在前述的3个教程例子里没有用到此结构体,他是直接使用的:
Private Const COLOR_DEPTH_32_BIT As Long = D3DFMT_X8R8G8B8
Display_Mode.Width = 1024'屏幕宽度
Display_Mode.Height = 768'屏幕高度
Display_Mode.Format = COLOR_DEPTH_32_BIT'颜色深度
Direct3D_Window.Windowed = False ''该应用程序将处于全屏模式。
Direct3D_Window.BackBufferCount = 1 ''仅1个后缓冲
Direct3D_Window.BackBufferWidth = Display_Mode.Width '使后缓冲宽度与显示宽度匹配
Direct3D_Window.BackBufferHeight = Display_Mode.Height '使后缓冲高度与显示高度匹配
Direct3D_Window.hDeviceWindow = frmMain.hWnd '使用frmMain作为设备窗口。
然后根据窗口开关变量:Fullscreen_Enabled = 1 全屏;=0 窗口化
来创建窗口类型。
Set Direct3D_Device = Direct3D.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, frmMain.hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, Direct3D_Window)
关于相关参数D3DPRESENT_PARAMETERS结构(D3D当前参数结构)见下一日志。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。