Unity shader学习之屏幕后期效果之调整屏幕亮度,饱和度,对比度
Unity的屏幕后期处理效果,使用MonoBehaviour.OnRenderImage来实现。
转载请注明出处:http://www.cnblogs.com/jietian331/p/7228063.html
如代码如下:
基类:
using UnityEngine; [RequireComponent(typeof(Camera))]
public abstract class PostEffectRenderer : GameBehaviour
{
protected abstract string ShaderName { get; } Material m_mat; void Start()
{
if (!SystemInfo.supportsImageEffects)
NotSupport();
} protected virtual void OnRenderImage(RenderTexture src, RenderTexture dest)
{
Graphics.Blit(src, dest, Mat);
} protected void NotSupport()
{
enabled = false;
} protected Material Mat
{
get
{
if (!m_mat)
{
Shader shader = Shader.Find(ShaderName);
if (shader != null && shader.isSupported)
m_mat = new Material(shader);
else
NotSupport();
}
return m_mat;
}
}
}
PostEffectRenderer
子类实现 :
using UnityEngine; public class ScreencolorsAdjuster : PostEffectRenderer
{
[SerializeField]
float m_brightness = ;
[SerializeField]
float m_saturation = ;
[SerializeField]
float m_contrast = ; protected override void OnRenderImage(RenderTexture src, RenderTexture dest)
{
base.Mat.SetFloat("_Brightness", m_brightness);
base.Mat.SetFloat("_Saturation", m_saturation);
base.Mat.SetFloat("_Contrast", m_contrast);
base.OnRenderImage(src, dest);
} protected override string ShaderName
{
get { return "Custom/Screencolors Adjuster"; }
}
}
ScreencolorsAdjuster
shader如下:
Shader "Custom/Screencolors Adjuster"
{
Properties
{
_MainTex("Main Texture", 2D) = "white" {}
_Brightness("Brightness", Float) =
_Saturation("Saturation", Float) =
_Contrast("Contrast", Float) =
} SubShader
{
Pass
{
ZTest Always
ZWrite Off
Cull Off CGPROGRAM
#pragma vertex vert
#pragma fragment frag sampler2D _MainTex;
float _Brightness;
float _Saturation;
float _Contrast; struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
}; struct v2f
{
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
}; v2f vert(appdata v)
{
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = v.uv; return o;
} fixed4 frag(v2f i) : SV_TARGET
{
fixed4 tex = tex2D(_MainTex, i.uv); fixed3 finalCol = tex.rgb * _Brightness; fixed luminance = dot(fixed3(0.2125, 0.7154, 0.0721), tex.rgb);
fixed3 luminanceCol = fixed3(luminance, luminance, luminance);
finalCol = lerp(finalCol, luminanceCol, _Saturation); fixed3 avgCol = fixed3(0.5, 0.5, 0.5);
finalCol = lerp(finalCol, avgCol, _Contrast); return fixed4(finalCol, tex.a);
} ENDCG
}
} Fallback Off
}
ScreencolorsAdjuster脚本挂在摄像机上:
调整参数,效果如下:
Unity shader学习之屏幕后期效果之调整屏幕亮度,饱和度,对比度的更多相关文章
- Opencv学习笔记4:Opencv处理调整图片亮度和对比度
一.理论基础 在数学中我们学过线性理论,在图像亮度和对比度调节中同样适用,看下面这个公式: 在图像像素中其中: 参数f(x)表示源图像像素. 参数g(x) 表示输出图像像素. 参数a(需要满足a> ...
- Unity Shader入门精要学习笔记 - 第12章 屏幕后处理效果
建立一个基本的屏幕后处理脚本系统 屏幕后处理,顾名思义,通常指的是在渲染完整个场景得到屏幕图像后,再对这个图像进行一系列操作,实现各种屏幕特效.使用这种技术,可以为游戏画面添加更多艺术效果,例如景深. ...
- Unity Shader 学习之旅
Unity Shader 学习之旅 unityshader图形图像 纸上学来终觉浅,绝知此事要躬行 美丽的梦和美丽的诗一样 都是可遇而不可求的——席慕蓉 一.渲染流水线 示例图 Tips:什么是 GP ...
- Unity Shader 学习之旅之SurfaceShader
Unity Shader 学习之旅之SurfaceShader unity shader 图形图像 如果大地的每个角落都充满了光明 谁还需要星星,谁还会 在夜里凝望 寻找遥远的安慰——江河 官方文档 ...
- Unity shader学习之屏幕后期处理效果之高斯模糊
高斯模糊,见 百度百科. 也使用卷积来实现,每个卷积元素的公式为: 其中б是标准方差,一般取值为1. x和y分别对应当前位置到卷积中心的整数距离. 由于需要对高斯核中的权重进行归一化,即使所有权重相加 ...
- 第四章 开始Unity Shader学习之旅(1)
1. 一个最简单的顶点/片元着色器 现在,我们正式开始学习如何编写Unity Shader,更准确的说是,学习如何编写顶点/片元着色器 2.顶点/片元着色器的基本结构 我们在以前已经讲过了Unity ...
- Unity Shader入门精要学习笔记 - 第5章 开始 Unity Shader 学习之旅
一个顶点/片元 着色器的结构大概如下: Shader "MyShaderName" { Properties { //属性 } SubShader { //针对显卡A的SubSha ...
- 第四章 开始Unity Shader学习之旅(2)
目录 1. 强大的援手:Unity提供的内置文件和变量 1.1 内置的包含文件 1.2 内置的变量 2. Unity提供的Cg/HLSL语义 2.1 什么是语义 2.2 Unity支持的语义 2.3 ...
- Unity Shader学习笔记-1
本篇文章是对Unity Shader入门精要的学习笔记,插图大部分来自冯乐乐女神的github 如果有什么说的不正确的请批评指正 目录 渲染流水线 流程图 Shader作用 屏幕映射 三角形遍历 两大 ...
随机推荐
- 【实战】Docker 入门实战一:ubuntu 和 centos 安装Docker
Docker是什么 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源.Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布 ...
- 如何将第三方jar包上传到Nexus私服
首先登陆私服服务器 以动力威视私服为例: 自己搭建的私服地址:http://192.168.1.5:8081/nexus/index.html#view-reposi ...
- 集齐所有机制的按键控制LED驱动
内核版本:linux2.6.22.6 硬件平台:JZ2440 驱动源码 final_key.c : #include <linux/module.h> #include <linux ...
- WPF 参数在Page见传递
void goButton_Click(object sender, RoutedEventArgs e) { this.NavigationService.Navigate(new ContentP ...
- 跨域的问题(nginx解决才是王道)
跨域分为两类:一时get跨域,而是post跨域.常见的是三种: 一种是jsonp, $.ajax({ url: "http://127.0.0.1/~chenjiebin/mycode/ph ...
- 10.7-uC/OS-III内部任务(定时器任务 OS_TmrTask())
{这节所说的定时器都是软件定时器} 1.uC/OS-III为用户提供了定时器任务,相应代码在OS_TMR.C中.定时器任务是可选的,通过将OS_CFG.H中的OS_CFG_TMR_EN设置为1使能.当 ...
- du 查看文件大小
[root@localhost ~]# du -sh /etc # 查看目录下所有文件大小 [root@localhost ~]# du -sh * # 查看所有文件大小
- caffe SSD目标检测lmdb数据格式制作
一.任务 现在用caffe做目标检测一般需要lmdb格式的数据,而目标检测的数据和目标分类的lmdb格式的制作难度不同.就目标检测来说,例如准备SSD需要的数据,一般需要以下几步: 1.准备图片并标注 ...
- vue 手指长按触发事件
按钮 <span class="btn" @touchstart="gtouchstart()" @touchmove="gtouchmove( ...
- [django]drf知识点梳理-分页
msyql分页 limit offset https://www.cnblogs.com/iiiiiher/articles/8846194.html django自己实现分页 https://www ...