Skip to content
woctordho edited this page Jun 5, 2024 · 3 revisions

渲染流程

  • OnRenderImage.cs中定义了IOnRenderImage,用于添加自定义的render pass
  • RenderManager.cs中定义了IRenderTargetConfig,用于在渲染流程中创建动态尺寸的render texture
    • 这些render texture的尺寸与游戏画面(在加margin之前)相同,当玩家缩放窗口时,RenderManager会重新创建这些render texture

立绘合成

  • GameCameraAvatar里的Camera game object上面有CompositeSpriteRenderer component,它会找到所有CompositeSpriteController并将其渲染
    • CompositeSpriteRenderermergerTagCompositeSpriteControllertag需要保持一致,Nova提供的立绘和CG使用的tag为Character,头像为Avatar
    • 如果CompositeSpriteController上面有PostProcessing,也会在此时处理
    • 这个render pass在渲染透明物体之前
  • CompositeSpriteController里有两个CompositeSpriteMerger,用于实现立绘淡入淡出的动画
    • CompositeSpriteController继承自FadeController,用于提供一个shader来在两个texture之间渐变
    • 这个shader的混合方式是Premul,详见关于shader的说明
  • CompositeSpriteMerger会把立绘的各个部件分别作为sprite创建出来,然后用一个摄像机拍下它们
    • CompositeSpriteMerger所在的game object的layer要与CompositeSpriteMerger.MergerLayer保持一致
    • 建议在Unity Editor右上角的Layers中取消显示这个layer
  • 立绘使用的GameCharacterController、CG使用的OverlaySpriteController、头像使用的AvatarController都继承自CompositeSpriteController
  • OverlaySpriteController里有一个RenderTarget,把合成后的立绘渲染到动态尺寸的render texture上
    • 然后在overlay game object上创建一个特殊的MeshRenderer,把这个render texture显示到clip space中对应的位置
    • 在接下来渲染透明物体的render pass中,GameCamera会拍下overlay
    • overlay处于一个特殊的layer,建议在Unity Editor右上角的Layers中取消显示这个layer
  • AvatarController没有RenderTarget,而是把合成后的头像渲染到一个固定尺寸的render texture上,再把render texture显示到image

画面缩放

  • GameCameraUICameraPostUICamera game object上面有CameraRenderTarget,每个CameraRenderTarget里有一个RenderTarget
    • GameCamera拍下3D场景中的所有东西,显示到UI/MainUI/GameView/GamePanel/Game game object上的RawImage
    • UICamera拍下Layer为UI的所有东西(priorityGameCamera之后),显示到UI/PostUI/AfterMainUI
      • 同时显示到UI/PostUI/ButtonRing/BackgroundBlur,用于实现环形菜单背景模糊效果
    • PostUICamera拍下Layer为PostUI的所有东西(priorityUICamera之后),它的RenderTarget.isFinal为true,所以RenderTarget会作为RenderManager.finalTarget
  • RenderManager.ExecuteOnRenderImageFeature中,通过Nova/VFX/Final Blit这个shader,在游戏画面周围添加margin(黑边),显示到窗口上
Clone this wiki locally