|
多视口显示
:zh1110
viewport对象有一个很重要的特性,就是在一个画面上允许显示为多个viewport,比如汽车的后镜.
下面主要讲述了在一个VB窗台上创建viewport,然后依次设置并渲染四个小viewport。

Dim v As D3DVIEWPORT8
'创建viewport
v.x = 0
'左边距离
v.y = 0 '右边距离
v.Width = 800 '宽度
v.Height = 600 '高度
v.MaxZ = 1
v.MinZ = 0
device.SetViewport v
device.Clear 0, ByVal 0, D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, D3DColorMake(0, 1, 0, 0), 1#, 0
'清除主viewport的目标和Z缓冲表面
v.x = 0
v.y = 0
v.Width = 400
v.Height = 300
v.MaxZ = 1
v.MinZ = 0
device.SetViewport v '设置左上角的viewport
device.BeginScene '准备渲染
For aus = 0 To cubo.numX - 1
device.SetTexture 0, cubo.texX(aus)
device.SetMaterial cubo.mateX(aus)
cubo.meshX.DrawSubset aus '绘制网格
Next aus
device.EndScene '结束渲染
v.x = 400
v.y = 0
v.Width = 400
v.Height = 300
device.SetViewport v '设置右上角的viewport
...
v.x = 0
v.y = 300
v.Width = 400
v.Height = 300
device.SetViewport v '设置左下角的viewport
...
v.x = 400
device.SetViewport v '设置右下角的viewport
...
device.Present ByVal 0, ByVal 0, 0, ByVal 0
'切换显示出来
用SetViewport只能以一个HDC上创建多个viewport,如果要在多个HDC上创建,则需要使用swapChain对象(交换链)
首先我们在VB窗体上创建四个图片框,然后为每个图片框设置swapChain,最后通过swapChain取得其背景面依次渲染。
'创建SwapChain
Dim sw1 As Direct3DSwapChain8
Dim sw2 As Direct3DSwapChain8
Dim sw3 As Direct3DSwapChain8
Dim sw4 As Direct3DSwapChain8
D3DWindow.hDeviceWindow = Picture1.hwnd
'设备的窗口句柄
Set sw1 = device.CreateAdditionalSwapChain(D3DWindow)
'加入SwapChain 1
'swap chain 2
D3DWindow.hDeviceWindow = Picture2.hwnd
Set sw2 = device.CreateAdditionalSwapChain(D3DWindow)
'加入SwapChain 2
'swap chain 3
D3DWindow.hDeviceWindow = Picture3.hwnd
Set sw3 = device.CreateAdditionalSwapChain(D3DWindow)
'加入SwapChain 3
'swap chain 4
D3DWindow.hDeviceWindow = Picture4.hwnd
Set sw4 = device.CreateAdditionalSwapChain(D3DWindow)
'加入SwapChain 4
'取得背景面
Set su1 = sw1.GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO)
Set su2 = sw2.GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO)
Set su3 = sw3.GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO)
Set su4 = sw4.GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO)
'设置渲染目标表面为su1.
Z缓冲及模板表面则用相同的
device.SetRenderTarget su1, device.GetDepthStencilSurface, 0
'清除目标和Z缓冲表面
device.Clear 0,ByVal 0,D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, D3DColorMake(1, 0, 0, 0), 1, 0
device.BeginScene
m.meshX.DrawSubset i
device.EndScene
sw1.Present ByVal 0, ByVal 0, 0, ByVal 0 '切换显示出来
'设置渲染目标表面为su2
device.SetRenderTarget su2, device.GetDepthStencilSurface, 0
......
'设置渲染目标表面为su3
device.SetRenderTarget su3, device.GetDepthStencilSurface, 0
......
'设置渲染目标表面为su4
device.SetRenderTarget su3, device.GetDepthStencilSurface, 0
......
文件下载
|