无双屏幕特效

Camera Shader

Shader "Effect/WS_Camera" {
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
}
SubShader
{
Pass
{
Tags{"LightMode" = "Always"}
ZTest Always
Cull off
ZWrite off
Fog {Mode off}

CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
            #pragma target 3.0
#include "UnityCG.cginc"

uniform sampler2D _MainTex;
uniform fixed4 _MainTex_TexelSize;
uniform fixed _CenterX, _CenterY;
uniform fixed _Strength;
uniform fixed _RadiusX, _RadiusY;
uniform fixed _Hue;
uniform fixed _Saturation;
uniform fixed _Value;

            float3 RGB2HSV( float3 RGB )
            {
                float4 k = float4(0.0, -1.0/3.0, 2.0/3.0, -1.0);
                float4 p = RGB.g < RGB.b ? float4(RGB.b, RGB.g, k.w, k.z) : float4(RGB.gb, k.xy);
                float4 q = RGB.r < p.x   ? float4(p.x, p.y, p.w, RGB.r)   : float4(RGB.r , p.yzx);
                float  d = q.x - min(q.w, q.y);
                float  e = 1.0e-10;
                return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);
            }

            float3 HSV2RGB( float3 HSV )
            {
                float4 k = float4(1.0, 2.0/3.0, 1.0/3.0, 3.0);
                float3 p = abs(frac(HSV.xxx + k.xyz) * 6.0 - k.www);
                return HSV.z * lerp(k.xxx, clamp(p - k.xxx, 0.0, 1.0), HSV.y);
            }

v2f_img vert(appdata_img v)
{
v2f_img o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);

#ifdef UNITY_HALF_TEXEL_OFFSET
v.texcoord.y += _MainTex_TexelSize.y;
#endif

#if SHADER_API_D3D9
if (_MainTex_TexelSize.y < 0)
v.texcoord.y = 1.0 - v.texcoord.y;
#endif

o.uv = MultiplyUV(UNITY_MATRIX_TEXTURE0, v.texcoord);
return o;
}

fixed4 frag (v2f_img i) : COLOR
{
fixed4 main = tex2D(_MainTex, i.uv);

half2 center = fixed2(_CenterX, _CenterY);
i.uv -= center;

//Radial Blur
for(int j = 1; j < 10; j++)
{
float scale = 1.0 + (-_Strength * j / 10.0);
main.rgb += tex2D(_MainTex, i.uv * scale + center);
}

main.rgb /= 9;

//LensCircle
fixed dist = distance(i.uv + center, fixed2(_CenterX, _CenterY));
main.rgb *= smoothstep(_RadiusX, _RadiusY, dist);

//HSV
                fixed3 colorTemp = RGB2HSV( main.rgb ).rgb;
                fixed3 finalColor = HSV2RGB( float3(float2((_Hue+colorTemp.r),(_Saturation+colorTemp.g)),(_Value+colorTemp.b)) );
                main.rgb *= finalColor;

return main;
}
ENDCG
}
}
FallBack off
}

Unity调用

using UnityEngine;

[ExecuteInEditMode]
public class WS_Camera : MonoBehaviour
{
    private Material _material;
    public Shader _shader;

 //Variables//
    public float centerX = 0.5f;
 public float centerY = 0.5f;
    public float radiusX = 0.8f;
    public float radiusY = 0.4f;
 public float strength = 0.1f;
    public float _Hue = 0.0f;
    public float _Saturation = 0.0f;
    public float _Value = 0.0f;
    //Properties
    Material material
    {
        get
        {
            if (_material == null)
            {
                _material = new Material(_shader);
                _material.hideFlags = HideFlags.HideAndDontSave;
            }
            return _material;
        }
    }
    void Start()
    {
        //_shader = Shader.Find("DreamFaction/Effect/WS_Camera");
        if (!SystemInfo.supportsImageEffects)
        {
            enabled = false;
            return;
        }
        if (!_shader && !_shader.isSupported)
        {
            enabled = false;
        }
    }

 void OnRenderImage(RenderTexture source, RenderTexture destination) {
        if (_shader != null)
        {
            material.SetFloat("_CenterX", centerX);
            material.SetFloat("_CenterY", centerY);
            material.SetFloat("_RadiusX", radiusX);
            material.SetFloat("_RadiusY", radiusY);
            material.SetFloat("_Strength", strength);
            material.SetFloat("_Hue", _Hue);
            material.SetFloat("_Saturation", _Saturation);
            material.SetFloat("_Value", _Value);
            Graphics.Blit(source, destination, _material);
        }
 }
    void OnDisable()
    {
        if (_material)
        {
            DestroyImmediate(_material);
        }
    }
}

运行测试

  

