如果让你的引擎结构支持多个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 );
}