244 lines
6.7 KiB
C#
244 lines
6.7 KiB
C#
|
using System;
|
||
|
using UnityEngine;
|
||
|
|
||
|
namespace UnityStandardAssets.ImageEffects
|
||
|
{
|
||
|
[ExecuteInEditMode]
|
||
|
[RequireComponent (typeof(Camera))]
|
||
|
public class PostEffectsBase : MonoBehaviour
|
||
|
{
|
||
|
protected bool supportHDRTextures = true;
|
||
|
protected bool supportDX11 = false;
|
||
|
protected bool isSupported = true;
|
||
|
|
||
|
protected Material CheckShaderAndCreateMaterial ( Shader s, Material m2Create)
|
||
|
{
|
||
|
if (!s)
|
||
|
{
|
||
|
Debug.Log("Missing shader in " + ToString ());
|
||
|
enabled = false;
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
if (s.isSupported && m2Create && m2Create.shader == s)
|
||
|
return m2Create;
|
||
|
|
||
|
if (!s.isSupported)
|
||
|
{
|
||
|
NotSupported ();
|
||
|
Debug.Log("The shader " + s.ToString() + " on effect "+ToString()+" is not supported on this platform!");
|
||
|
return null;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m2Create = new Material (s);
|
||
|
m2Create.hideFlags = HideFlags.DontSave;
|
||
|
if (m2Create)
|
||
|
return m2Create;
|
||
|
else return null;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
protected Material CreateMaterial (Shader s, Material m2Create)
|
||
|
{
|
||
|
if (!s)
|
||
|
{
|
||
|
Debug.Log ("Missing shader in " + ToString ());
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
if (m2Create && (m2Create.shader == s) && (s.isSupported))
|
||
|
return m2Create;
|
||
|
|
||
|
if (!s.isSupported)
|
||
|
{
|
||
|
return null;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m2Create = new Material (s);
|
||
|
m2Create.hideFlags = HideFlags.DontSave;
|
||
|
if (m2Create)
|
||
|
return m2Create;
|
||
|
else return null;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void OnEnable ()
|
||
|
{
|
||
|
isSupported = true;
|
||
|
}
|
||
|
|
||
|
protected bool CheckSupport ()
|
||
|
{
|
||
|
return CheckSupport (false);
|
||
|
}
|
||
|
|
||
|
|
||
|
public virtual bool CheckResources ()
|
||
|
{
|
||
|
Debug.LogWarning ("CheckResources () for " + ToString() + " should be overwritten.");
|
||
|
return isSupported;
|
||
|
}
|
||
|
|
||
|
|
||
|
protected void Start ()
|
||
|
{
|
||
|
CheckResources ();
|
||
|
}
|
||
|
|
||
|
protected bool CheckSupport (bool needDepth)
|
||
|
{
|
||
|
isSupported = true;
|
||
|
supportHDRTextures = SystemInfo.SupportsRenderTextureFormat(RenderTextureFormat.ARGBHalf);
|
||
|
supportDX11 = SystemInfo.graphicsShaderLevel >= 50 && SystemInfo.supportsComputeShaders;
|
||
|
|
||
|
if (!SystemInfo.supportsImageEffects || !SystemInfo.supportsRenderTextures)
|
||
|
{
|
||
|
NotSupported ();
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
if (needDepth && !SystemInfo.SupportsRenderTextureFormat (RenderTextureFormat.Depth))
|
||
|
{
|
||
|
NotSupported ();
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
if (needDepth)
|
||
|
GetComponent<Camera>().depthTextureMode |= DepthTextureMode.Depth;
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
protected bool CheckSupport (bool needDepth, bool needHdr)
|
||
|
{
|
||
|
if (!CheckSupport(needDepth))
|
||
|
return false;
|
||
|
|
||
|
if (needHdr && !supportHDRTextures)
|
||
|
{
|
||
|
NotSupported ();
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
|
||
|
public bool Dx11Support ()
|
||
|
{
|
||
|
return supportDX11;
|
||
|
}
|
||
|
|
||
|
|
||
|
protected void ReportAutoDisable ()
|
||
|
{
|
||
|
Debug.LogWarning ("The image effect " + ToString() + " has been disabled as it's not supported on the current platform.");
|
||
|
}
|
||
|
|
||
|
// deprecated but needed for old effects to survive upgrading
|
||
|
bool CheckShader (Shader s)
|
||
|
{
|
||
|
Debug.Log("The shader " + s.ToString () + " on effect "+ ToString () + " is not part of the Unity 3.2+ effects suite anymore. For best performance and quality, please ensure you are using the latest Standard Assets Image Effects (Pro only) package.");
|
||
|
if (!s.isSupported)
|
||
|
{
|
||
|
NotSupported ();
|
||
|
return false;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
protected void NotSupported ()
|
||
|
{
|
||
|
enabled = false;
|
||
|
isSupported = false;
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
|
||
|
protected void DrawBorder (RenderTexture dest, Material material)
|
||
|
{
|
||
|
float x1;
|
||
|
float x2;
|
||
|
float y1;
|
||
|
float y2;
|
||
|
|
||
|
RenderTexture.active = dest;
|
||
|
bool invertY = true; // source.texelSize.y < 0.0ff;
|
||
|
// Set up the simple Matrix
|
||
|
GL.PushMatrix();
|
||
|
GL.LoadOrtho();
|
||
|
|
||
|
for (int i = 0; i < material.passCount; i++)
|
||
|
{
|
||
|
material.SetPass(i);
|
||
|
|
||
|
float y1_; float y2_;
|
||
|
if (invertY)
|
||
|
{
|
||
|
y1_ = 1.0f; y2_ = 0.0f;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
y1_ = 0.0f; y2_ = 1.0f;
|
||
|
}
|
||
|
|
||
|
// left
|
||
|
x1 = 0.0f;
|
||
|
x2 = 0.0f + 1.0f/(dest.width*1.0f);
|
||
|
y1 = 0.0f;
|
||
|
y2 = 1.0f;
|
||
|
GL.Begin(GL.QUADS);
|
||
|
|
||
|
GL.TexCoord2(0.0f, y1_); GL.Vertex3(x1, y1, 0.1f);
|
||
|
GL.TexCoord2(1.0f, y1_); GL.Vertex3(x2, y1, 0.1f);
|
||
|
GL.TexCoord2(1.0f, y2_); GL.Vertex3(x2, y2, 0.1f);
|
||
|
GL.TexCoord2(0.0f, y2_); GL.Vertex3(x1, y2, 0.1f);
|
||
|
|
||
|
// right
|
||
|
x1 = 1.0f - 1.0f/(dest.width*1.0f);
|
||
|
x2 = 1.0f;
|
||
|
y1 = 0.0f;
|
||
|
y2 = 1.0f;
|
||
|
|
||
|
GL.TexCoord2(0.0f, y1_); GL.Vertex3(x1, y1, 0.1f);
|
||
|
GL.TexCoord2(1.0f, y1_); GL.Vertex3(x2, y1, 0.1f);
|
||
|
GL.TexCoord2(1.0f, y2_); GL.Vertex3(x2, y2, 0.1f);
|
||
|
GL.TexCoord2(0.0f, y2_); GL.Vertex3(x1, y2, 0.1f);
|
||
|
|
||
|
// top
|
||
|
x1 = 0.0f;
|
||
|
x2 = 1.0f;
|
||
|
y1 = 0.0f;
|
||
|
y2 = 0.0f + 1.0f/(dest.height*1.0f);
|
||
|
|
||
|
GL.TexCoord2(0.0f, y1_); GL.Vertex3(x1, y1, 0.1f);
|
||
|
GL.TexCoord2(1.0f, y1_); GL.Vertex3(x2, y1, 0.1f);
|
||
|
GL.TexCoord2(1.0f, y2_); GL.Vertex3(x2, y2, 0.1f);
|
||
|
GL.TexCoord2(0.0f, y2_); GL.Vertex3(x1, y2, 0.1f);
|
||
|
|
||
|
// bottom
|
||
|
x1 = 0.0f;
|
||
|
x2 = 1.0f;
|
||
|
y1 = 1.0f - 1.0f/(dest.height*1.0f);
|
||
|
y2 = 1.0f;
|
||
|
|
||
|
GL.TexCoord2(0.0f, y1_); GL.Vertex3(x1, y1, 0.1f);
|
||
|
GL.TexCoord2(1.0f, y1_); GL.Vertex3(x2, y1, 0.1f);
|
||
|
GL.TexCoord2(1.0f, y2_); GL.Vertex3(x2, y2, 0.1f);
|
||
|
GL.TexCoord2(0.0f, y2_); GL.Vertex3(x1, y2, 0.1f);
|
||
|
|
||
|
GL.End();
|
||
|
}
|
||
|
|
||
|
GL.PopMatrix();
|
||
|
}
|
||
|
}
|
||
|
}
|