unity3d ppsspp模拟器中的post processing shader在unity中使用

这个位置可以看到ppsspp的特殊处理

文件位置

来看看这些特效

用来测试的未加特效图片

ppsspp:

传说系列一生爱---英杰传说

最后的战士

aacolor

是关于饱和度,亮度,对比度,色调的调节,
ppsspp中的默认参数为饱和度加强1.2倍,对比度增强1.25倍,在unity中我们可以设为外部变量自己调节

关键代码:

		float4 frag(v2f i) :COLOR
		{
			float size = 1 / _Size;

			float3 c10 = tex2D(_MainTex, i.uv_MainTex + float2(0, -1)*size).rgb;
			float3 c01 = tex2D(_MainTex, i.uv_MainTex + float2(-1, 0)*size).rgb;
			float3 c11 = tex2D(_MainTex, i.uv_MainTex).rgb;
			float3 c21 = tex2D(_MainTex, i.uv_MainTex + float2(1, 0)*size).rgb;
			float3 c12 = tex2D(_MainTex, i.uv_MainTex + float2(0, 1)*size).rgb;

			float3 dt = float3(1.0, 1.0, 1.0);
			float k1 = dot(abs(c01 - c21), dt);
			float k2 = dot(abs(c10 - c12), dt);

			float3 color = (k1*(c10 + c12) + k2*(c01 + c21) + 0.001*c11) / (2.0*(k1 + k2) + 0.001);

			float x = sqrt(dot(color, color));

			color.r = pow(color.r + 0.001, _A);
			color.g = pow(color.g + 0.001, _A);
			color.b = pow(color.b + 0.001, _A);

			//饱和度,亮度,对比度,色调映射
			return float4(contrast4(x)*normalize(color*_C_ch)*_B,1);

		}

ppsspp中实测

unity中实测

bloom

辉光效果
ppsspp中的辉光在unity种效果并不好,模糊处理不够,亮度过量,采样方式为grid采样
之前写过一篇详细博文关于HDR(与bloom相似)

关键代码:

	float4 frag(v2f i) :COLOR
			{
				float size = 1 / _Size;
				float2 uv = i.uv_MainTex;

				float3 color = tex2D(_MainTex, i.uv_MainTex);
				float4 sum = 0;
				float3 bloom;

				for (int i = -3; i < 3; i++)
				{
					sum += tex2D(_MainTex, uv + float2(-1, i)*size) * _Amount;
					sum += tex2D(_MainTex, uv + float2(0, i)*size) * _Amount;
					sum += tex2D(_MainTex, uv + float2(1, i)*size) * _Amount;
				}

				if (color.r < 0.3 && color.g < 0.3 && color.b < 0.3)
				{
					bloom = sum.rgb*sum.rgb*0.012 + color;
				}
				else
				{
					if (color.r < 0.5 && color.g < 0.5 && color.b < 0.5)
					{
						bloom = sum.xyz*sum.xyz*0.009 + color;
					}
					else
					{
						bloom = sum.xyz*sum.xyz*0.0075 + color;
					}
				}

				bloom = mix(color, bloom, _Power);

				return float4(bloom, 1);
			}

ppsspp中实测

unity中实测

cartoon

卡通效果的post processing
颜色总共分为四层,把颜色灰度每层段数值再加上减到最少的小数部分,产生一些过渡效果
再用得出的灰度乘上原色值,保留了原来的颜色只是明暗分为四层,层之间有过度
通过边缘检测描边,着色道理与之前写过的一篇详细博文像似,但不完全相同,

