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

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中实测

CRTCRT是模拟以前大脑袋电脑的阴极射线管(Cathode Ray Tube)的显示器的特殊效果,频闪之类的特效,用过大脑袋的都懂。关键代码:float4 frag(v2f i) :COLOR{// scanlinesfloat vPos = float((i.uv_MainTex.y + _Time.z * 0.5) * 272.0);float j = 2;float line_intensity = modf(float(vPos), j);// color shiftfloat off = line_intensity *0.00001;float2 shift = float2(off, 0);// shift R and G channels to simulate NTSC color bleedfloat2 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中实测

而是他们在同伴们都睡着的时候,一步步艰辛地

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

相关文章:

你感兴趣的文章:

标签云: