如果讓你的引擎結(jié)構(gòu)支持多個(gè)RenderTarget繪制及多個(gè)Viewport?這里是我的簡(jiǎn)單設(shè)計(jì):
同樣適用我的文本設(shè)計(jì)圖標(biāo)準(zhǔn)(+為包含, <為派生)
RenderTexture
RenderTarget
<ScreenTarget(引擎啟動(dòng)時(shí),初始化屏幕大小的Viewport)
+RenderView (對(duì)于一個(gè)RT,可以是屏幕,可以是紋理RT,所以可以擁有 1~n個(gè)切分視圖 )
+Camera
+Viewport
以下是多View繪制的類XNA偽代碼
Engine.Run()
{
Device.Clear()
// 保存當(dāng)前全屏Viewport
ScreenViewport = Device.CurrentViewport
Device.BeginScene()
// 遍歷當(dāng)前屏幕RT下的所有View
foreach RenderView in ScreenRT
{
// 未激活的View不用繪制
if RenderView not active then continue
// 將View對(duì)應(yīng)的Viewport提交到設(shè)備
RenderView.CommitViewport()
// 渲染回調(diào)
foreach RenderEventListener in RenderEventListenerList
{
RenderEventListener.OnRenderFrame()
}
}
Device.EndScene()
Device.Present()
Device.CurrentViewport = ScreenViewport // 恢復(fù)全屏viewport
}
以下是RT間嵌套繪制的偽代碼:
RenderView.SwitchRenderTarget(stage, RenderTarget)
{
// 保存繪制前的RT
PreTarget = Device.GetRenderTarget()
// 設(shè)置為當(dāng)前的RT
Device.SetRenderTarget( RenderTarget )
// 更新RT攝像機(jī)
RenderTarget.UpdateCamera()
// 清空RT
Device.Clear()
// 繪制回調(diào)
RenderTarget.OnRender( )
// 恢復(fù)之前的RT
Device.SetRenderTarget( PreTarget );
}