【请教】VB6 用dx8画个立方体,怎么没图像

sailingzyf 2011-11-20 10:57:33
这几天在看DX的书,边看边动手。初始化设备对象、建立缓存大致了解了。书上第三章给了个例子,画一个立方体,线框。我写了这些代码,有些问题。有点乱,请耐心看完。
ps:不知道dx相关的归哪类就放到多媒体了
Option Explicit
Option Base 1
Public Const Degree As Double = 1.74532925063168E-02 '一度的弧度

Public Declare Sub CM Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Any, Source As Any, ByVal Length As Long)

Public Dx8 As DirectX8 '原来的代码有好几个模块,所以这几个变量都是public的
Public D3D8 As Direct3D8 '发帖的时候为了方便看,剪贴到一起了
Public D3DDev As Direct3DDevice8
Public D3DCp As D3DCAPS8
Public D3DPp As D3DPRESENT_PARAMETERS

Public VBf As Direct3DVertexBuffer8
Public IBf As Direct3DIndexBuffer8

Private Sub Main()
Dim t As Long
Dim vp As Long
Dim V() As Single '存顶点
Dim I() As Integer '存索引
Form2.Show
'-----------------------------------------------创建设备对象
Set Dx8 = New DirectX8
Set D3D8 = Dx8.Direct3DCreate

D3D8.GetDeviceCaps D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DCp
If D3DCp.DevCaps And D3DDEVCAPS_HWTRANSFORMANDLIGHT Then
vp = D3DCREATE_HARDWARE_VERTEXPROCESSING
Else
vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING
End If

With D3DPp
.BackBufferWidth = 800
.BackBufferHeight = 600
.BackBufferFormat = D3DFMT_A8R8G8B8
.BackBufferCount = 1
.MultiSampleType = D3DMULTISAMPLE_NONE
.SwapEffect = D3DSWAPEFFECT_DISCARD
.hDeviceWindow = Form2.hWnd
.Windowed = 1
.EnableAutoDepthStencil = 1
.AutoDepthStencilFormat = D3DFMT_D24S8
.flags = 0
.FullScreen_RefreshRateInHz = 0
.FullScreen_PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT
End With
Set D3DDev = D3D8.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, Form2.hWnd, vp, D3DPp)
'-----------------------------------------------
'-----------------------------------------------把立方体的点输入,试验用的,所以点的坐标是手动输入的
'-----------------------------------------------定义成Vector类型不太好写,就用数组顶上了
ReDim V(24), I(36)
'正方体8个顶点的xyz坐标共24个
V(1) = -1: V(2) = -1: V(3) = -1
V(4) = -1: V(5) = 1: V(6) = -1
V(7) = 1: V(8) = 1: V(9) = -1
V(10) = 1: V(11) = -1: V(12) = -1
V(13) = -1: V(14) = -1: V(15) = 1
V(16) = -1: V(17) = 1: V(18) = 1
V(19) = 1: V(20) = 1: V(21) = 1
V(22) = 1: V(22) = -1: V(24) = 1
'6个面12个三角形一共36个索引
I(1) = 0: I(2) = 1: I(3) = 2
I(4) = 0: I(5) = 2: I(6) = 3

I(7) = 4: I(8) = 6: I(9) = 5
I(10) = 4: I(11) = 7: I(12) = 6

I(13) = 4: I(14) = 5: I(15) = 1
I(16) = 4: I(17) = 1: I(18) = 0

I(19) = 3: I(20) = 2: I(21) = 6
I(22) = 3: I(23) = 6: I(24) = 7

I(25) = 1: I(26) = 5: I(27) = 6
I(28) = 1: I(29) = 6: I(30) = 2

I(31) = 4: I(32) = 0: I(33) = 3
I(34) = 4: I(35) = 3: I(36) = 7
'-----------------------------------------------建立一个顶点缓存和索引缓存(指定内存池的参数意义书上没说,谁能帮忙讲解下)
Set VBf = D3DDev.CreateVertexBuffer(96, D3DUSAGE_WRITEONLY, D3DFVF_XYZ, D3DPOOL_MANAGED) '8个点xyz共24个single,所以开了96字节的缓存
Set IBf = D3DDev.CreateIndexBuffer(72, D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_MANAGED) '指定的16位索引,用了72字节
'-----------------------------------------------
VBf.Lock 0, 0, t, 0
CM t, V(1), 96 '书里面向的是C++,VB不好用指针,我就用copymemory了
VBf.Unlock '不知道正规的写缓存应该用啥方法
IBf.Lock 0, 0, t, 0
CM t, I(1), 72
IBf.Unlock
'-----------------------------------------------
'-----------------------------------------------
Dim Pos As D3DVECTOR, Tgt As D3DVECTOR, Up As D3DVECTOR
Dim vew As D3DMATRIX, Proj As D3DMATRIX
Pos.z = -100
Up.Y = 1
D3DXMatrixLookAtLH vew, Pos, Tgt, Up
D3DDev.SetTransform D3DTS_VIEW, vew
D3DXMatrixPerspectiveFovLH Proj, Degree * 90, 4 / 3, 1, 100
D3DDev.SetTransform D3DTS_PROJECTION, Proj
D3DDev.SetRenderState D3DRS_FILLMODE, D3DFILL_WIREFRAME
'-----------------------------------------------
'---这行下面也是Form2里Timer的代码------------------------
D3DDev.Clear 0, ByVal 0, D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, vbWhite, 1, 1
D3DDev.BeginScene
D3DDev.SetStreamSource 0, VBf, 12
'-------原本这里有一行语句设置顶点格式_device->SetFVF( D3DFVF_XYZ )
'-------但是VB的DX8库里没有这个函数我就没写,建顶点缓存的时候指定了格式,这里不知道能省略不
D3DDev.SetIndices IBf, 0
D3DDev.DrawPrimitive D3DPT_TRIANGLELIST, 0, 2
D3DDev.DrawIndexedPrimitive D3DPT_TRIANGLELIST, 0, 36, 1, 12
D3DDev.EndScene
D3DDev.Present ByVal 0, ByVal 0, 0, ByVal 0
'-----------------------------------------------
'---运行之后,Form2被白色填充,但是没有立方体线框的影子
'---想了很久都没明白,书上用C++写的,但是类名、函数的参数、方法、常量的名字基本相同,我就稍微改了点儿搬过来了
'--------------------------------------------
End Sub
请各位高手、前辈指点……

...全文
254 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

807

社区成员

发帖
与我相关
我的任务
社区描述
VB 多媒体
社区管理员
  • 多媒体
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