运行时修改Universal Render Data

37 篇文章 3 订阅

ScriptableRenderPipeline对象里面包含了UniversalRenderData对象,可以通过在运行时设置UniversalRenderData对象的内容来获得特定的显示结果。

using UnityEngine;
using UnityEngine.Rendering.Universal;

public class SetUniversalRenderData : MonoBehaviour
{
	[SerializeField]
	UniversalRendererData renderData;

	void Update()
	{
		if (Input.GetKeyDown(KeyCode.Alpha0))
		{
			renderData.opaqueLayerMask = 0;
            //设置renderData的不透明层为“Nothing”
		}

		if (Input.GetKeyDown(KeyCode.Alpha1))
		{
			renderData.opaqueLayerMask = ~0;
            //设置renderData的不透明层为“Everything”
		}

		if (Input.GetKeyDown(KeyCode.Alpha2))
		{
			ScreenSpaceOutlines screenSpaceOutlines = renderData.rendererFeatures[0] as ScreenSpaceOutlines;
			if (screenSpaceOutlines != null)screenSpaceOutlines.SetColor(Color.blue);
            //通过执行第一个render feature提供的SetColor方法来修改显示效果。
		}

		if (Input.GetKeyDown(KeyCode.Alpha3))
		{
			ScreenSpaceOutlines screenSpaceOutlines = renderData.rendererFeatures[0] as ScreenSpaceOutlines;
			if (screenSpaceOutlines != null) screenSpaceOutlines.SetColor(Color.yellow);
            //通过执行第一个render feature提供的SetColor方法来修改显示效果。
		}

		if (Input.GetKeyDown(KeyCode.Alpha4))
		{
			renderData.rendererFeatures[0].SetActive(false);
            //设置一个render feature为非激活状态
		}

		if (Input.GetKeyDown(KeyCode.Alpha5))
		{
			renderData.rendererFeatures[0].SetActive(true);
            //设置一个render feature为激活状态
		}
	}
}

以上代码演示了如何通过键盘数字来切换RenderData属性,执行RenderFeature方法以及改变RenderFeature状态。

下面的代码段贴出了上面提到的RenderFeature的内容,可以看到里面所包含的SetColor方法。

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;

public class ScreenSpaceOutlines : ScriptableRendererFeature
{
	class ViewSpaceNormalsTexturePass : ScriptableRenderPass
	{
		readonly Material normalsMaterials;
		readonly List<ShaderTagId> shaderTagIdList;
		FilteringSettings filteringSettings;
		readonly RenderTargetHandle normals;
		public RenderTargetIdentifier identifier { get { return normals.Identifier(); } }
		LayerMask outlineLayerMask;
		int msaaSamples;

		public ViewSpaceNormalsTexturePass(LayerMask outlineLayerMask, int msaaSamples)
		{
			normalsMaterials = new Material(Shader.Find("Hidden/ViewSpaceNormals"));
			shaderTagIdList = new List<ShaderTagId>
			{
				new ShaderTagId("UniversalForward"),
				new ShaderTagId("UniversalForwardOnly"),
				new ShaderTagId("LightWeightForward"),
				new ShaderTagId("SRPDefaultUnlit")
			};

			renderPassEvent = RenderPassEvent.AfterRenderingSkybox;
			this.outlineLayerMask = outlineLayerMask;
			this.msaaSamples = msaaSamples;
			normals.Init("_SceneViewSpaceNormals");
		}

		public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor)
		{
			RenderTextureDescriptor renderTextureDescriptor = cameraTextureDescriptor;
			renderTextureDescriptor.msaaSamples = msaaSamples;
			cmd.GetTemporaryRT(normals.id, renderTextureDescriptor, FilterMode.Point);
			ConfigureTarget(identifier);
			ConfigureClear(ClearFlag.All, Color.clear);
		}

