一个简单的屏幕效果

在屏幕特效通用脚本的基础上,制作一个简单的灰度效果。
首先是使用的挂在摄像机上面的脚本:

[ExecuteInEditMode]
public class MyTestRenderImage : MonoBehaviour
{public Shader curShader = null;[Range(0f, 1f)]//添加此特性后可在Inspector面板中使用滑动条控制grayScaleAmount//控制灰度值public float grayScaleAmount = 1.0f;private Material curMaterial = null;private Material CurMaterial{get{if(curMaterial == null){curMaterial = new Material(curShader);curMaterial.hideFlags = HideFlags.HideAndDontSave;}return curMaterial;}}private void Start(){if(!SystemInfo.supportsImageEffects){enabled = false;return;}if(!curShader && !curShader.isSupported){enabled = false;}}private void OnRenderImage(RenderTexture source, RenderTexture destination){if(curShader){//使用grayScaleAmount控制着色器中对应的属性数值CurMaterial.SetFloat("_LuminosityAmount", grayScaleAmount);Graphics.Blit(source, destination, CurMaterial);}else{Graphics.Blit(source, destination);}}private void Update(){        //检查并将grayScaleAmount的值限定在0到1之间grayScaleAmount = Mathf.Clamp01(grayScaleAmount);}private void OnDisable(){if(curMaterial){DestroyImmediate(curMaterial);}}
}

通过和之前基本结构的对比,可以看出此脚本只是多了对于grayScaleAmount这一灰度数值相关的代码。
通过CurMaterial.SetFloat("_LuminosityAmount", grayScaleAmount);可以实现外部对于着色器的控制,从而直接看到屏幕效果的变化。
当然如果为了简便也可以通过继承的方式,将基本结构作为父类,改写其中相应的函数来简化代码,此处为了进行对比,所以还是直接将其直接写了出来。

下面是用到的shader代码:

