VB6编程:DirectX 2D图形学习日志16第10课总结

VB6编程:DirectX 2D图形学习日志16第10课总结
教程下载地址:https://download.csdn.net/download/gosub60/13696651
本课教程作者将一些过程模块化了,模块化的好处不言而喻。

模块一:初始化DirectX和Direct3D。
此模块主要作用**①初始化DirectX和Direct3D。②根据全屏还是窗口化创建渲染设备,比如顶点着色这类的(这2点前边已经总结过了)
③ 设置当前分配的纹理的状态值。**使用 SetTextureStageState实现
该函数原型C++源码如下:

HRESULT SetTextureStageState(
  DWORD                    Stage,
  D3DTEXTURESTAGESTATETYPE Type,
  DWORD                    Value
);

参数介绍如下:
Stage : 为其设置状态值的纹理的阶段标识。阶段标识符从零开始。设备最多可以具有八个设置纹理,因此Stage允许的最大值为7。

Type :要设置的纹理状态。此参数可以是D3DTEXTURESTAGESTATETYPE枚举类型的任何成员。(比如D3DTSS_MINFILTER=17)
枚举类型如下:

typedef enum D3DTEXTURESTAGESTATETYPE { 
  D3DTSS_COLOROP                = 1,
  D3DTSS_COLORARG1              = 2,
  D3DTSS_COLORARG2              = 3,
  D3DTSS_ALPHAOP                = 4,
  D3DTSS_ALPHAARG1              = 5,
  D3DTSS_ALPHAARG2              = 6,
  D3DTSS_BUMPENVMAT00           = 7,
  D3DTSS_BUMPENVMAT01           = 8,
  D3DTSS_BUMPENVMAT10           = 9,
  D3DTSS_BUMPENVMAT11           = 10,
  D3DTSS_TEXCOORDINDEX          = 11,
  D3DTSS_BUMPENVLSCALE          = 22,
  D3DTSS_BUMPENVLOFFSET         = 23,
  D3DTSS_TEXTURETRANSFORMFLAGS  = 24,
  D3DTSS_COLORARG0              = 26,
  D3DTSS_ALPHAARG0              = 27,
  D3DTSS_RESULTARG              = 28,
  D3DTSS_CONSTANT               = 32,
  D3DTSS_MINFILTER               =17,
  D3DTSS_FORCE_DWORD            = 0x7fffffff
} D3DTEXTURESTAGESTATETYPE, *LPD3DTEXTURESTAGESTATETYPE;

Value :定义纹理阶段的纹理过滤模式。要设定的状态值。该值的含义由Type参数确定。 D3DTEXTUREFILTERTYPE枚举如下:

typedef enum D3DTEXTUREFILTERTYPE { 
  D3DTEXF_NONE             = 0,
  D3DTEXF_POINT            = 1,
  D3DTEXF_LINEAR           = 2,
  D3DTEXF_ANISOTROPIC      = 3,
  D3DTEXF_PYRAMIDALQUAD    = 6,
  D3DTEXF_GAUSSIANQUAD     = 7,
  D3DTEXF_CONVOLUTIONMONO  = 8,
  D3DTEXF_FORCE_DWORD      = 0x7fffffff
} D3DTEXTUREFILTERTYPE, *LPD3DTEXTUREFILTERTYPE;

在本例中的调用如下:

'不需要这些行,但能够过滤掉
     '使它们看起来更好的纹理。
        Direct3D_Device.SetTextureStageState 0, D3DTSS_MINFILTER, D3DTEXF_POINT
        Direct3D_Device.SetTextureStageState 0, D3DTSS_MAGFILTER, D3DTEXF_POINT

④增加了一个错误处理程序,如果初始化DX失败则调用错误处理程序,关闭程序。

On Error GoTo Error_Handler

Error_Handler:
    
    MsgBox "初始化DirectX时发生错误!", vbCritical
    
    Close_Program
    
    DirectX_Initialize = False

模块二:Create_Polygon() '创建多边形子程序
该段代码使用Create_TLVertex函数创建多边形,此函数前边已经介绍过了。

模块三: Load_Texture '从文件加载纹理贴图 本课程重点部分,主要内容。
使用的函数是: CreateTextureFromFileEx 从文件创建纹理。这是比D3DXCreateTextureFromFile更高级的功能。

该函数声明如下:

Function CreateTextureFromFileEx(Device As Direct3DDevice8, SrcFile As String, Width As Long, Height As Long, MipLevels As Long, Usage As Long, PixelFormat As CONST_D3DFORMAT, Pool As CONST_D3DPOOL, Filter As Long, MipFilter As Long, ColorKey As Long, SrcInfo As Any, Palette As Any) As Direct3DTexture8

参数解释:
Device: 指向IDirect3DDevice9接口的指针,该接口表示要与纹理关联的设备。

SrcFile: 指向指定文件名的字符串的指针。如果编译器设置需要Unicode,则数据类型LPCTSTR解析为LPCWSTR。否则,字符串数据类型解析为LPCSTR。

Width: 宽度(以像素为单位)。如果该值为零或D3DX_DEFAULT,则从文件中获取尺寸,并四舍五入为2的幂。如果设备支持2幂的非幂纹理,并且指定了D3DX_DEFAULT_NONPOW2,则大小不会四舍五入。

Height: 高度(以像素为单位),其他解释同上

MipLevels: 请求的Mip级别数。如果该值为零或D3DX_DEFAULT,则创建完整的mipmap链。如果为D3DX_FROM_FILE,则大小将与文件中的大小完全相同,并且如果这违反了设备功能,则调用将失败。

