当前位置:   article > 正文

VB6编程:DirectX 2D图形学习日志4:总结前3课_directx与vb6程序开发电子书

directx与vb6程序开发电子书

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对象。
  • 1
  • 2

二、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 '表示硬件渲染。
  • 1
  • 2
  • 3

其次,在定义相关参数后,再用 Direct3D8 接口中的CreateDevice函数创建:(源码为C++)
该函数原型://创建DX渲染设备(CreateDevice函数)

HRESULT CreateDevice(
    UINT Adapter, //显示卡编号
    D3DDEVTYPE DeviceType,//设备类型
    HWND hFocusWindow,//所属窗口句柄
    DWORD BehaviorFlags,//设备行为标志
    D3DPRESENT_PARAMETERS* pPresentationParameters, //显示属性参数
    IDirect3DDevice8** ppReturnedDeviceInterface  //返回的设备接口指针
);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

参数解释如下:
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   //显示模式
);                              
  • 1
  • 2
  • 3
  • 4

参数解释:
Adapter: 代表需要获得信息的显示器适配器。D3DADAPTER_DEFAULT始终是(默认的)主要的显示器适配器。
pMode: 一个用于获得显示器信息的指针
在前述VB6里源码是:

Dim Display_Mode As D3DDISPLAYMODE '显示模式说明
Direct3D.GetAdapterDisplayMode D3DADAPTER_DEFAULT, Display_Mode 
  • 1
  • 2

四、关于:D3D显示模式(D3DDISPLAYMODE),该结构体原型如下(C++源码)
//显示模式结构体(D3DDISPLAYMODE)

ypedef struct _D3DDISPLAYMODE{
 UINT Width;             //屏幕像素宽度
 UINT Height;            //屏幕像素高度
 UINT RefreshRate;       //刷新率
 D3DFORMAT Format;       //显卡使用的各种绘图表面格式
}D3DDISPLAYMODE;               
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

参数解释如下:
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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

'颜色深度概念:颜色深度是指每个像素可以显示的颜色数,一般是用“位-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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

不过在前述的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作为设备窗口。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

然后根据窗口开关变量:Fullscreen_Enabled = 1 全屏;=0 窗口化
来创建窗口类型。

Set Direct3D_Device = Direct3D.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, frmMain.hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, Direct3D_Window)
  • 1

关于相关参数D3DPRESENT_PARAMETERS结构(D3D当前参数结构)见下一日志。

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/125240
推荐阅读
相关标签
  

闽ICP备14008679号