Shader "RenderImage/MyTestRenderImage"
{Properties {_MainTex("Base Tex", 2D) = "white"{}_LuminosityAmount("GrayScale Amount", Range(0.0, 1)) = 1.0}SubShader {Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"sampler2D _MainTex;fixed _LuminosityAmount;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);float luminosity = 0.299 * renderTex.r + 0.587 * renderTex.g + 0.114 * renderTex.b;fixed4 finalColor = lerp(renderTex, luminosity, _LuminosityAmount);return finalColor;}ENDCG}}}   //end shader

在此Shader中,使用了Unity内置的appdata_img结构体作为顶点着色器的输入。
此结构体位于UnityCG.cginc中,只包含图像处理时必须的定点坐标和纹理坐标等变量。

struct appdata_img
{float4 vertex : POSITION;half2 texcoord : TEXCOORD0;UNITY_VERTEX_INPUT_INSTANCE_ID
};

vert顶点着色器中,仅进行了必要的顶点变换和uv坐标的赋值。
frag片元着色器中,通过lerp差值返回最终的屏幕颜色。
其中需要注意的是以下代码:

float luminosity = 0.299 * renderTex.r + 0.587 * renderTex.g + 0.114 * renderTex.b;

此代码中的(0.299, 0.587, 0.114)并不是随意写上去的,经过查询资料显示,这个是一个经典的色彩心理学公式。

Gray = R*0.299 + G*0.587 + B*0.114

目的是将彩色转化为灰度,是国际公认的一个公式。其中Gray是最终的灰度值,R代表红色通道、G代表绿色通道、B代表蓝色通道。
知道了这个公式,片元着色器中的代码意义也就可以很轻松的理解了。

//根据uv获取相应像素的颜色值
fixed4 renderTex = tex2D(_MainTex, i.uv);
//按照公式,将颜色值转化为对应的灰度值
float luminosity = 0.299 * renderTex.r + 0.587 * renderTex.g + 0.114 * renderTex.b;
//通过差值,返回经过_LuminosityAmount控制的最终颜色
fixed4 finalColor = lerp(renderTex, luminosity, _LuminosityAmount);

以下是此Shader的效果

grayScaleAmount = 0

grayScaleAmount = 0.25

grayScaleAmount = 0.5

grayScaleAmount = 0.75

grayScaleAmount = 1.0

grayScaleAmount = 0时,最终展示的是正常的彩色效果图像。
grayScaleAmount = 1时,最终展示的是完全的灰度效果图像。

由于此Shader是书中学习使用的,所以其中仅有达到效果所需的必要代码,但是实际项目过程中需要对Shader进行优化后才能使用。

【《Unity着色器和屏幕特效开发秘笈》】学习整理:关于屏幕特效【2】相关推荐

  1. 《Unity着色器和屏幕特效开发秘笈》—— 3.4 创建BlinnPhong高光类型

    本节书摘来自华章出版社<Unity着色器和屏幕特效开发秘笈>一 书中的第3章,第3.4节,作者:(美)Kenny Lammers,更多章节内容可以访问云栖社区"华章计算机&quo ...

  2. 《Unity着色器和屏幕特效开发秘笈》—— 2.1 引言

    本节书摘来自华章出版社<Unity着色器和屏幕特效开发秘笈>一 书中的第2章,第2.1节,作者:(美)Kenny Lammers,更多章节内容可以访问云栖社区"华章计算机&quo ...

  3. 《Unity着色器和屏幕特效开发秘笈(原书第2版)》一2.9 打包和混合纹理

    本节书摘来自华章出版社<Unity着色器和屏幕特效开发秘笈(原书第2版)>一书中的第2章,第2.9节,作者 [英]艾伦朱科尼(Alan Zucconi) [美]肯尼斯拉默斯(Kenneth ...

  4. 《Unity着色器和屏幕特效开发秘笈》—— 1.7 创建渐变纹理来控制漫反射着色...

    本节书摘来自华章出版社<Unity着色器和屏幕特效开发秘笈>一 书中的第1章,第1.7节,作者:(美)Kenny Lammers,更多章节内容可以访问云栖社区"华章计算机&quo ...

  5. 《Unity着色器和屏幕特效开发秘笈》—— 第3章 利用镜面反射让游戏闪耀起来...

    本节书摘来自华章出版社<Unity着色器和屏幕特效开发秘笈>一 书中的第3章,第3.1节,作者:(美)Kenny Lammers,更多章节内容可以访问云栖社区"华章计算机&quo ...

  6. 《Unity着色器和屏幕特效开发秘笈》—— 1.1 引言

    本节书摘来自华章出版社<Unity着色器和屏幕特效开发秘笈>一 书中的第1章,第1.1节,作者:(美)Kenny Lammers,更多章节内容可以访问云栖社区"华章计算机&quo ...

  7. 《Unity着色器和屏幕特效开发秘笈》—— 2.5 法线贴图

    本节书摘来自华章出版社<Unity着色器和屏幕特效开发秘笈>一 书中的第2章,第2.5节,作者:(美)Kenny Lammers,更多章节内容可以访问云栖社区"华章计算机&quo ...

  8. 《Unity着色器和屏幕特效开发秘笈(原书第2版)》——2.6 法线映射

    本节书摘来自华章计算机<Unity着色器和屏幕特效开发秘笈(原书第2版)>一书中的第2章,第2.6节,作者 [英]艾伦朱科尼(Alan Zucconi)[美]肯尼斯拉默斯(Kenneth ...

  9. 《Unity着色器和屏幕特效开发秘笈(原书第2版)》一2.6 法线映射

    本节书摘来自华章出版社<Unity着色器和屏幕特效开发秘笈(原书第2版)>一书中的第2章,第2.6节,作者 [英]艾伦朱科尼(Alan Zucconi) [美]肯尼斯拉默斯(Kenneth ...

最新文章

  1. BZOJ 3585: mex( 离线 + 线段树 )
  2. vue 插入dom_vue内部复用问题以及虚拟dom的更新
  3. Oracle PL/SQL中如何使用%TYPE和%ROWTYPE
  4. TensorFlow MNIST CNN LeNet5模型
  5. linux 的ip 设置lo_Linux服务器设置静态IP的方法
  6. python缩进tab还是空格_Python码农有话说:写代码时应该缩进使用 tab还是空格?...
  7. 木桶布局 原理与实现
  8. accept 返回0_使用Vue3.0新特性造轮子 WidgetUI3.0 (Upload上传文件组件)
  9. 站在BERT肩膀上的NLP新秀们(PART III)
  10. SVN客户端的使用方法
  11. css代码样式大全(整理版)
  12. 【SQL】数据库模糊查询
  13. 西安三星电子笔试面试
  14. peoplesoft 更新表接口程序
  15. excel仪表盘制作,商业智能仪表盘的作用
  16. linux shell 看门狗,Linux 下如何使用看门狗
  17. 【云计算】通俗易懂讲云计算与虚拟化区别
  18. 一阶低通滤波器-连续转离散
  19. 《Hyperledger Fabric: A Distributed Operating System for Permissioned Blockchains》笔记
  20. 计算1~10所有数的平方和

热门文章

  1. 用MFC画一个美国队长的盾牌
  2. c语言 的意思啊,c语言中!1是什么意思啊
  3. php jwt设置有效期,07-如何设置JWT的过期时间
  4. php 五角星,php使用GD库画五角星
  5. python读取ymal文件
  6. [KMP]zoj 3587:Marlon's String
  7. 《数据结构与算法》——Java版
  8. JavaScript中的二进制搜索算法
  9. 据说很多程序员下班后都不关电脑,入职开机,离职关机,是真的吗?
  10. 备份/恢复数据库资料