Usage: 用法,0,D3DUSAGE_RENDERTARGET或D3DUSAGE_DYNAMIC。将此标志设置为D3DUSAGE_RENDERTARGET表示该表面将用作渲染目标。然后可以将资源传递到SetRenderTarget方法的pNewRenderTarget参数。如果指定了D3DUSAGE_RENDERTARGET或D3DUSAGE_DYNAMIC,则必须将Pool设置为D3DPOOL_DEFAULT,应用程序应通过调用CheckDeviceFormat来检查设备是否支持此操作。D3DUSAGE_DYNAMIC指示应动态处理表面。请参见使用动态纹理

PixelFormat: 该会员D3DFORMAT枚举类型,描述了纹理请求的像素格式。返回的纹理的格式可能不同于Format指定的格式。应用程序应检查返回纹理的格式。如果为D3DFMT_UNKNOWN,则从文件中获取格式。如果使用D3DFMT_FROM_FILE,则格式将与文件中的格式完全相同,并且如果这违反了设备功能,则调用将失败。

Pool: 所述的构件D3DPOOL枚举类型,描述存储器类到其中的纹理应放置。

Filter: 一个或多个D3DX_FILTER常数的组合,用于控制如何过滤图像。指定D3DX_DEFAULT该参数指定D3DX_FILTER_TRIANGLE相当于| D3DX_FILTER_DITHER。

MipFilter: 一个或多个D3DX_FILTER常数的组合,用于控制如何过滤图像。为此参数指定D3DX_DEFAULT等效于指定D3DX_FILTER_BOX。此外,使用.bits 27-31指定将.dds纹理加载到内存时要跳过的Mip级别数(从mipmap链的顶部开始)。这使您最多可以跳过32个级别。

ColorKey: D3DCOLOR值替换为透明的黑色,或0禁用颜色键。始终是32位ARGB颜色,与源图像格式无关。Alpha很重要,对于不透明的颜色键,通常应将其设置为FF。因此,对于不透明的黑色,该值将等于0xFF000000。

SrcInfo: 指向D3DXIMAGE_INFO结构的指针,该结构将使用源图像文件中的数据描述或NULL进行填充。(D3DXIMAGE_INFO的作用是:返回图像文件原始内容的描述。)

Palette: 指向PALETTEENTRY结构的指针,该结构表示要填充的256色调色板或NULL。(PALETTEENTRY结构的作用是:指定逻辑调色板中条目的颜色和用法。)

    Dim File_Path As String '贴图文件路径
    Dim Width As Long'
    Dim Height As Long
    Dim Transparency_Color As Long
    
    File_Path = App.Path & "\maps.jpg"

    Width = 1024
    Height = 768
    
    Transparency_Color = D3DColorRGBA(0, 0, 0, 0)

    Set Texture = Direct3DX.CreateTextureFromFileEx(Direct3D_Device, _
                                                    File_Path, _
                                                    Width, Height, _
                                                    0, _
                                                    0, _
                                                    D3DFMT_A8R8G8B8, _
                                                    D3DPOOL_MANAGED, _
                                                    D3DX_FILTER_POINT, _
                                                    D3DX_FILTER_POINT, _
                                                    Transparency_Color, _
                                                    ByVal 0, _
                                                    ByVal 0)

模块三:Game_Loop游戏循环 作用就是设置纹理绘制多边形,代码如下:

Do While Running = True
        
        DoEvents '允许事件发生,以便程序不会锁定。
        
         '清除后缓冲。
        Direct3D_Device.Clear 0, ByVal 0, D3DCLEAR_TARGET, D3DColorRGBA(0, 0, 0, 0), 1#, 0
            
            Direct3D_Device.BeginScene
                
                '设置纹理
                
                Direct3D_Device.SetTexture 0, Texture
            
                '绘制多边形
                Direct3D_Device.DrawPrimitiveUP D3DPT_TRIANGLESTRIP, 2, Vertex_List(0), Len(Vertex_List(0))
            
            Direct3D_Device.EndScene
        
        '将后缓冲区翻转到窗体窗口中。
        Direct3D_Device.Present ByVal 0, ByVal 0, 0, ByVal 0
        
    Loop

①设置纹理:SetTexture:用户必须实现以设置纹理的回调函数。函数如下:SetTexture(stage As Long, texture As Direct3DBaseTexture8)

**参数一:stage:**分配纹理的阶段,这是IDirect3DDevice9 :: SetTextureIDirect3DDevice9 :: SetTextureStageState中的索引值。

参数二:texture: 指向纹理对象的指针。这可以是任何Direct3D纹理类型(多维数据集,体积等)。本例中为:Private Texture As Direct3DTexture8

②’绘制多边形:DrawPrimitiveUP将用户内存指针指定的数据呈现为指定类型的几何图元序列。在VB中的定义如下:

Sub DrawPrimitiveUP(PrimitiveType As CONST_D3DPRIMITIVETYPE, PrimitiveCount As Long, VertexStreamZeroDataArray As Any, VertexStreamZeroStride As Long)

参数1: PrimitiveType该会员D3DPRIMITIVETYPE枚举类型,描述的原始渲染类型。

参数2: PrimitiveCount 要渲染的基元数。通过检查D3DCAPS9结构的MaxPrimitiveCount成员来确定允许的最大原语数。

参数3:VertexStreamZeroDataArray 用户存储器指向顶点数据的指针。

参数4:VertexStreamZeroStride 每个顶点的数据字节数。该值不能为0。

在本例中的调用如下:

Direct3D_Device.DrawPrimitiveUP D3DPT_TRIANGLESTRIP, 2, Vertex_List(0), Len(Vertex_List(0))

模块4:Close_Program 结束程序,释放内存

最后成功的创建了一副图:
创建好的图

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gosub60

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值