关键代码:

	float4 frag(v2f i) :COLOR
			{
				float size = 1 / _Size;

				float3 c00 = tex2D(_MainTex, i.uv_MainTex + float2(-1, -1)*size).rgb;
				float3 c10 = tex2D(_MainTex, i.uv_MainTex + float2(0, -1)*size).rgb;
				float3 c20 = tex2D(_MainTex, i.uv_MainTex + float2(1, -1)*size).rgb;
				float3 c01 = tex2D(_MainTex, i.uv_MainTex + float2(-1, 0)*size).rgb;
				float3 c11 = tex2D(_MainTex, i.uv_MainTex).rgb;
				float3 c21 = tex2D(_MainTex, i.uv_MainTex + float2(1, 0)*size).rgb;
				float3 c02 = tex2D(_MainTex, i.uv_MainTex + float2(-1, 1)*size).rgb;
				float3 c12 = tex2D(_MainTex, i.uv_MainTex + float2(0, 1)*size).rgb;
				float3 c22 = tex2D(_MainTex, i.uv_MainTex + float2(1, 1)*size).rgb;
				float3 dt = float3(1.0, 1.0, 1.0);

				float d1 = dot(abs(c00 - c22), dt);
				float d2 = dot(abs(c20 - c02), dt);
				float hl = dot(abs(c01 - c21), dt);
				float vl = dot(abs(c10 - c12), dt);
				float d = _Bb*(d1 + d2 + hl + vl) / (dot(c11, dt) + 0.15);

				float lc = 4.0*length(c11);

				float f = frac(lc);
				f *= f;
				lc = 0.25*(floor(lc) + f*f) + 0.05;
				//颜色总共分为四层,把颜色灰度每层段数值再加上减到最少的小数部分,产生一些过渡效果

				c11 = 4.0*normalize(c11);
				float3 frct = frac(c11);
				frct *= frct;
				c11 = floor(c11) + 0.05*dt + frct*frct;
				return float4(0.25*lc*(1.1 - d*sqrt(d))*c11,1);
				//再用得出的灰度乘上原色值,保留了原来的颜色只是明暗分为四层,层之间有过度
				//通过边缘检测描边,着色道理与之前的一篇文章像似,但不完全相同,

			}

ppsspp中实测

unity中实测

CRT

CRT是模拟以前大脑袋电脑的阴极射线管(Cathode Ray Tube)的显示器的特殊效果,频闪之类的特效,用过大脑袋的都懂。

关键代码:

		float4 frag(v2f i) :COLOR
			{

				// scanlines
				float vPos = float((i.uv_MainTex.y + _Time.z * 0.5) * 272.0);
				float j = 2;
				float line_intensity = modf(float(vPos), j);

				// color shift
				float off = line_intensity *0.00001;
				float2 shift = float2(off, 0);

				// shift R and G channels to simulate NTSC color bleed
				float2 colorShift = float2(0.001, 0);
				float r = tex2D(_MainTex, i.uv_MainTex + colorShift + shift).x;
				float g = tex2D(_MainTex, i.uv_MainTex - colorShift + shift).y;
				float b = tex2D(_MainTex, i.uv_MainTex).z;

				float4 c = float4(r, g * 0.99, b, 1) * clamp(line_intensity, 0.85, 1);

				float rollbar = sin((i.uv_MainTex.y + _Time.z) * 30);

				return c + (rollbar * 0.02);
			}

ppsspp中实测

unity中实测

fxaa

ppsspp的fxaa抗锯齿效果在unity上异常的好,耗费很少,
四个采样点来进行边缘检测(边缘检测的很粗糙),边缘处两个点之间模糊

