=========源文件下载群========

QQ群:818511955

=========================

首先看效果

这次CS程序不变

=========CRLuo_CameraFX_Printer.cs

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

//摄像机特效(打印)C#public class CRLuo_CameraFX_Printer : MonoBehaviour

{

//特效Shader变量 private Shader shader;

//特效材质球变量 private Material material;

//马赛克彩色贴图 public Texture2D RGBimage;

//单块马赛克尺寸[Range(1, 100)]

public int tileSize = 10;

//显示模式[Range(0,4)]

public int displayModeID = 0;

//色阶[Range(0, 16)]

public int colorLevel = 0;

//程序启动处理部分 void Start()

{

//已于材质球路径获取shader shader = Shader.Find("CRLuo/CRLuo_CameraFX_Printer");

//依据Shader创建材质球 material = new Material(shader);

}

//渲染处理部分 void OnRenderImage(RenderTexture InImg, RenderTexture OutImg)

{

//片段是否成功获取Shader if (shader != null)

{

//图像贴图 material.SetTexture("_RGBTex", RGBimage);

//给特效材质球传递马赛克块儿尺寸参数 material.SetInt("_TileSize", tileSize);

//传递显示模式参数 material.SetInt("_DisplayModeID", displayModeID);

//色阶 material.SetInt("_ColorLevel", colorLevel);

//渲染(输入渲染图像,输出渲染图像,使用材质球) //输入渲染图像自动传递给材质球的_MainTex属性。 Graphics.Blit(InImg, OutImg, material);

}

else

{

//直接输出渲染图像 Graphics.Blit(InImg, OutImg);

}

}

}

====着重讨论一下Shader实现方法====

首先用PS绘制一个中心渐变的圆。

我们把这个圆平铺到每个马赛克上。

使用 彩色图像 与 (0.299, 0.587, 0.114) 点乘,可以获得一维灰度值。

灰度值保存在grey中。

提示:彩色中的亮度权重是不同的,在红绿蓝中 亮度顺序是 绿>红>蓝,因此使用不同的数值。

(更多的颜色亮度顺序 白>黄>青>品>绿>红>蓝>黑)

//把马赛克图像,转换为亮度图像

float grey = dot(col_Mosaic.rgb, float3(0.299, 0.587, 0.114));

获得结果:

ColorLevel可以用来降低灰度图像的色阶

//判断是否把灰度图像降低色阶if(_ColorLevel > 0)

{

//降低灰度色阶,与彩色降低色阶同理 grey = round(grey *_ColorLevel)/ _ColorLevel;

}

这样,调整colorLevel,就可以获得任意灰阶图像。

现在需要把,每个马赛克中的灰度数值与平铺图像中的每个像素亮度做比较。

首先使用col_RGB_X用来提取,平铺图像的R/G/B/A某一个通道。

col_RGB_x中的数值,

只要小于grey灰度值的,就涂fixed4(0,0,0,1)黑色。

否则,就涂fixed4(1,1,1,1)白色。

//当前圆点颜色 小于 灰度if(col_RGB_X < grey)

{

//墨点颜色col = fixed4(0,0,0,1);

}

else

{

//纸张颜色col = fixed4(1,1,1,1);

}

}

//输出贴图结果renturn col;

运行结果亮度反了。

使用(1-灰度)反向灰度值

//当前圆点颜色 小于 反相灰度

if(col_RGB_X < (1 - grey))

获得正确结果

======CRLuo_CameraFX_Printer.shader

Shader "CRLuo/CRLuo_CameraFX_Printer"

{

Properties

{

_MainTex ("需要处理的图像", 2D) = "white" {}

_RGBTex("RGB纹理图案", 2D) = "white" {}

_TileSize("块尺寸", Range(0, 100)) = 10

_DisplayModeID("显示模式ID", Range(0, 100)) = 0

_ColorLevel("色阶级数", Range(0, 255)) = 0

}

SubShader

{

Tags { "RenderType"="Opaque" }

LOD 100

Pass

{

//引入程序使用的函数集 CGPROGRAM

#pragma vertex vert #pragma fragment frag #include "UnityCG.cginc"

//获取场景模型数据 struct appdata

{

//获取模型顶点数据 float4 vertex : POSITION;

//获取模型UV数据 float2 uv : TEXCOORD0;

};

//定义顶点片段着色器数据类型 struct v2f

{

//UV数据 float2 uv : TEXCOORD0;

//顶点数据 float4 vertex : SV_POSITION;

};

//载入材质球主贴图 sampler2D _MainTex;

//获取贴图的偏移与重复数据float4 _MainTex_ST;

//载入材质球主贴图 sampler2D _RGBTex;

//载入马赛克尺寸(正整形数据)uniform int _TileSize;

//显示模式IDuniform int _DisplayModeID;

//显示模式IDuniform int _ColorLevel;

//顶点片段着色器程序 v2f vert (appdata v)

{

//定义输出数据 v2f o;

//顶点转换为摄像机视角坐标 o.vertex = UnityObjectToClipPos(v.vertex);

//应用贴图的偏移与重复 o.uv = TRANSFORM_TEX(v.uv, _MainTex);

//输出模型结果 return o;

}

//表面着色器程序 fixed4 frag (v2f i) : SV_Target

{

//获取马赛克块数量 = 屏幕像素个数/块的像素个数float2 TileSum = _ScreenParams / _TileSize;

//整理UV,让一个马赛克块儿中的UV统一为一个数据float2 uv_Mosaic = ceil(i.uv *TileSum)/ TileSum;

//把整理后的UV结果赋给渲染图像,获得马赛克画面。fixed4 col_Mosaic = tex2D(_MainTex, uv_Mosaic);

//把马赛克图像,转换为亮度图像float grey = dot(col_Mosaic.rgb, float3(0.299, 0.587, 0.114));

//判断是否把灰度图像降低色阶if(_ColorLevel > 0)

{

//降低色阶,与彩色降低色阶同理grey = round(grey *_ColorLevel)/ _ColorLevel;

}

// 平铺UVfloat2 uv_Tile = frac(i.uv * TileSum);

//生成电视机屏幕纹理fixed4 col_RGB = tex2D(_RGBTex, uv_Tile);

//定义输出马赛克图像fixed4 col = col_Mosaic;

//暂存RGB的一个通道fixed col_RGB_X;

//判断使用RGB的哪个通道进行合成switch (_DisplayModeID)

{

case 1:

col_RGB_X = col_RGB.r;//红break;

case 2:

col_RGB_X = col_RGB.g;//绿break;

case 3:

col_RGB_X = col_RGB.b;//蓝break;

case 4:

col_RGB_X = col_RGB.a;//透明break;

}

//判断是否使用通道效果if(_DisplayModeID>0)

{

//当前圆点颜色 小于 反相灰度if(col_RGB_X < (1 - grey))

{

//墨点颜色col = fixed4(0,0,0,1);

}

else

{

//纸张颜色col = fixed4(1,1,1,1);

}

}

//输出贴图结果 return col;

}

ENDCG

}

}

}

绘制各种渐变图案完成多样的效果

=======本节完========

