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