Skip to content

Instantly share code, notes, and snippets.

@baobao
Created December 25, 2024 10:58
Show Gist options
  • Save baobao/3aee45c52faaf9ec675c71b1dc49fb66 to your computer and use it in GitHub Desktop.
Save baobao/3aee45c52faaf9ec675c71b1dc49fb66 to your computer and use it in GitHub Desktop.
RenderGraph版URP拡張サンプルコード
using UnityEngine.Rendering.Universal;
public class DownSamplingRenderFeature : ScriptableRendererFeature
{
DownSamplingRenderPass _renderPass;
public override void Create()
{
// パスの作成
_renderPass = new DownSamplingRenderPass
{
// 処理のタイミング(透明オブジェクト後に実行)
renderPassEvent = RenderPassEvent.AfterRenderingTransparents
};
}
public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
{
// パスの登録
renderer.EnqueuePass(_renderPass);
}
}
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.RenderGraphModule;
using UnityEngine.Rendering.Universal;
public class DownSamplingRenderPass : ScriptableRenderPass
{
// パスを実行(ダウンサンプリング処理)するために必要なパラメータを渡すためのクラス
private class PassData
{
public TextureHandle srcTextureHandle;
}
public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData)
{
// 1.現在カメラが映しているテクスチャの取得
var resourceData = frameData.Get<UniversalResourceData>();
var cameraColorTextureHandle = resourceData.activeColorTexture;
// 2.カメラデータの取得
UniversalCameraData cameraData = frameData.Get<UniversalCameraData>();
// 3.低解像度の決定
int downSample = 100;
int w = cameraData.scaledWidth / downSample;
int h = cameraData.scaledHeight / downSample;
// 4.像度を下げた一時利用のRenderTextureの作成
var tempRT = UniversalRenderer.CreateRenderGraphTexture(
renderGraph, new RenderTextureDescriptor(w, h), "_TempRT", true);
// 1. RenderGraphに対してパスを追加
using (var builder = renderGraph.AddRasterRenderPass(passName, out PassData passData))
{
// 2.カメラのテクスチャは読み取り設定
builder.UseTexture(cameraColorTextureHandle, AccessFlags.Read);
// 3.一時的なRenderTextureは書き込み設定
builder.SetRenderAttachment(tempRT, 0, AccessFlags.Write);
// 4.Pass実行に必要なデータをセット
passData.srcTextureHandle = cameraColorTextureHandle;
// 5.パス実行の依頼
builder.SetRenderFunc(
(PassData data, RasterGraphContext context) => ExecutePass(data, context)
);
}
// 1. RenderGraphに対してパスを追加
using (var builder = renderGraph.AddRasterRenderPass(passName, out PassData passData))
{
// 2.一時的なRenderTextureは読み取り設定
builder.UseTexture(tempRT, AccessFlags.Read);
// 3.カメラのテクスチャは書き込み設定
builder.SetRenderAttachment(cameraColorTextureHandle, 0, AccessFlags.Write);
// 4.Pass実行に必要なデータをセット
passData.srcTextureHandle = tempRT;
// 5.パス実行の依頼
builder.SetRenderFunc(
(PassData data, RasterGraphContext context) => ExecutePass(data, context)
);
}
}
private static void ExecutePass(PassData passData, RasterGraphContext graphContext)
{
RasterCommandBuffer cmd = graphContext.cmd;
Blitter.BlitTexture(cmd, passData.srcTextureHandle, new Vector4(1, 1, 0, 0), 0, false);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment