鉛筆画風のImageEffectシェーダコード
9350 ワード
Twitterにアップした鉛筆画風のImageEffectシェーダコードを貼っておきます
エッジ抽出周りを触っていたら、鉛筆画っぽくなるImageEffect出来た。 pic.twitter.com/EySZAODW73
— MIYAKE (@ScreenPocket) May 12, 2020
エッジ抽出で全然別のシェーダを触っていたのですが、
ふと「パラメータ調整したら鉛筆画っぽく出来るかも?」と思い色々触ったところ、
中々気に入った見た目が出来たので貼っておきます。
Pencil.shader
Shader "ScreenPocket/ImageEffect/Pencil"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
// No culling or depth
Cull Off ZWrite Off ZTest Always
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
return o;
}
sampler2D _MainTex;
//隣接ピクセルの平均色を取得する
fixed4 Gather(sampler2D tex, float2 coord, float2 offset)
{
return (tex2D( tex, coord + offset)
+ tex2D( tex, coord + float2(offset.x, -offset.y))
+ tex2D( tex, coord + float2(-offset.x, offset.y))
+ tex2D( tex, coord - offset)) / 4.0;
}
fixed4 frag (v2f i) : SV_Target
{
fixed4 color = tex2D( _MainTex, i.uv );
//隣接ピクセルの平均色を取得
fixed4 neighbor = Gather(_MainTex, i.uv, _ScreenParams.zw - 1.0);
//隣接色との差を絶対値で取る
fixed4 neighborDistance = abs(color - neighbor);
//RGBの中で一番大きい差を求める
fixed maxValue = max(neighborDistance.r, neighborDistance.g);
maxValue = max(maxValue, neighborDistance.b);
//平滑化させつつ値調整
return (1.0 - (saturate( maxValue + 0.9 ) - 0.9) * 6);
}
ENDCG
}
}
}
マジックナンバーが多くて申し訳ないけど、とりあえず版ということで。
Author And Source
この問題について(鉛筆画風のImageEffectシェーダコード), 我々は、より多くの情報をここで見つけました https://qiita.com/ScreenPocket/items/b14b429e1226a32078e5著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .