unity3d shader之浮雕效果

来源:互联网 发布:python 图像识别损坏 编辑:程序博客网 时间:2024/04/27 16:06

浮雕就是对图像上的一个像素和它右下的那个像素的色差的一种处理

非常容易,只需要一个简单的算法

用fragment shader来实现


我们只看实现部分就好

在frag函数中

mc00mc = tex2D (_MainTex, i.uv_MainTex).rgb;

获取当前点的颜色


mc11 = tex2D (_MainTex, i.uv_MainTex+fixed2(1,1)/_Size).rgb;

获取当前点右下角(偏移了(1,1)个单位)的点的颜色,


由于CG函数tex2DSize函数(获取图片长宽的像素数)在unity中不能用,我也不知道用什么函数来替代它,就弄了个外部变量_Size方便调节

如果有什么函数能代替tex2DSize函数各位看官一定要告诉我


diffs = abs( mc00mc - mc11);
diffs为亮点颜色差

max0 = diffs.r>diffs.g?diffs.r:diffs.g;
max0 = max0>diffs.b?max0:diffs.b;
求出色差中rgb的最大值设为色差数

gray = clamp(max0+0.4 , 0, 1);
灰度值其实就是这个色差数

c = float4(gray.xxx,1)*_Color;

最终颜色


效果如下:



全部代码如下:

Shader "Custom/test" {Properties {_MainTex ("MainTex", 2D) = "white" {}_Size("Size", range(1,2048)) = 256//size_Color("Main Color",color)=(1,1,1,1)}SubShader {pass{Tags{"LightMode"="ForwardBase" }Cull offCGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"float4 _Color;float _Size;sampler2D _MainTex;float4 _MainTex_ST;struct v2f {float4 pos:SV_POSITION;float2 uv_MainTex:TEXCOORD0;};v2f vert (appdata_full v) {v2f o;o.pos=mul(UNITY_MATRIX_MVP,v.vertex);o.uv_MainTex = TRANSFORM_TEX(v.texcoord,_MainTex);return o;}float4 frag(v2f i):COLOR{//浮雕就是对图像上的一个像素和它右下的那个像素的色差的一种处理float3 mc00mc = tex2D (_MainTex, i.uv_MainTex).rgb;//当前点的颜色float3 mc11 = tex2D (_MainTex, i.uv_MainTex+fixed2(1,1)/_Size).rgb;//当前点右下角(偏移了(1,1)个单位)的点的颜色,//由于CG函数tex2DSize函数(获取图片长宽的像素数)在unity中不能用,我也不知道用什么函数来替代它,就弄了个外部变量_Size方便调节float3 diffs = abs( mc00mc - mc11);//diffs为亮点颜色差float max0 = diffs.r>diffs.g?diffs.r:diffs.g; max0 = max0>diffs.b?max0:diffs.b;//求出色差中rgb的最大值设为色差数 float gray = clamp(max0+0.4 , 0, 1);//灰度值其实就是这个色差数float4 c = 0;c = float4(gray.xxx,1)*_Color;//最终颜色return c;}ENDCG}//} }


                                 -----------------by wolf96    http://blog.csdn.net/wolf96


1 0
原创粉丝点击