1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
namespace FlatKit;
internal class BlitTexturePass : ScriptableRenderPass
{
public static readonly string CopyEffectShaderName = "Hidden/FlatKit/CopyTexture";
private ProfilingSampler _profilingSampler;
private Material _effectMaterial;
private Material _copyMaterial;
private RenderTargetHandle _temporaryColorTexture;
public void Setup(Material effectMaterial, bool useDepth, bool useNormals, bool useColor)
{
_effectMaterial = effectMaterial;
string text = effectMaterial.name.Substring(effectMaterial.name.LastIndexOf('/') + 1);
_profilingSampler = new ProfilingSampler("Blit " + text);
_copyMaterial = CoreUtils.CreateEngineMaterial(CopyEffectShaderName);
ConfigureInput((useColor ? ScriptableRenderPassInput.Color : ScriptableRenderPassInput.None) | (useDepth ? ScriptableRenderPassInput.Depth : ScriptableRenderPassInput.None) | (useNormals ? ScriptableRenderPassInput.Normal : ScriptableRenderPassInput.None));
}
public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData)
{
ConfigureTarget(new RenderTargetIdentifier(renderingData.cameraData.renderer.cameraColorTarget, 0, CubemapFace.Unknown, -1));
}
public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
{
if (_effectMaterial == null || renderingData.cameraData.camera.cameraType != CameraType.Game)
{
return;
}
_temporaryColorTexture = default(RenderTargetHandle);
CommandBuffer commandBuffer = CommandBufferPool.Get();
using (new ProfilingScope(commandBuffer, _profilingSampler))
{
RenderTextureDescriptor cameraTargetDescriptor = renderingData.cameraData.cameraTargetDescriptor;
cameraTargetDescriptor.depthBufferBits = 0;
SetSourceSize(commandBuffer, cameraTargetDescriptor);
RTHandle cameraColorTargetHandle = renderingData.cameraData.renderer.cameraColorTargetHandle;
commandBuffer.GetTemporaryRT(_temporaryColorTexture.id, cameraTargetDescriptor);
if (renderingData.cameraData.xrRendering)
{
_effectMaterial.EnableKeyword("_USE_DRAW_PROCEDURAL");
commandBuffer.SetRenderTarget(_temporaryColorTexture.Identifier());
commandBuffer.DrawMesh(RenderingUtils.fullscreenMesh, Matrix4x4.identity, _effectMaterial, 0, 0);
commandBuffer.SetGlobalTexture("_EffectTexture", _temporaryColorTexture.Identifier());
commandBuffer.SetRenderTarget(new RenderTargetIdentifier(cameraColorTargetHandle, 0, CubemapFace.Unknown, -1));
commandBuffer.DrawMesh(RenderingUtils.fullscreenMesh, Matrix4x4.identity, _copyMaterial, 0, 0);
}
else
{
_effectMaterial.DisableKeyword("_USE_DRAW_PROCEDURAL");
commandBuffer.Blit(cameraColorTargetHandle, _temporaryColorTexture.Identifier(), _effectMaterial, 0);
commandBuffer.Blit(_temporaryColorTexture.Identifier(), cameraColorTargetHandle);
}
}
context.ExecuteCommandBuffer(commandBuffer);
commandBuffer.Clear();
CommandBufferPool.Release(commandBuffer);
}
private static void SetSourceSize(CommandBuffer cmd, RenderTextureDescriptor desc)
{
float num = desc.width;
float num2 = desc.height;
if (desc.useDynamicScale)
{
num *= ScalableBufferManager.widthScaleFactor;
num2 *= ScalableBufferManager.heightScaleFactor;
}
cmd.SetGlobalVector("_SourceSize", new Vector4(num, num2, 1f / num, 1f / num2));
}
}
|