多视口显示

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

......

 


文件下载