关键代码:

	float4 frag(v2f i) :COLOR
			{

				float	u_texelDelta = 1 / _Size;

				float FXAA_SPAN_MAX = 8.0;
				float FXAA_REDUCE_MUL = 1.0 / 8.0;
				float FXAA_REDUCE_MIN = (1.0 / 128.0);

				float3 rgbNW = tex2D(_MainTex, i.uv_MainTex + (float2(-1.0, -1.0) * u_texelDelta)).xyz;
				float3 rgbNE = tex2D(_MainTex, i.uv_MainTex + (float2(+1.0, -1.0) * u_texelDelta)).xyz;
				float3 rgbSW = tex2D(_MainTex, i.uv_MainTex + (float2(-1.0, +1.0) * u_texelDelta)).xyz;
				float3 rgbSE = tex2D(_MainTex, i.uv_MainTex + (float2(+1.0, +1.0) * u_texelDelta)).xyz;
				float3 rgbM = tex2D(_MainTex, i.uv_MainTex).xyz;

				float3 luma = float3(0.299, 0.587, 0.114);
				float lumaNW = dot(rgbNW, luma);
				float lumaNE = dot(rgbNE, luma);
				float lumaSW = dot(rgbSW, luma);
				float lumaSE = dot(rgbSE, luma);
				float lumaM = dot(rgbM, luma);

				float lumaMin = min(lumaM, min(min(lumaNW, lumaNE), min(lumaSW, lumaSE)));
				float lumaMax = max(lumaM, max(max(lumaNW, lumaNE), max(lumaSW, lumaSE)));

				float2 dir;
				dir.x = -((lumaNW + lumaNE) - (lumaSW + lumaSE));
				dir.y = ((lumaNW + lumaSW) - (lumaNE + lumaSE));

				float dirReduce = max((lumaNW + lumaNE + lumaSW + lumaSE) * (0.25 * FXAA_REDUCE_MUL), FXAA_REDUCE_MIN);

				float rcpDirMin = 1.0 / (min(abs(dir.x), abs(dir.y)) + dirReduce);

				dir = min(float2(FXAA_SPAN_MAX, FXAA_SPAN_MAX),
					max(float2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX), dir * rcpDirMin)) * u_texelDelta;

				float3 rgbA = (1.0 / 2.0) * (
					tex2D(_MainTex, i.uv_MainTex + dir * (1.0 / 3.0 - 0.5)).xyz +
					tex2D(_MainTex, i.uv_MainTex + dir * (2.0 / 3.0 - 0.5)).xyz);
				float3 rgbB = rgbA * (1.0 / 2.0) + (1.0 / 4.0) * (
					tex2D(_MainTex, i.uv_MainTex + dir * (0.0 / 3.0 - 0.5)).xyz +
					tex2D(_MainTex, i.uv_MainTex + dir * (3.0 / 3.0 - 0.5)).xyz);

				float lumaB = dot(rgbB, luma);

				if ((lumaB < lumaMin) || (lumaB > lumaMax)){
					return float4( rgbA,1);
				}
				else {
					return float4(rgbB, 1);
				}
				//整体上是一个边缘检测,在边缘处进行采样模糊

			}

ppsspp中实测

unity中实测

grayscale

灰度
白光的亮度用Y表示,它和红绿蓝三色光的关系:
Y = 0.299R+0.587G+0.114B    NTSC美制电视制式亮度公式
Y = 0.222R+0.707G+0.071B    PAL(相位逐行交变)电视制式
ppsspp使用的是NTSC美制,Unity中的Luminance函数使用的是PAL制式

关键代码:

float4 frag(v2f i) :COLOR
			{

				float3 rgb = tex2D(_MainTex, i.uv_MainTex).rgb;
				float luma = dot(rgb, float3(0.299, 0.587, 0.114));

				return luma;

			}

ppsspp中实测

unity中实测

inversecolors

反色

关键代码:

		float4 frag(v2f i) :COLOR
			{

				float3 rgb = tex2D(_MainTex, i.uv_MainTex).rgb;
				float luma = dot(rgb, float3(0.299, 0.587, 0.114));
			//	luma = Luminance(rgb);
				float3 gray = float3(luma, luma, luma) - 0.5;
				rgb -= float3(0.5, 0.5, 0.5);

				return float4(mix(rgb, gray, 2.0) + 0.5, 1);

			}

ppsspp中实测

unity中实测

natural

使颜色变得自然
把颜色从RGB转到YIQ色彩空间在进行变换