unity黑白滤镜_Unity3D后期Shader特效-马赛克4-打印效果(黑白图像|明度比较)相关推荐

  1. unity黑白滤镜_unity游戏相机滤镜渲染后期色彩处理特效着色器Colorful FX v4.4

    unity游戏相机滤镜渲染后期色彩处理特效着色器Colorful FX v4.4,是一个可快速和自定义的后处理效果,颜色可调整. Colorful FX is a collection of high ...

  2. unity黑白滤镜_unity3D 把图片变黑白的Shader

    //下面是shader Shader "UI/Default Grey" { Properties { [PerRendererData] _MainTex ("Spri ...

  3. 4.5.2.3_黑白滤镜

    4.5.2.3_黑白滤镜 <!DOCTYPE html> <html><head><meta charset="UTF-8">< ...

  4. canvas--putImageData--(灰色滤镜、黑白滤镜、反色滤镜、模糊滤镜、马赛克滤镜)

    示例 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title& ...

  5. 火云开发课堂 - 《Shader从入门到精通》系列 第八节:在Shader中实现黑白滤镜

    <Shader从入门到精通>系列在线课程 第八节:在Shader中实现黑白滤镜 视频地址: http://edu.csdn.net/course/detail/1441/22672?aut ...

  6. Unity 粒子制作简单飞舞纸片特效

    首先在3dmax里做一个很简单的纸片,并直接贴上带有高光和颜色的材质. 纸片在空中飞舞时会"自转",所以在max里面先做一个简单的旋转动画,并在Renderer Setup中将其序 ...

  7. 【游戏开发渲染】Unity ShaderGraph使用教程与各种特效案例:Unity2022(持续更新)

    文章目录 一.ShaderGraph前言 二.ShaderGraph科普 1.渲染管线(Render Pipline) 2.可编程渲染管线,SRP(Scriptable Render Pipline) ...

  8. Android Camera使用OpenGL ES 2.0和GLSurfaceView对预览进行实时二次处理(黑白滤镜)

    第一篇 Android Camera使用OpenGL ES 2.0和GLSurfaceView对预览进行实时二次处理(黑白滤镜) 第二篇 Android Camera使用OpenGL ES 2.0和T ...

  9. Android Camera API 2使用OpenGL ES 2.0和GLSurfaceView对预览进行实时二次处理(黑白滤镜)

    这段时间有点忙,一直没时间写第三篇教程,其实代码很早之前就写好了.本系列教程会有三篇文章讲解Android平台滤镜的实现方式,希望在阅读本文之前先阅读前面两篇文档. 第一篇 Android Camer ...

最新文章

  1. R语言plotly可视化:使用PCA算法进行数据降维、使用plotly可视化随着主成分的增加解释的方差的量(plotting explained variance)
  2. java游戏移动_java - Java游戏 - 如何让敌人移动? - SO中文参考 - www.soinside.com
  3. 鲍尔默说:你的东西再大 微软也装得下
  4. 第二章 反向传播算法如何工作的?
  5. Python:利用python编程实现三维图像绘制展示(六面体旋转、三维球柱状体、下雪场景等)
  6. Python:为什么只有一个元素的tuple要加逗号?
  7. LeetCode Algorithm 507. 完美数
  8. 八皇后问题求解动态图形演示
  9. CityEngine 2012与ArcGIS 10.2破解心得
  10. vector function trmplate
  11. Visual Studio Code 前端调试不完全指南
  12. python怎么索引json中的值_使用Python在JSON中查找值
  13. zabbix修改tomcat监控端口
  14. SQL JOIN 简单介绍
  15. 怎么估算空间利用率?新研发传感器分分钟搞定!
  16. 腾讯内部几乎满分的项目管理PPT
  17. 智能家居APP设计规格
  18. 移动互联网产品数据分析
  19. 外贸常用术语_常用贸易术语大全
  20. 【有始有终,不让自己的付出辜负了自己期望 】

热门文章

  1. 《ANSYS CFX 14.0超级学习手册》——第2章 CFX软件简介2.1 CFX的软件构成
  2. 在Docker中使用Dockerfile实现ISO文件转化为完整版Centos镜像,并搭建集群数据仓库
  3. 树莓派HMCL安装我的世界
  4. async_fifo实现与注意要点
  5. 全志allwinner A40i平台ads1115模块AD采样
  6. Redis该怎么学?其实很简单,这份学习路线+资料+书单我全部贡献出来了!
  7. 部署CloudSim云计算仿真平台
  8. mac java模拟器_iOS学习——如何在mac上获取开发使用的模拟器的资源以及模拟器中每个应用的应用沙盒...
  9. python如何下载tushare_python tushare安装
  10. 全国大学生数学建模竞赛2020A题炉温曲线MATLAB程序