赞
踩
VB6编程:DirectX 2D图形学习日志5:一图看懂创建DX
教程下载地址:https://download.csdn.net/download/gosub60/13696651
现在,我对源码中出现的一些变量,常量,继续做个简单总结:(原创内容,转载请注明出处,谢谢大家支持。)
下边对D3DPRESENT_PARAMETERS(设备显示属性结构体)做一个描述,以下是C++源码:
//D3DPRESENT_PARAMETERS(//设备显示属性结构体) typedef struct _D3DPRESENT_PARAMETERS_ { UINT BackBufferWidth,BackBufferHeight; //后绘图表面的像素宽高 参数1,参数2 D3DFORMAT BackBufferFormat; //后绘图表面的各种数据格式(如像素颜色格式)参数3 UINT BackBufferCount; //后绘图表面的数目 参数4 D3DMULTISAMPLE_TYPE MultiSampleType; //多重采样类型 参数5 DWORD MultiSampleQuality; //多重采样品质 参数6 D3DSWAPEFFECT SwapEffect; //前后绘图表面的交换方式 参数7 HWND hDeviceWindow; //所在的窗口句柄 参数8 BOOL Windowed; //true表示使用窗口;false表示使用全屏 参数9 BOOL EnableAutoDepthStencil; //使能自动深度蒙板 参数10 D3DFORMAT AutoDepthStencilFormat; //自动深度蒙版格式 参数11 DWORD Flags; //后绘图表面可否锁定等标志 参数12 UINT FullScreen_RefreshRateInHz; //屏幕刷新率(如果使用窗口,则必须设置为0) 参数13 UINT PresentationInterval; //前、后绘图表面的最大交换频率 参数14 } D3DPRESENT_PARAMETERS;
此结构体更多的描述可以参考D3DPRESENT_PARAMETERS结构(D3D9Types.h)-Win32应用| 微软文档
这里简单的介绍一下:
参数1:BackBufferWidth 后台缓冲区的宽 以像素为单位
参数2:BackBufferHeight 后台缓冲区的高 以像素为单位
① 以上两个参数 如果Windowed为FALSE(全屏显示时),这两者的值必需符合显卡所支持的分辨率,如1024768,800600,640*480等,可用 DisplayModeCollection EnumAdapterModes 获取显卡支持的分辨率。
②.在窗口模式下,可默认使用0,也可以指定其他大小。
参数3:BackBufferFormat 后台缓冲区格式,即颜色深度和格式(D3DFORMAT),前文已经描述过。1.此值必须是经过Manager的CheckDeviceType确认的像素格式之一。使用Device的DisplayMode可获得当前使用的像素格式。
2.在窗口模式下,必须指定为当前窗口所使用的颜色模式。可以使用D3DFMT_UNKOWN,通知运行库使用当前显示模式的像素格式,也可调用Device的DisplayMode来获取。
3.在全屏模式下,可以使用设备支持的任何颜色模式。用CheckDeviceType方法可以进行检查。(对于窗口应用程序,由于颜色转换可由硬件完成(前提是硬件支持颜色转换),因此后台缓冲区格式不需要匹配显示模式格式。但全屏模式下则无法执行颜色转换,因此在全屏模式下不应该直接获取当前的显示模式,而是指定一个设备支持的显示格式。
参数4:BackBufferCount 后台缓冲区的数目,此值可以在0到D3DPRESENT_BACK_BUFFERS_MAX之间(或在使用Direct3D 9Ex时为D3DPRESENT_BACK_BUFFERS_MAX_EX)。范围是从0到3,如果为0,那就当成1来处理。大多数情况我们只使用一个后备缓冲。使用多个后备缓冲可以使画面很流畅,但是却会造成输入设备响应过慢,还会消耗很多内存。如果后台缓冲区的数目不能被创建,运行时将失败的方法调用和填补这个值与后台缓冲区,可以创建的次数。因此,应用程序可以调用方法两次d3dpresent_parameters结构和期望它第二次工作。
如果一个后台缓冲区无法创建失败的方法。价值backbuffercount影响组交换作用是允许的。具体地说,任何d3dswapeffect_copy交换效果需要一个后台缓冲区。
2.(不知道有没有道理)通常来说,窗口模式的游戏,我们设置为1,全屏模式的游戏,我们设置为0,原因是,窗口模式游戏下,我们的游戏窗口有可能被其他的窗口遮挡住,此时我们需要多设置一个后台缓冲来存放之前的图象,当遮挡的窗口移开后,我们将不必重新绘制后台缓冲区,仅将记忆中的那个缓冲区放到前台就可以恢复我们的游戏窗口了,而全屏模式下,我们不必要去考虑这一点,设置为0,并不是说没有后台缓冲,系统会默认给我们一个的,设置为1,是我们在系统给我们的后台缓冲之外,再重新设置一个后台缓冲。
参数5:MultiSampleType 和 参数6:MultiSampleQuality 多重采样类型和质量,即全屏抗锯齿的类型和级别。
1.这两个参数可能使你的渲染场景变得更好看,但是却消耗你很多内存资源,而且,并不是所有的显卡都支持这两者所设定的功能的。因此在使用时要先检查硬件是否支持。
2.只有当SwapEffect的值为D3DSWAPEFFECT_DISCARD,即交换效果为Discard时,才支持多重采样。所以如果SwapEffect的值不是D3DSWAPEFFECT_DISCARD,此值要设为NONE。
3.MultiSampleType一般设为D3DMULTISAMPLE_NONE:不进行多重采样(不使用抗锯齿),也可使用D3DMULTISAMPLE_1_SAMPLE ~ D3DMULTISAMPLE_16_SAMPLE参数,指定16个不同的重采样级别,每个级别都对应不同的效果(1X - 16X)。
4.MultiSampleQuality的值位于0到1之间,只有当MultiSampleType有设定时该分量才有效。
MultiSampleType
关于:MultiSampleType枚举类型,可以参考:D3DMULTISAMPLE_TYPE enumeration (D3D9Types.h) - Win32 apps | Microsoft Docs
下边是该枚举类型在VB6中的定义
'定义D3DMULTISAMPLE_TYPE Enum D3DMULTISAMPLE_TYPE D3DMULTISAMPLE_NONE = 0 '没有可用的全场景多重采样级别。 D3DMULTISAMPLE_NONMASKABLE = 1 '启用多样本质量值。请参阅备注。 D3DMULTISAMPLE_2_SAMPLES = 2 '可用的全场景多重采样级别。 D3DMULTISAMPLE_3_SAMPLES = 3 '可用的全场景多重采样级别。 D3DMULTISAMPLE_4_SAMPLES = 4 '可用的全场景多重采样级别。 D3DMULTISAMPLE_5_SAMPLES = 5 '可用的全场景多重采样级别。 D3DMULTISAMPLE_6_SAMPLES = 6 '可用的全场景多重采样级别。 D3DMULTISAMPLE_7_SAMPLES = 7 '可用的全场景多重采样级别。 D3DMULTISAMPLE_8_SAMPLES = 8 '可用的全场景多重采样级别。 D3DMULTISAMPLE_9_SAMPLES = 9 '可用的全场景多重采样级别。 D3DMULTISAMPLE_10_SAMPLES = 10 '可用的全场景多重采样级别。 D3DMULTISAMPLE_11_SAMPLES = 11 '可用的全场景多重采样级别。 D3DMULTISAMPLE_12_SAMPLES = 12 '可用的全场景多重采样级别。 D3DMULTISAMPLE_13_SAMPLES = 13 '可用的全场景多重采样级别。 D3DMULTISAMPLE_14_SAMPLES = 14 '可用的全场景多重采样级别。 D3DMULTISAMPLE_15_SAMPLES = 15 '可用的全场景多重采样级别。 D3DMULTISAMPLE_16_SAMPLES = 16 '可用的全场景多重采样级别。 D3DMULTISAMPLE_FORCE_DWORD = &Hffffffff'强制将此枚举编译为32位大小。没有此值,某些编译器将允许此枚举编译为32位以外的大小。不使用该值。 End Enum
参数7:SwapEffect 交换效果,用来指定交换链中的缓冲区如何进行交换(即缓冲区的交换方式,当前后台缓冲区交换后,换下来的那块缓冲区的数据该怎么处理?可以复制,或者丢弃,不同的值效果也不同
1.如果Windowed被设置为true(窗口模式)且SwapEffect被设置为Flip,则无论哪个缓冲区在呈现时成为前台缓冲区,运行库都将创建一个额处的后台缓冲区并进行复制。Copy设置要求BackBufferCount被设置为1。此设置是在调试运行库中强制执行的,调试运行库在任何缓冲区呈现后在其中填入噪音。
(叫DISCARD(丢弃)是因为既然不是你自己控制交换方式,显然你也不关心也不需要后台缓冲的内容,所以每次效换完,后缓冲的内容就“丢弃”了,即不再管理。因此,在需要实现一些特殊效果的时候可能需要多个缓冲区,然后将缓冲区当中的图形进行处理,这个时候就不能使用自动抛弃的方式了。)
2.D3DSWAPEFFECT类型的枚举值:关于此项更多的解释可以参考D3DSWAPEFFECT枚举(D3D9Types.h)-Win32应用| 微软文档
'VB6定义交换效果(D3DSWAPEFFECT)枚举源码
Enum D3DSWAPEFFECT
D3DSWAPEFFECT_DISCARD = 1
D3DSWAPEFFECT_FLIP = 2
D3DSWAPEFFECT_COPY = 3
D3DSWAPEFFECT_OVERLAY = 4
D3DSWAPEFFECT_FLIPEX = 5
D3DSWAPEFFECT_FORCE_DWORD = &HFFFFFFFF
End Enum
下边是参数解释:
D3DSWAPEEFECT_COPY :swap时,拷贝后缓冲区的内容到前缓冲区,后缓冲区的内容不变。
D3DSWAPEEFECT_FLIP :swap时,交换前后缓冲区指针,完成翻页,之后后缓冲区的内容是前缓冲区的内容
D3DSWAPEFFECT_OVERLAY:使用可以覆盖在主表面上的视频内存专用区域。显示覆盖图时不执行任何COPY。覆盖操作在硬件中执行,而无需修改主表面中的数据。
D3DSWAPEFFECT_FLIPEX: 指定应用程序何时采用翻转模式,在此期间,当应用程序以窗口模式显示时,将传递应用程序的帧,而不是将其复制到桌面窗口管理器(DWM)进行合成。翻转模式使应用程序可以更有效地使用内存带宽,并使应用程序可以利用全屏显示的统计信息。翻转模式不会影响全屏行为。
D3DSWAPEFFECT_FORCE_DWORD:强制将此枚举编译为32位大小。没有此值,某些编译器将允许此枚举编译为32位以外的大小。不使用该值。
D3DSWAPEEFECT_DISCARD:可能是COPY也可能是FLIP,由设备来确定最适合当前情况的方式。
D3DSWAPEFFECT_DISCARD:清除后台缓存的内容
D3DSWAPEEFECT_FLIP:保留后台缓存的内容。当缓存区>1时。
D3DSWAPEFFECT_COPY: 保留后台缓存的内容,缓冲区=1时。
(一般情况下使用D3DSWAPEFFECT_DISCARD)
参数8:hDeviceWindow 指定渲染的窗口的句柄,若为NULL,表示使用当前窗口
参数9:Windowed true:如果应用程序运行窗口模式;false:如果应用程序运行的全屏模式。
参数10:EnableAutoDepthStencil 是否开启深度缓存和模板缓存。true表示开启并创建深度及模板缓冲区并由DirectX自动管理。为false时表示不开启。在3D场景中应该开启。
参数11:AutoDepthStencilFormat 设备将创建深度缓冲及模板缓冲区的格式。如果不使用深度模板缓冲(EnableAutoDepthStencil为false),那么这个参数将没有用,可设为NULL。通常会使用D3DFMT_D16格式,即深度值用16位二进制表示。位数越多,场景绘制得越精确,相应内存消耗也会更多。
D3DFMT_D32:指定一个32位的深度缓冲区
D3DFMT_D24S8:指定一个32位的深度/模板缓冲区,其中24位用于深度缓冲区,8位用于模板缓冲区
D3DFMT_D24X8:指定一个32位的深度/模板缓冲区,其中24位用于的度缓冲区,8位空闲
D3DFMT_D24X4S4:指定一个32位的深度/模板缓冲区,其中24位用于深度缓冲区,4位用于模板缓冲区,4位空闲
D3DFMT_D16:指定一个16位的深度缓存区
D3DFMT_D15S1:指定一个16位的深度/模板缓冲区,其中15位用于深度缓冲区,1位用于模板缓冲区
关于此参数的D3DFORMAT枚举类型前文已经表述过了。
参数12:Flags 标志,类型:DWORD。通常指定为0或者NULL。其中的D3DPRESENTFLAG相关定义可以参考官网说明
参数13:FullScreen_RefreshRateInHz 显示适配器刷新屏幕的速率。该值取决于应用程序运行的模式:对于窗口模式,刷新率必须为0。对于全屏模式,刷新率是EnumAdapterModes返回的刷新率之一。
EnumAdapterModes:查询设备以确定指定的适配器是否支持请求的格式和显示模式。可以在循环中使用此方法来枚举所有可用的适配器模式。
D3DPRESENT_RATE_DEFAULT:表示使用默认刷新率,即与屏幕刷新率相同。
D3DPRESENT_RATE_UNLIMITED:表示图形绘制结束后立刻将内容复制到前台缓冲区。
参数14:PresentationInterval 演示间隔,D3DPRESENT标志集合的一个成员。用于指定屏幕的翻转模式,即前后台缓冲区的交换频率。在窗口模式下,其取值为0,只能选用3DPRESENT_INTERVAL_DEFAULT。(SDK推荐一般情况下应使用D3DPRESENT_INTERVAL_DEFAULT,可避免垂直同步,窗口模式下一定要使用该选项。但我们会发现,当游戏卡的时候, 屏幕是一跳一跳的,跳帧现象就是因为我们的后台缓冲还没有渲染完,系统不允许放置到前台,而导致前台缓冲迟迟换不下来,等更替时,我们可能已经进 行了很多操作的原因。)
D3DPRESENT_INTERVAL_DEFAULT:D3D选择交换频率,通常等同于屏幕刷新率
D3DPRESENT_INTERVAL_IMMEDIATE:立即显示更新(或立即交换),不推荐
D3DPRESENT_INTERVAL_ONE:等待一个垂直扫描周期才更新,有助于减少剪断和撕裂效果(其实DEFAULT和ONE完全无区别)
D3DPRESENT_INTERVAL_TWO~FOUR:分别对应等待相应个数周期才更新
(本篇章在编写时部分内容参考了:https://blog.csdn.net/setflvet/article/details/6987532 作者:一剑_ )在此表示感谢!
以上很多信息目前还看不懂,暂时先记录在案。在前述源码中的调用如下:
Direct3D_Window.Windowed = True '该应用程序将处于窗口模式。
Direct3D_Window.SwapEffect = D3DSWAPEFFECT_COPY_VSYNC '监视器运行时刷新。
Direct3D_Window.BackBufferFormat = Display_Mode.Format '设置检索到后缓冲区中的格式。
'清除后缓冲区。
Direct3D_Device.Clear 0, ByVal 0, D3DCLEAR_TARGET, D3DColorRGBA(0, 0, 0, 0), 1#, 0
' 渲染代码在这里,但是在本教程中,它现在是空的。
'将后缓冲区翻转到窗体窗口中。
Direct3D_Device.Present ByVal 0, ByVal 0, 0, ByVal 0
其中D3DCLEAR_TARGET:表示清除渲染目标,或清除多个渲染目标中的所有目标。在后边教程中会有介绍。
D3DCOLOR:定义基本的Direct3D颜色类型。一个四字节的值,通常代表一种颜色的alpha,红色,绿色和蓝色分量。它也可以代表亮度和亮度。您可以使用以下宏之一来设置D3DCOLOR类型。
D3DCOLOR_ARGB(a,r,g,b) - 第一个byte表示Alpha值,后面三个byte本别表示红,绿,蓝。
D3DCOLOR_RGBA(r,g,b,a) - 前三个byte分别表示红,绿,蓝,最后一个byte是Alpha值
D3DCOLOR_XRGB(r,g,b) - Alpha值为1,三个byte分别表示红,绿,蓝
D3DCOLOR_XYUV(y,u,v) - 没用过,不熟悉,暂不介绍
D3DCOLOR_AYUV(a,y,u,v) - 没用过,不熟悉,暂不介绍
D3DCOLOR_COLORVALUE(r,g,b,a) - 与D3DCOLOR_RGBA(r,g,b,a)类似,不同的是参数都是浮点值,范围[0.0-1.0]
在后边的教程中会介绍更多的内容。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。