关键代码:

	float4 frag(v2f i) :COLOR
			{
				float3 val00 = float3(1.2, 1.2, 1.2);
				float3x3 RGBtoYIQ = float3x3(0.299, 0.596, 0.212,
				0.587, -0.275, -0.523,
				0.114, -0.321, 0.311);

				float3x3 YIQtoRGB = float3x3(1.0, 1.0, 1.0,
					0.95568806036115671171, -0.27158179694405859326, -1.1081773266826619523,
					0.61985809445637075388, -0.64687381613840131330, 1.7050645599191817149);

				float4 c = tex2D(_MainTex, i.uv_MainTex);
				float3 c1 =mul( RGBtoYIQ,c.rgb);

				c1 = float3(pow(c1.x, val00.x), c1.yz*val00.yz);
				//转换到YIQ色彩空间再加强GB颜色1.2倍
				return float4(mul(YIQtoRGB,c1), 1);
			}

ppsspp中实测

unity中实测

scanlines

屏幕上的线的效果

关键代码:

	float4 frag(v2f i) :COLOR
			{

				float pos0 = ((i.uv_MainTex.y + 1.0) * 170.0*_Amount);
				float pos1 = cos((frac(pos0) - 0.5)*3.1415926*_Inten)*1.5;
				float4 rgb = tex2D(_MainTex, i.uv_MainTex);

				// slight contrast curve
				float4 color = rgb*0.5 + 0.5*rgb*rgb*1.2;

				// color tint
				color *= float4(0.9, 1.0, 0.7, 0.0);

				// vignette
				color *= 1.1 - 0.6 * (dot(i.uv_MainTex - 0.5, i.uv_MainTex - 0.5) * 2.0);

				return mix(float4(0, 0, 0, 0), color, pos1);
			}

ppsspp中实测

unity中实测

sharpen

锐化
取上下两个采样点,采样点之间的颜色差越大(边缘,色差大等处),sharp越明显

关键代码:

		float4 frag(v2f i) :COLOR
			{
				float4 c = tex2D(_MainTex, i.uv_MainTex);
				c -= tex2D(_MainTex, i.uv_MainTex + _Size)*7.0*_Inten;
				c += tex2D(_MainTex, i.uv_MainTex - _Size)*7.0*_Inten;
				//采样点之间的颜色差越大(边缘,色差大等处),sharp越明显
				return c;
			}

ppsspp中实测

unity中实测

vignette

晕影效果

关键代码:

			float4 frag(v2f i) :COLOR
			{

				float vignette = 1.1 - 0.6 * (dot(i.uv_MainTex - 0.5, i.uv_MainTex - 0.5) * 2.0);
				float3 rgb = tex2D(_MainTex, i.uv_MainTex).rgb;
				return float4(vignette * rgb, 1);

			}

ppsspp中实测

unity中实测

4xhqglsl

平滑效果

ppsspp中实测

upscale_spline36

缩放滤镜
基于样条线的缩放(Spline based resizers)分别有spline16 spline36 spline64这三个缩放滤镜基于样条插值算法。样条差值算法在放大时尽可能的锐化图像,减少失真
该算法原作者为Panorama tools的开发者
详细算法的介绍请看forum.doom9.org/showthread.php?t=147117

ppsspp中实测

用一张不同的图做测试,在比例2X的情况下全屏拉伸,图像会变模糊,使用缩放滤镜进行放大,效果就像4X一样清楚

未开启

开启

全部代码已上传至GitHub

                                    --------by wolf96

时间: 2024-10-04 04:13:40

unity3d ppsspp模拟器中的post processing shader在unity中使用的相关文章

Shader之Unity中如果使模型有弯曲效果

代码如下 Shader "Custom/Curved" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {} _QOffset ("Offset", Vector) = (0,0,0,0) _Brightness ("Brightness", Float) = 0.0 _Dist ("Distance", Float) = 100

3D语音天气球——在Unity中使用Android语音服务

转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 开篇废话: 这个项目准备分四部分介绍: 一:创建可旋转的"3D球":3D语音天气球(源码分享)--创建可旋转的3D球 二:通过天气服务,从网络获取时实天气信息并动态生成"3D球":3D语音天气球(源码分享)--通过天气服务动态创建3D球 三:Android语音服务和Unity的消息传递 四:Unity3D端和Android端的结合 前两篇文章已经介绍了如何创

