Problèmes rencontrés lors de la mise à niveau du projet vers URP

Cela fait presque un an qu'Untiy a lancé SRP. Parmi eux, il a été officiellement annoncé que LWRP était en production prêt à la fin de 2018 et prêt à fabriquer des produits, il a donc été renommé URP, mais HDRP a encore besoin de l'arrivée de 2019.4 pour atteindre la version complète. Cependant, à mon avis, URP ne peut pas être considéré comme étant prêt pour la production et il est toujours en train de passer du stade du jouet au stade de la production. Et parfois, j'ai le sentiment que le parcours technique du responsable d'Unity est parfois ambigu et fluctuant d'un côté à l'autre. Par exemple, le nouveau Camera.AddCommandBuffer de Unity 2018 est utilisé pour le rendu personnalisé, qui a été aboli dans Unity 2019 et l'a remplacé par Render Feature / ScriptableRenderPass, mais cette chose est également au stade expérimental.

Si SRP peut directement améliorer les performances du projet sans aucune modification, la réponse est qu'il peut réduire directement les performances du CPU à l'étape de préparation du GPU d'environ 10%. Il n'est pas possible d'améliorer directement les performances de rendu du GPU. Pour les projets qui n'utilisent aucun éclairage et se trouvent dans des machines bas de gamme telles qu'Opengl ES2.0, il n'y a fondamentalement aucune amélioration des performances du GPU.

Prenons deux exemples avec un grand nombre de bogues dans le SRP actuellement utilisé

1. [Pour appeler GetTransformInfoExpectUpToDate, RendererUpdateManager.UpdateAll doit être appelé en premier.] Erreur de rendu intégrée inexplicable, impossible à modifier par vous-même.

Lien officiel du numéro

https://issuetracker.unity3d.com/issues/errors-message-at-editor-play?_ga=2.202176470.695125147.1571176891-1511937231.1511185188

2. Après avoir utilisé la commande de rendu Blit, RenderTarget ne peut pas restaurer automatiquement le RenderTarget d'origine. Vous devez restaurer manuellement SetRenderTarget, qui n'a jamais été rencontré dans le CommandBuffer précédent.

Passez à un endroit où SRP peut être directement optimisé au milieu du projet

1. Optimisation de l'abattage par caméra

 

https://connect.unity.com/p/unityzhi-zuo-ren-zhuan-chang-unity-aaayou-xi-shen-du-you-hua-zhu-ti-yan-jiang

Selon la référence officielle d'optimisation, après avoir utilisé SRP, vous pouvez contrôler le comportement de la caméra Culling (recadrage). Pour les projets qui ont leurs propres caméras d'ombre basées sur le projecteur, vous pouvez réutiliser les résultats Culling de la caméra principale. Pour le modèle RT caméra sur l'interface utilisateur, vous ne pouvez rien faire.

2. Optimisation de la pile de caméras