		public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
		{
			if (!normalsMaterials) return;
			DrawingSettings drawSettings = CreateDrawingSettings(shaderTagIdList, ref renderingData, renderingData.cameraData.defaultOpaqueSortFlags);
			drawSettings.overrideMaterial = normalsMaterials;
			filteringSettings = new FilteringSettings(RenderQueueRange.opaque, outlineLayerMask);
			context.DrawRenderers(renderingData.cullResults, ref drawSettings, ref filteringSettings);
		}
	}

	class ScreenSpaceOutlinePass : ScriptableRenderPass
	{
		Material screenSpaceOutlineMaterial;
		RenderTargetIdentifier cameraColorTarget;
		readonly RenderTargetIdentifier normalsIdentifier;

		Material CreateMaterial() { screenSpaceOutlineMaterial = new Material(Shader.Find("Hidden/ViewSpaceOutline")); return screenSpaceOutlineMaterial; }
		public void SetColor(Color color)
		{
			if (!screenSpaceOutlineMaterial) screenSpaceOutlineMaterial = CreateMaterial();
			screenSpaceOutlineMaterial.SetColor("_Color", color);
			screenSpaceOutlineMaterial.SetFloat("_Intensity", color.a);
		}

		public ScreenSpaceOutlinePass(RenderTargetIdentifier normalsIdentifier, Color color)
		{
			renderPassEvent = RenderPassEvent.AfterRenderingSkybox;
			this.normalsIdentifier = normalsIdentifier;
			screenSpaceOutlineMaterial = new Material(Shader.Find("Hidden/ViewSpaceOutline"));
			SetColor(color);
		}

		public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData)
		{
			cameraColorTarget = renderingData.cameraData.renderer.cameraColorTarget;
		}

		public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
		{
			if (!screenSpaceOutlineMaterial) return;
			CommandBuffer cmd = CommandBufferPool.Get();
			Blit(cmd, normalsIdentifier, cameraColorTarget, screenSpaceOutlineMaterial, 0);
			context.ExecuteCommandBuffer(cmd);
			CommandBufferPool.Release(cmd);
		}
	}

	ViewSpaceNormalsTexturePass viewSpaceNormalsTexturePass;
	ScreenSpaceOutlinePass screenSpaceOutlinePass;

	public override void Create()
	{
		viewSpaceNormalsTexturePass = new ViewSpaceNormalsTexturePass(outlineLayerMask, msaaSamples);
		screenSpaceOutlinePass = new ScreenSpaceOutlinePass(viewSpaceNormalsTexturePass.identifier, color);
	}

	public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
	{
		renderer.EnqueuePass(viewSpaceNormalsTexturePass);
		renderer.EnqueuePass(screenSpaceOutlinePass);
	}

	[SerializeField]
	LayerMask outlineLayerMask;
	[SerializeField]
	Color color = Color.yellow;
	[SerializeField]
	[Range(1, 16)]
	int msaaSamples = 2;

	public void SetColor(Color color)
	{
		if (screenSpaceOutlinePass != null) screenSpaceOutlinePass.SetColor(color);
	}

	public void SetMsaaSamples(int msaaSamples)
	{
		this.msaaSamples = Mathf.Clamp(msaaSamples, 1, 16);
	}

	public void SetLayerMask(LayerMask outlineLayerMask)
	{
		this.outlineLayerMask = outlineLayerMask;
	}
}

Universal RP (Universal Render Pipeline) 是Unity引擎的一个渲染管线,通过对3D场景进行渲染,实现图形效果的显示和呈现。Universal RP的主要实现在其Runtime文件夹中,从渲染入口点开始,可以看到其具体实现细节。 推荐在熟悉Universal RP的使用之后再去查看其代码的实现,这样可以提高效率。可以参考Universal RP 7.0的官方文档来学习更多关于Universal RP的使用方法和特性。 如果想要深入理解Universal RP的设计初衷、优势和劣势,可以从图形学的角度进行学习和补习。这样可以更好地理解Universal RP的原理,并掌握其在图形渲染方面的优势。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [unity生成预制体_[Universal RP]Unity通用渲染管线学习](https://blog.csdn.net/weixin_39857153/article/details/109921051)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [走进LWRP(Universal RP)的世界](https://blog.csdn.net/yinfourever/article/details/104799430)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值