时间: 2024-10-03 14:45:09

无双屏幕特效的相关文章

Unity3d 屏幕特效实现类似死亡之后的全屏黑白效果

全屏特效 黑白(对于<着色器和屏幕特效开发秘籍>的学习) 可实现死亡效果或需要黑白特效的效果 原理是通过OnRenderImage()函数在摄像机渲染的时候,改变颜色(饱和度) 新建一个c#脚本,将要放在摄像机中 [ExecuteInEditMode] 就是让这个脚本不开始也直接运行,方便观察效果 using UnityEngine; using System.Collections; [ExecuteInEditMode] public class ShaderTest : MonoBeha

UnityShader实例15:屏幕特效之Bloom

http://blog.csdn.net/u011047171/article/details/48522073 Bloom特效 概述 Bloom,又称"全屏泛光",是游戏中常用的一种镜头效果,是一种比较廉价的"伪HDR"效果(如下右图):使用了Bloom效果后,画面的对比会得到增强,亮的地方曝光也会得到加强,画面也会呈现一种朦胧,梦幻的效果,婚纱摄影中照片处理经常用到这种类似处理效果.Bloom效果一般用来近似模拟HDR效果,效果也比较相向,但实现原理却完全不同.

UnityShader实例11:屏幕特效之马赛克(Mosaic)材质

马赛克(Mosaic)材质 概述 马赛克(Mosaic),估计是大伙平时很常见最讨厌的图片处理手段,嘿嘿,没错我说的就是"打码".好了,正经点,马赛克指现行广为使用的一种图像(视频)处理手段,此手段将影像特定区域的色阶细节劣化并造成色块打乱的效果,因为这种模糊看上去有一个个的小格子组成,便形象的称这种画面为马赛克.其目的通常是让图像大规模的降低图像()视频分辨率,而让图像(视频)的一些细节隐藏起来,使之无法辨认,一般用来保护隐私,或者隐藏某些不健康的画面. 原理 要实现马赛克的效果,需

unity3d 老电影式的屏幕特效

做出这种古老效果,需要: 颜色发黄, 晕影效果, 灰尘与刮痕的效果. 建立一个c#脚本,将要放在摄像头中 先声明变量 oldFilmShader    所需shader(一会需要编写) OldFilmEffectAmount    古老的程度(最后做插值的程度值) sepiaColor    屏幕的颜色(调至黑黄) vigentteTexture        老电影式基本贴图 vigentteAmount         所占比重 scratchesTexture    刮痕贴图 scratc

【浅墨Unity3D Shader编程】之九 深入理解Unity5中的Standard Shader (一)&amp;屏幕水幕特效的实现

本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接:http://blog.csdn.net/poem_qianmo/article/details/49556461 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 本文工程使用的Unity3D版本: 5.2.1 概要:本文主要介绍了Unity5中的标准着色器,并且也涉及到了基于物理的着色.延迟渲染等高级着色技术,而在文章后半部分,也对屏幕水幕特效的实现方法进行了讲解与分析. 依然是附上

【浅墨Unity3D Shader编程】之十 深入理解Unity5中的Standard Shader(二)&amp;屏幕油画特效的实现

本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接:http://blog.csdn.net/poem_qianmo/article/details/49719247 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 本文工程使用的Unity3D版本: 5.2.1 概要:本文讲解了Unity中着色器编译多样化的思路,并对Standard Shader中正向基础渲染通道的源码进行了分析,以及对屏幕油画特效进行了实现. 众所周知,Unity官

【浅墨Unity3D Shader编程】之十一 深入理解Unity5中的Standard Shader(三)&amp;屏幕像素化特效的实现

本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接:http://blog.csdn.net/poem_qianmo/article/details/50095705 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 本文工程使用的Unity3D版本: 5.2.1  概要:续接上文,本文进一步讲解与分析了上文未讲完的Unity5中Standard Shader正向基础渲染通道源码的片段着色实现部分,以及对屏幕像素化后期特效进行了实现. 同

【Unity Shader编程】之十五 屏幕高斯模糊(Gaussian Blur)后期特效的实现

本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接:http://blog.csdn.net/poem_qianmo/article/details/51871531 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 本文工程使用的Unity3D版本: 5.2.1  本篇文章将分析如何在Unity中基于Shader实现高斯模糊屏幕后期特效. 首先放出最终的实现效果.如下几幅图,是在Unity中使用本文所实现的Shader得到的高斯模糊屏幕

使用Unity Render Textures实现画面特效——建立画面特效脚本系统

本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源(当然你也可以从官网下载). ========================================== 分割线 ========================================== 写在前面 最近由于成为研一新生,被入学的各种事情耽误,好久没有更新博客,好惭愧...刚收拾好我就来更