Unity中加入Android项目的Build步骤

简介: 有的项目需要在Android中加入Unity功能,例如ANDROID应用中嵌入Unity3D视图(展示3D模型) 有的项目需要在Unity中加入Android功能,例如3D语音天气球(源码分享)——创建可旋转的3D球 由于Android中的功能和代码只能当作一个Unity插件,需要在Unity进行最终的Build后生成apk文件运行. 所以无论上面两种情况都涉及了在Unity中加入Android项目的Build步骤: 步骤: 1.确保Android工程代码正确,然后在Eclipse中bu

2019.9.27 Unity中Sprite和UI Image的区别

来源:https://blog.csdn.net/coffeecato/article/details/78536488 coffeecato写在前面:本文确实不错,作者用以说明自动生成网格的示图非常具有代表性,从drawcall的生成过程分析性能开销的重点,引出了overdraw和达到GPU像素填充率限制的原因,从中也可以看出作者对这个主题的理解颇有深度.查看作者的个人自述,居然是个2012年毕业的小伙子,后生可畏啊!翻译本文对自己也是个考验.英文水平捉急,如果错误请多多指正. 原文:UNIT

Protobuf-net在Unity中的序列化与反序列化

本篇中我们只讲解如何在Unity中对Protobuf-net进行序列化(Serialize)与反序列化(Deserialize),关于Unity的socket(插座)网络通信部分我们后续开篇. 首先去Protobuf-net的Google下载点下载protobuf-net类库:https://code.google.com/p/protobuf-net/downloads/list这里用的是目前最新的protobuf-net r668下载完毕后打开压缩包,在Full\unity中找到protob

【浅墨Unity3D Shader编程】之五 圣诞夜篇: Unity中Shader的三种形态对比&amp;混合操作合辑

本系列文章由@浅墨_毛星云 出品,转载请注明出处.  文章链接:http://hpw123.net/a/C__/kongzhitaichengxu/2014/1222/164.html 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 邮箱: [email protected] QQ交流群:330595914 更多文章尽在:http://www.hpw123.net 本文算是固定功能Shader的最后一篇,下一次更新应该就会开始讲解表面Shader,而

25.Unity3D手机中Input类touch详解-Unity触屏事件解析到底(Twisted Fate)

首先贴一下Unity支持的模型文件类型,以前没有收集过. Unity支持两种类型的3D文件格式: 1.  通用的"出口型"3D文件 如.fbx..dae..3ds..dxf..obj等文件格式. 2.  3D软件专用的3D文件格式 如Max, Maya, Blender,Cinema4D, Modo, Lightwave & Cheetah3D 等软件所支持的格式,如.MAX, .MB, .MA等等. Unity3D手机中Input类touch详解: 1.Input.touch

一、Unity中Shader的三种基本类型

一.固定功能着色器(Fixed Function Shader) 固定功能着色器为固定功能渲染管线的具体表现.功能较简单兼容比较老的机器 二.表面着色器 存在于Unity3D中由U3D发扬光大的一门技术.Untiy3D为我们把Shader的复杂性包装起来,降低shader的书写门槛,创建了表面着色器 三.顶点着色器和片段着色器 GPU上含有两个组件:可编程顶点处理器和可编程片段处理器,顶点和片段处理器被分离成可编程单元,可编程顶点处理器是一个硬件单元,可以运行顶点程序,而可编程片段处理器则是一个

unity3d中的物体,在Scene窗口中可以看到,而在Game窗口中看不到的原因

unity3d中的物体,在Scene窗口中可以看到,而在Game窗口中看不到的原因: 多半是因为物体所属Layer与照相机的culling mask不一致导致的,或者超出照相机的可视范围. 如果游戏中有多个相机,每个相机都有自己的可视范围和culling mask,物体在移动的过程中,进入不同的相机,其可见性可能是变化的,取决与物体所属Layer与当前相机是否一致