当前位置:   article > 正文

Unity URP入门实战_unity urp教程

unity urp教程

导读

本文讲述

如何从应用层面使用URP

如何在代码层面为URP增加更多的渲染特性

如果拓展URP的后处理效果

URP管线特性

光源数量:

直线光外加4个其他光源

内置管线的多Pass Forward Rendering,会在多光源时对额外的光源使用新的FowardAdd Pass计算,Pass数量是影响物体的光源数量,最大值为8

缺点:

1 不支持多相机叠加

2 Defferred Renderring,现在URP里面没有延迟渲染,也没有时域抗锯齿TAA

使用URP的第一步是配置URP的Asset

获得2个配置文件

改个名字

设置图形选项

配置质量选项

不配置这个在Camera里面选不了Renderer

配置后处理

拖上去

为URP增加新的渲染特性:CustomRenderPassFeature

原理:XXXFeature类提供XXXPass给Renderer,以此增加一个渲染特性

此时会得到一个RenderFeature类

里面有模板代码,可以按需拓展

拓展后处理

拓展URP后处理的原理

使用一个在最后才执行的Pass,对当前相机的渲染输出进行处理

步骤

1 新建类继承Volume,这一步是为了给后处理提供数据设置。可以不做这一步,因为可以直接走RenderFeature的配置里读也可以

2 增加一个renderer feature,在这个Feature中创建自定义pass,在pass里进行后处理

后处理用的shader

使用Shader Graph或者自己写一个URP的shader,用这个shader建一个材质,使用这个材质完成后处理

有个要注意的是,如果不想做额外的设置,shader里的输入贴图名字写死叫 _MainTex

后处理用的自定义RenderPassFeature示例代码

  1. using UnityEngine;
  2. using UnityEngine.Rendering;
  3. using UnityEngine.Rendering.Universal;
  4. public class TestUrpPostRenderPassFeature : ScriptableRendererFeature
  5. {
  6. public Material postMat;
  7. class CustomRenderPass : ScriptableRenderPass
  8. {
  9. private int effectRtPropId = Shader.PropertyToID("testUrpRt");
  10. private RenderTargetIdentifier effectRtId;
  11. private RenderTargetIdentifier source;
  12. public Material postMat;
  13. public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData)
  14. {
  15. source = renderingData.cameraData.renderer.cameraColorTarget;
  16. RenderTextureDescriptor descriptor = renderingData.cameraData.cameraTargetDescriptor;
  17. descriptor.depthBufferBits = 0;
  18. cmd.GetTemporaryRT(effectRtPropId, descriptor, FilterMode.Bilinear);
  19. effectRtId = new RenderTargetIdentifier(effectRtPropId);
  20. // Debug.Log("custom urp setup camera");
  21. }
  22. public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
  23. {
  24. CommandBuffer cmd = CommandBufferPool.Get("Custom Post Processing");
  25. cmd.Clear();
  26. Blit(cmd, source, effectRtId, postMat);
  27. Blit(cmd, effectRtId, source);
  28. context.ExecuteCommandBuffer(cmd);
  29. CommandBufferPool.Release(cmd);
  30. // Debug.Log("custom urp execute");
  31. }
  32. public override void OnCameraCleanup(CommandBuffer cmd)
  33. {
  34. cmd.ReleaseTemporaryRT(effectRtPropId);
  35. // Debug.Log("custom urp release");
  36. }
  37. }
  38. CustomRenderPass m_ScriptablePass;
  39. public override void Create()
  40. {
  41. m_ScriptablePass = new CustomRenderPass();
  42. m_ScriptablePass.renderPassEvent = RenderPassEvent.AfterRenderingTransparents;
  43. m_ScriptablePass.postMat = postMat;
  44. }
  45. public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
  46. {
  47. renderer.EnqueuePass(m_ScriptablePass);
  48. }
  49. }

参考资料

应用方面的介绍看官方文档

Shader Stripping | Package Manager UI website

实现分析和讲解

[Universal RP]Unity通用渲染管线学习 - 知乎

后处理的参考资料

renderer feature:

Unity3D URP中使用Render Feature实现后处理效果 - whcsrl_技术网

Custom Post Processing in Unity URP | Febucci

volume

代码

获得当前相机的输出RenderTargetIdentifier

var renderer = renderingData.cameraData.renderer;

source = renderer.cameraColorTarget;

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/101732
推荐阅读
相关标签
  

闽ICP备14008679号