UnityShader屏幕后处理
2018-02-26 10:30
309 查看
屏幕后处理实际为利用shader处理最终呈现在相机中的图片。但是shader不能直接与c#数据传递,所以创建material来沟通。
1 创建shader
shader中的_MainTex为默认相机最终图片所以必须。然后就可以调整整张图片的风格渲染。
2 检查这个平台是不是支持图片效果。
3 检查一步骤中的shader是不是被各个平台支持,并且创建材质
4 在c#脚本中处理图片
OnRenderImage函数会在所有不透明和透明的Pass执行完毕后被调用(可选)。参数src对应源纹理,dest为目标渲染纹理。通过material处理shader中的src纹理变为dest纹理。处理过程为material.SetFloat(“_Contrast”, contrast);等等。新纹理赋予旧纹理为Graphics.Blit(src, dest, material);处理的纹理为shader中的_MatinTex。
5源码
PostEffectsBase.cs
BrightnessSaturationAndContrast.cs
Brightness.shader
1 创建shader
shader中的_MainTex为默认相机最终图片所以必须。然后就可以调整整张图片的风格渲染。
2 检查这个平台是不是支持图片效果。
protected bool CheckSupport() { if (SystemInfo.supportsImageEffects == false) { Debug.LogWarning("This platform does not support image effects."); return false; } return true; }
3 检查一步骤中的shader是不是被各个平台支持,并且创建材质
protected Material CheckShaderAndCreateMaterial(Shader shader, Material material) { if (shader == null) { return null; } if (shader.isSupported && material && material.shader == shader) return material; if (!shader.isSupported) { return null; } else { material = new Material(shader); material.hideFlags = HideFlags.DontSave; if (material) return material; else return null; } }
4 在c#脚本中处理图片
void OnRenderImage(RenderTexture src, RenderTexture dest) { if (material != null) { material.SetFloat("_Brightness", brightness); material.SetFloat("_Saturation", saturation); material.SetFloat("_Contrast", contrast); Graphics.Blit(src, dest, material); } else { Graphics.Blit(src, dest); } }
OnRenderImage函数会在所有不透明和透明的Pass执行完毕后被调用(可选)。参数src对应源纹理,dest为目标渲染纹理。通过material处理shader中的src纹理变为dest纹理。处理过程为material.SetFloat(“_Contrast”, contrast);等等。新纹理赋予旧纹理为Graphics.Blit(src, dest, material);处理的纹理为shader中的_MatinTex。
5源码
PostEffectsBase.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[ExecuteInEditMode]
[RequireComponent (typeof(Camera))]
public class PostEffectsBase : MonoBehaviour {
protected bool CheckSupport() { if (SystemInfo.supportsImageEffects == false) { Debug.LogWarning("This platform does not support image effects."); return false; } return true; }
protected void NotSupported() {
enabled = false;
}
protected void CheckResources() {
bool isSupported = CheckSupport();
if (isSupported == false) {
NotSupported();
}
}
protected void Start() {
CheckResources();
}
// Called when need to create the material used by this effect
protected Material CheckShaderAndCreateMaterial(Shader shader, Material material) { if (shader == null) { return null; } if (shader.isSupported && material && material.shader == shader) return material; if (!shader.isSupported) { return null; } else { material = new Material(shader); material.hideFlags = HideFlags.DontSave; if (material) return material; else return null; } }
}
BrightnessSaturationAndContrast.cs
using UnityEngine;
using System.Collections;
public class BrightnessSaturationAndContrast : PostEffectsBase {
public Shader briSatConShader;
private Material briSatConMaterial;
public Material material {
get {
briSatConMaterial = CheckShaderAndCreateMaterial(briSatConShader, briSatConMaterial);
return briSatConMaterial;
}
}
[Range(0.0f, 3.0f)]
public float brightness = 1.0f;
[Range(0.0f, 3.0f)]
public float saturation = 1.0f;
[Range(0.0f, 3.0f)]
public float contrast = 1.0f;
void OnRenderImage(RenderTexture src, RenderTexture dest) { if (material != null) { material.SetFloat("_Brightness", brightness); material.SetFloat("_Saturation", saturation); material.SetFloat("_Contrast", contrast); Graphics.Blit(src, dest, material); } else { Graphics.Blit(src, dest); } }
}
Brightness.shader
Shader "Custom/Brightness Saturation And Contrast" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {} _Brightness ("Brightness", Float) = 1 _Saturation("Saturation", Float) = 1 _Contrast("Contrast", Float) = 1 } SubShader { Pass { ZTest Always Cull Off ZWrite Off CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" sampler2D _MainTex; half _Brightness; half _Saturation; half _Contrast; struct v2f { float4 pos : SV_POSITION; half2 uv: TEXCOORD0; }; v2f vert(appdata_img v) { v2f o; o.pos = UnityObjectToClipPos(v.vertex); o.uv = v.texcoord; return o; } fixed4 frag(v2f i) : SV_Target { fixed4 renderTex = tex2D(_MainTex, i.uv); // Apply brightness fixed3 finalColor = renderTex.rgb * _Brightness; // Apply saturation fixed luminance = 0.2125 * renderTex.r + 0.7154 * renderTex.g + 0.0721 * renderTex.b; fixed3 luminanceColor = fixed3(luminance, luminance, luminance); finalColor = lerp(luminanceColor, finalColor, _Saturation); // Apply contrast fixed3 avgColor = fixed3(0.5, 0.5, 0.5); finalColor = lerp(avgColor, finalColor, _Contrast); return fixed4(finalColor, renderTex.a); } ENDCG } } Fallback Off }
相关文章推荐
- unity使用屏幕后处理实现闪烁特效,创建新的shader文件过程
- Unity Shader-后处理:屏幕水波效果
- Unity shader学习之屏幕后期处理效果之边缘检测
- UnityShader屏幕后处理-边缘检测,经典的插值lerp
- UnityShader屏幕后处理-Bloom效果(朦胧模糊)
- 在Unity的后处理shader中通过屏幕像素坐标和深度贴图反推世界坐标
- Unity_Shader高级篇_12.3_后处理_屏幕水波效果
- UnityShader屏幕后处理-高斯模糊
- Unity Shader入门精要学习笔记 - 第12章 屏幕后处理效果
- Unity中surfaceShader的处理机制和finalColor
- unity shader 固定管线实例(六) 透明度测试剔除尖锐边缘的模糊处理
- unity 场景向屏幕中心塌陷的shader
- Unity Shader——夜晚视觉屏幕特效(night vision Screen Effect)
- Unity Shader-后处理:简单均值模糊
- UnityShader 屏幕特效入门前
- 【unity】【shader】屏幕高斯模糊(Gaussian Blur)后期特效的实现
- Unity Shader-后处理:高斯模糊
- unity,实现屏幕后处理的两种方法
- Unity Shader-后处理:景深
- Unity&Shader案例篇—屏幕渐暗效果