В шейдере объекта, на который не должен воздействовать эффект, нужно написать: Tags { "RenderType"="GrayscaleMask" }
На камеру.
Используется csharp
using UnityEngine;
[ExecuteInEditMode]
[RequireComponent(typeof(Camera))]
[AddComponentMenu("Image Effects/GrayscaleMasked")]
public class GrayscaleMasked: MonoBehaviour
{
public Shader shader;
private Material material;
public Texture textureRamp;
//public Texture mask;
public Shader maskShader;
public float rampOffset;
private Camera maskCamera;
private RenderTexture renderTexture;
void Start()
{
shader = Shader.Find("Hidden/GrayscaleMasked Effect");
maskShader = Shader.Find("Hidden/RenderGrayscaleMask");
// Disable if we don't support image effects
if (!SystemInfo.supportsImageEffects)
{
enabled = false;
return;
}
// Disable the image effect if the shader can't
// run on the users graphics card
if (!shader || !shader.isSupported)
enabled = false;
}
// Called by camera to apply image effect
void OnRenderImage (RenderTexture source, RenderTexture destination)
{
if (material == null)
{
if(shader==null)return;
material = new Material(shader);
material.hideFlags = HideFlags.HideAndDontSave;
}
if (maskCamera == null)
{
maskCamera = new GameObject("maskCamera").AddComponent<Camera>();
maskCamera.enabled = false;
maskCamera.gameObject.hideFlags = HideFlags.HideAndDontSave;
}
maskCamera.CopyFrom(camera);
maskCamera.clearFlags = CameraClearFlags.SolidColor;
maskCamera.backgroundColor = new Color32(0, 0, 0, 0);
renderTexture = RenderTexture.GetTemporary((int)maskCamera.pixelWidth, (int)maskCamera.pixelHeight, 8, RenderTextureFormat.RGB565);
maskCamera.targetTexture = renderTexture;
maskCamera.RenderWithShader(maskShader, "RenderType");
material.SetTexture("_RampTex", textureRamp);
material.SetTexture("_Mask", renderTexture);
material.SetFloat("_RampOffset", rampOffset);
Graphics.Blit (source, destination, material);
RenderTexture.ReleaseTemporary(renderTexture);
}
void OnDisable()
{
if (material)
{
DestroyImmediate(material);
}
if (renderTexture != null)
{
renderTexture.Release();
renderTexture = null;
}
if(maskCamera!=null)
{
DestroyImmediate(maskCamera.gameObject);
}
}
}
Эффект
Используется glsl
Shader "Hidden/GrayscaleMasked Effect"
{
Properties {
_MainTex ("Base (RGB)", Rect) = "white" {}
_Mask ("Mask (a)", Rect) = "white" {}
_RampTex ("Base (RGB)", 2D) = "grayscaleRamp" {}
}
SubShader {
Pass {
ZTest Always Cull Off ZWrite Off
Fog { Mode off }
CGPROGRAM
#pragma vertex vert_img
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
#include "UnityCG.cginc"
uniform sampler2D _MainTex;
uniform sampler2D _Mask;
uniform sampler2D _RampTex;
uniform half _RampOffset;
fixed4 frag (v2f_img i) : COLOR
{
fixed4 original = tex2D(_MainTex, i.uv);
fixed grayscale = Luminance(original.rgb);
half2 remap = half2 (grayscale + _RampOffset, .5);
fixed4 output = tex2D(_RampTex, remap);
fixed4 maskR = tex2D(_Mask, i.uv).r;
output = lerp(output, original, maskR);
//output = maskA;
output.a = original.a;
return output;
}
ENDCG
}
}
Fallback off
}
Маска.
Используется glsl
Shader "Hidden/RenderGrayscaleMask"
{
Category
{
Fog { Mode Off }
SubShader
{
Tags { "RenderType"="GrayscaleMask" }
Pass
{
Color (1.0,0.0,0.0,1.0)
}
}
SubShader
{
Tags { "RenderType"="Opaque" }
Pass
{
Fog { Mode Off }
Color (0.0,0.0,0.0,1.0)
}
}
SubShader
{
Tags { "RenderType"="Transparent" }
Pass
{
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
uniform sampler2D _MainTex;
uniform half4 _MainTex_ST;
struct vertexInput {
float4 vertex : POSITION;
half4 texcoord : TEXCOORD0;
};
struct vertexOutput {
half4 pos : SV_POSITION;
half4 tex : TEXCOORD0;
};
vertexOutput vert(vertexInput input)
{
vertexOutput output;
output.tex = input.texcoord;
output.pos = mul(UNITY_MATRIX_MVP, input.vertex);
return output;
}
float4 frag(vertexOutput input) : COLOR
{
fixed4 col = tex2D(_MainTex,
_MainTex_ST.xy * input.tex.xy + _MainTex_ST.zw);
return fixed4(1.0-col.a, 0.0, 0.0, col.a);
}
ENDCG
}
}
SubShader
{
Tags { "RenderType"="TransparentCutout" }
Pass
{
AlphaTest Greater [_Cutoff]
SetTexture[_MainTex] { constantColor(0.0,0.0,0.0,1.0) combine constant, texture }
}
}
}
}
Если нужно что бы работало и для земли, курите:
http://u3d.as/content/unity-technologie ... cement/3zx - там много букафф копировать.
P.S. Впервые пробую, т.ч. если что через
, я не виноват
Кто нибудь, может подсказать, какой формат и глубину использовать в данном случае.
Версия с фиксами для пятёрки
https://yadi.sk/d/JM9y_Jr3sAyu3