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_D3DFORMATD3DFMT_UNKNOWN = 0D3DFMT_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 D3DDISPLAYMODEWidth As LongHeight As LongRefreshRate As LongFormat As CONST_D3DFORMAT
End Type

不过在前述的3个教程例子里没有用到此结构体,他是直接使用的:

        Private Const COLOR_DEPTH_32_BIT As Long = D3DFMT_X8R8G8B8Display_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当前参数结构)见下一日志。

VB6编程:DirectX 2D图形学习日志4:总结前3课相关推荐

  1. VB6编程:DirectX 2D图形学习日志20伽玛校正

    VB6编程:DirectX 2D图形学习日志20伽玛校正 教程下载地址:https://download.csdn.net/download/gosub60/13696651 作用:通过按↑和下方向键 ...

  2. VB6编程:DirectX 2D图形学习日志22创建卡通动画

    VB6编程:DirectX 2D图形学习日志22创建卡通动画 教程下载地址:https://download.csdn.net/download/gosub60/13696651 作用:使用多幅BMP ...

  3. VB6编程:DirectX 2D图形学习日志1创建一个全屏窗口

    2020/12/11:从今天开始学习DirectX 2D图形编程,从0基础开始,希望能坚持下去.有兴趣一起学习的小伙伴可以关注我,当我有一周以上的时间没有发文,请发帖给我鼓鼓劲,毕竟自学编程是一件很辛 ...

  4. Win32 OpenGL编程(4) 2D图形基础(颜色及坐标体系进阶知识)

    Win32 OpenGL 编程 (4) 2D 图形基础(颜色及坐标体系进阶知识) write by 九天雁翎 (JTianLing) -- blog.csdn.net/vagrxie 讨论新闻组及文件 ...

  5. Win32 OpenGL编程系列 2D例子 -- 七巧板图形绘制

    write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie 讨论新闻组及文件 OpenGL系列文章都已经写到3D部分了,但是感觉2D的例子还是少了点,特意弄个外 ...

  6. Python学习日志 3.5

    Python学习日志 RBHGO的主页欢迎关注 温馨提示:创作不易,如有转载,注明出处,感谢配合~ 目录 文章目录 Python学习日志 目录 第3.5课:Python分支结构和循环结构的应用 例子1 ...

  7. DX9绘图-------VB6编程学习DX9游戏编程DirectX9编程2D小游戏源码冷风引擎CoolWind2D游戏引擎(8)

    DX9绘图 前边讲了一些绘图基础,看不懂不要紧,其实我也看不懂哦.数学基础不好的话,确实不容易看懂,但只要懂的调用,能完成想要做的工作,那就马马虎虎吧,若是深入研究的话,建议买本计算机视觉艺术,计算机 ...

  8. DX9绘图基础-------VB6编程学习DX9游戏编程DirectX9编程2D小游戏源码冷风引擎CoolWind2D游戏引擎(7)

    ** 绘图基础 ** 一:清除后备缓冲区 在度娘搜索 "DX9绘图"或者"DirectX9绘图",出来的东西不少,几乎找不到VB6的!还有会出来一个机器人,也叫 ...

  9. 2021.1.17-Robocup 2D学习日志

    2021.1.17-Robocup 2D学习日志 环境平台 比赛平台server和monitor 球员客户端client 比赛规则 自动裁判 人为干预 基本的资料 环境平台 比赛平台server和mo ...

最新文章

  1. cacti系列(一)之cacti的安装及配置监控mysql服务
  2. php程序应用实例,PHP教程.应用实例1_php
  3. LLDB+Python脚本:增强LLDB调试
  4. 生成JSON数据--官方方法
  5. python requests text content_python requests的content和text方法的区别
  6. 私有云存储搭建(owncloud)
  7. 永远的GetLong
  8. HDU - 1150 Machine Schedule(最小点覆盖-二分图最大匹配)
  9. spring注解( @Autowired、@Qualifier、@Resource、@PostConstruct、@PreDestroy、 @Component、@Scope)-描述的比较清楚
  10. cad在布局怎么调比例_CAD中如何在布局空间调整图形比例?
  11. puppet之判断和class
  12. c#学习5,处理异常
  13. [2018.09.08 T2] 最大土地面积
  14. jmeter面试题及答案
  15. js笔记,自封装篇(二)之对象克隆
  16. X电容Y电容如何选择与使用
  17. maya阿诺德渲染失败_Arnold 批渲染失败
  18. python plc fx5u_三菱PLC FX5U定位编程时的注意事项说明
  19. 子网掩码和IP地址的关系
  20. 送书 | 哈佛大学单细胞课程:笔记汇总前篇

热门文章

  1. 音频参数获取:采样率、比特率,通道数
  2. android 状态栏隐藏 源码分析,Android 沉寖状态栏与透明状态栏
  3. 转:SAP存货分析报表
  4. dd命令 备份和恢复磁盘 linux系统下
  5. 第三天学习--Shell命令脚本
  6. MethodInfo类的一般使用!
  7. ppt如何添加备注 PPT备注怎么用
  8. 使用VuePress搭建在线文档网站
  9. 对话式服务思考,如何在 Messenger 用聊天机器人做好客户服务
  10. 一个简单的网站首页制作