You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
2.9 KiB
79 lines
2.9 KiB
namespace UnityEngine.PostProcessing |
|
{ |
|
public sealed class GrainComponent : PostProcessingComponentRenderTexture<GrainModel> |
|
{ |
|
static class Uniforms |
|
{ |
|
internal static readonly int _Grain_Params1 = Shader.PropertyToID("_Grain_Params1"); |
|
internal static readonly int _Grain_Params2 = Shader.PropertyToID("_Grain_Params2"); |
|
internal static readonly int _GrainTex = Shader.PropertyToID("_GrainTex"); |
|
internal static readonly int _Phase = Shader.PropertyToID("_Phase"); |
|
} |
|
|
|
public override bool active |
|
{ |
|
get |
|
{ |
|
return model.enabled |
|
&& model.settings.intensity > 0f |
|
&& SystemInfo.SupportsRenderTextureFormat(RenderTextureFormat.ARGBHalf) |
|
&& !context.interrupted; |
|
} |
|
} |
|
|
|
RenderTexture m_GrainLookupRT; |
|
|
|
public override void OnDisable() |
|
{ |
|
GraphicsUtils.Destroy(m_GrainLookupRT); |
|
m_GrainLookupRT = null; |
|
} |
|
|
|
public override void Prepare(Material uberMaterial) |
|
{ |
|
var settings = model.settings; |
|
|
|
uberMaterial.EnableKeyword("GRAIN"); |
|
|
|
float rndOffsetX; |
|
float rndOffsetY; |
|
|
|
#if POSTFX_DEBUG_STATIC_GRAIN |
|
// Chosen by a fair dice roll |
|
float time = 4f; |
|
rndOffsetX = 0f; |
|
rndOffsetY = 0f; |
|
#else |
|
float time = Time.realtimeSinceStartup; |
|
rndOffsetX = Random.value; |
|
rndOffsetY = Random.value; |
|
#endif |
|
|
|
// Generate the grain lut for the current frame first |
|
if (m_GrainLookupRT == null || !m_GrainLookupRT.IsCreated()) |
|
{ |
|
GraphicsUtils.Destroy(m_GrainLookupRT); |
|
|
|
m_GrainLookupRT = new RenderTexture(192, 192, 0, RenderTextureFormat.ARGBHalf) |
|
{ |
|
filterMode = FilterMode.Bilinear, |
|
wrapMode = TextureWrapMode.Repeat, |
|
anisoLevel = 0, |
|
name = "Grain Lookup Texture" |
|
}; |
|
|
|
m_GrainLookupRT.Create(); |
|
} |
|
|
|
var grainMaterial = context.materialFactory.Get("Hidden/Post FX/Grain Generator"); |
|
grainMaterial.SetFloat(Uniforms._Phase, time / 20f); |
|
|
|
Graphics.Blit((Texture)null, m_GrainLookupRT, grainMaterial, settings.colored ? 1 : 0); |
|
|
|
// Send everything to the uber shader |
|
uberMaterial.SetTexture(Uniforms._GrainTex, m_GrainLookupRT); |
|
uberMaterial.SetVector(Uniforms._Grain_Params1, new Vector2(settings.luminanceContribution, settings.intensity * 20f)); |
|
uberMaterial.SetVector(Uniforms._Grain_Params2, new Vector4((float)context.width / (float)m_GrainLookupRT.width / settings.size, (float)context.height / (float)m_GrainLookupRT.height / settings.size, rndOffsetX, rndOffsetY)); |
|
} |
|
} |
|
}
|
|
|