SRP a abandonné la mise en œuvre de plusieurs caméras et ne peut plus utiliser plusieurs caméras (par exemple, notre projet comprend 1 GamePlay, 1 HUD et 1 caméra d'interface utilisateur. En utilisant le modèle SRP officiel, la couleur d'arrière-plan de la caméra de l'interface utilisateur couvrira le contenu de la scène) , la raison de

Si une seule caméra est utilisée, le résultat du rendu peut être directement écrit dans BackBuffer

S'il y a plusieurs caméras, parce que la deuxième caméra a besoin du résultat de la première caméra pour remplir le canevas avant le rendu, au moins un tampon temporaire de RenderTexture est nécessaire, et il doit être recadré pour différentes fenêtres, etc., la synchronisation de La réécriture du tampon retardera également

Raisons pour lesquelles le document officiel abandonne la pile de caméras

https://docs.google.com/document/d/1GDePoHGMngJ-S0Da0Fi0Ky8jPxYkQD5AkVFnoxlknUY/edit

Optimisation 3.UI OverDraw

Après avoir utilisé la même caméra pour dessiner l'interface utilisateur, vous pouvez envisager d'ajouter un modèle de test à l'interface utilisateur pour bloquer l'interface utilisateur de la partie de la scène, et la scène risque de ne pas être dessinée.

 

Fusion par lots 4.UI (Opengl 3.0+ Unity2019.2 + avec SRP Batcher)

Pour les effets spéciaux de scène, le SRP batcher est fondamentalement manqué.Il a une limite sur la capacité de Cbuffer.

Pour l'interface utilisateur, si vous personnalisez le Shader globalement, vous pouvez utiliser SRP Batcher, mais cela reste expérimental.

 

Enfin, parlons de la façon d'implémenter un XRay après le remplacement de la fonction Camera.AddCommandBuffer par ScriptableRenderPass dans Unity 2019

Lorsque vous utilisez CommandBuffer, seul camera.AddCommandBuffer (CameraEvent.AfterForwardOpaque, m_XRayBuffer) est nécessaire;

Puis XRayBuffer.drawRenderer (moteur de rendu, XrayMat)

 

En 2019, vous devez créer la classe XrayRenderPassFeature pour atteindre

classe publique XRayRenderPassFeature: ScriptableRendererFeature

 

ScriptableRendererFeature a 2 interfaces à implémenter dans

Creata () crée une interface qui implémente un Xray Pass spécifique

AddRenderPasses (ScriptableRenderer renderer, ref RenderingData renderingData) ajoutera la passe de Chuangjiao à la file d'attente du moteur de rendu

 

Implémenter un CustomRenderPass dans XRayRenderPassFeature: ScriptableRenderPass pour écrire une logique Xray spécifique

Configuration de la phase de préparation (CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor)

Exécuter (contexte ScriptableRenderContext, ref RenderingData renderingData) phase de rendu

Phase de nettoyage FrameCleanup (CommandBuffer cmd)

 

L'implémentation de base est dans Configure

 

CommandBuffer xraycmd = CommandBufferPool.Get(m_profilerTag); xraycmd.DrawMesh(m_drawMesh, m_xrayTarget.transform.localToWorldMatrix, m_xrayMaterial); context.ExecuteCommandBuffer(xraycmd); CommandBufferPool.Release(xraycmd);

 

Le processus général est que le moteur de rendu trie en fonction du renderPassEvent de la passe et d'autres passes intégrées telles que la skybox, la lumière ponctuelle, la profondeur, etc., puis appelle l'interface avant, après le rendu et après le rendu.

 

Ajoutez-en un pour implémenter XRay basé sur la démo officielle SRP FPS

https://github.com/Unity-Technologies/UniversalRenderingExamples

1. Ajoutez la fonctionnalité que vous venez de créer dans le préfabriqué FpsSetup

2. Ecrivez un ZTest Greater Shader simple pour dessiner la partie occluse

 

Shader "Unlit/XrayShader" { SubShader { Tags { "RenderType"="Opaque" "LightMode"="LightweightForward" } LOD 100 Pass { ZTest greater offset -1,-1 HLSLPROGRAM #pragma vertex vert #pragma fragment frag #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/core.hlsl" struct appdata { float4 vertex : POSITION; }; struct v2f { float4 vertex : SV_POSITION; }; v2f vert (appdata v) { v2f o; o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); return o; } float4 frag (v2f i) : SV_Target { return float4(1,0,0,1); } ENDHLSL } } }

3. Placez un échantillon de cube dans la scène et nommez-le XRayTarget

Enfin lancez le jeu

 

Enfin, si vous utilisez une fonction ScriptableRendererFeature personnalisée, vous devez également écrire vous-même le code de l'éditeur correspondant, ce qui est beaucoup plus fastidieux qu'auparavant.

 

Si vous écrivez SRP vous-même, RenderPassFeature doit gérer la liste de passes par vous-même, ou vous pouvez simplement implémenter un ForwardRenderer personnalisé, ce qui peut réduire la roue répétitive de nombreuses fonctions.

Je suppose que tu aimes

Origine blog.csdn.net/mango9126/article/details/112010895
conseillé
Classement