ディゾルブシェーダーの記述

はじめに



新しい年の前に、シェーダーを書くことにしました。 目標として、私は自分でディゾルブオブジェクトのシェーダーを選択しました。12月31日に正常に完了し、今度はそれを使って何かをする時が来ました。 資産については、彼らはすべてがうまくいっていると言いましたが、すでにいくつかの類似したものがあるので、この記事でそれを解析しようとします。 最後に、これを取得する必要があります。







実装するにはいくつかの方法があります。



その結果、3つのシェーダーを取得し、2つはアルファのみを使用し、Mobに飛ぶことができます。 デバイスとAlphaTestを搭載したデバイスは、見栄えは良くても食いしん坊です。 AlphaTestのおかげで、目に見えないポリゴンのクリッピングをオフにし、レイヤー化を取得できません。 ただし、シェーダーモデル2.0で支払う必要があり、3.0を使用する必要があります。そのため、Mobでは使用できません。 デバイス。



フレーム



一般的なアルゴリズムは次のようなものです。





結果は最初のビデオほど美しくありません。







十分な法線マップがなく、最もクールです。 行!

私のインラインアルゴリズムはこれです:





上記を要約すると、マスクによってクリッピングされ、ピクセルがクリップされている場合、クリップされていないかどうかを確認し、クリップされている場合はエッジになり、特定の色を設定します。



ボディコードにより近い



上記のすべて、法線の重ね合わせ、正弦波の時間でさえラインテクスチャのシフトを追加すると、このようなキャンバスが得られます。



メインシェーダー
Shader "HolyMonkey/Dissolve/Bumped" { Properties { _MainColor ("Main Color", Color) = (1,1,1,1) _MainTex ("Base (RGB)", 2D) = "white" {} _Mask("Mask To Dissolve", 2D) = "white" {} _LineTexture("Line Texture", 2D) = "white" {} _Range ("Range", Range(0,3)) = 0 _LineSize ("LineSize", Float) = 0.001 _Color ("Line Color", Color) = (1,1,1,1) _BumpMap ("Normalmap", 2D) = "bump" {} _Cutoff ("Alpha cutoff", Range(0,1)) = 0.5 } SubShader { Tags {"Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout"} LOD 300 ZWrite On Cull Off CGPROGRAM #pragma target 3.0 #include "UnityCG.cginc" #pragma surface surf Lambert alphatest:_Cutoff sampler2D _MainTex; sampler2D _LineTexture; sampler2D _BumpMap; sampler2D _Mask; half4 _Color; half4 _MainColor; float _Range; float _LineSize; struct Input { float2 uv_MainTex; float2 uv_BumpMap; float2 uv_Detail; }; void surf (Input IN, inout SurfaceOutput o) { half4 c = tex2D (_MainTex, IN.uv_MainTex); half4 m = tex2D (_Mask, IN.uv_MainTex); half4 lc = tex2D (_Mask, IN.uv_MainTex - _LineSize); half4 lc2 = tex2D (_Mask, IN.uv_MainTex + _LineSize); half4 lc3 = tex2D(_LineTexture, IN.uv_MainTex + _SinTime) * _Color; o.Albedo = c * _MainColor; o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap)); o.Alpha = 1; float factor = m.rgb.x + m.rgb.y + m.rgb.z; if(factor >= _Range) { float factor2 = lc.rgb.x + lc.rgb.y + lc.rgb.z; float factor3 = lc2.rgb.x + lc2.rgb.y + lc2.rgb.z; if(factor2 < _Range || factor3 < _Range) { o.Albedo = lc3; } else { o.Alpha = 0.0; } } } ENDCG } Fallback "Diffuse" }
      
      









あなたはまだいくつかの側面で遊んで、次のものを得ることができます



冷やした
 Shader "HolyMonkey/Dissolve/Culling-Mobile" { Properties { _MainColor ("Main Color", Color) = (1,1,1,1) _MainTex ("Base (RGB)", 2D) = "white" {} _Mask("Mask To Dissolve", 2D) = "white" {} _LineTexture("Line Texture", 2D) = "white" {} _Range ("Range", Range(0,3)) = 0 _LineSize ("LineSize", Float) = 0.001 _Color ("Line Color", Color) = (1,1,1,1) _BumpMap ("Normalmap", 2D) = "bump" {} } SubShader { Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"} LOD 300 CGPROGRAM #pragma target 2.0 #include "UnityCG.cginc" #pragma surface surf Lambert alpha sampler2D _MainTex; sampler2D _LineTexture; sampler2D _BumpMap; sampler2D _Mask; half4 _Color; half4 _MainColor; float _Range; float _LineSize; struct Input { float2 uv_MainTex; float2 uv_BumpMap; float2 uv_Detail; }; void surf (Input IN, inout SurfaceOutput o) { half4 c = tex2D (_MainTex, IN.uv_MainTex); half4 m = tex2D (_Mask, IN.uv_MainTex); half4 lc = tex2D (_Mask, IN.uv_MainTex - _LineSize); half4 lc2 = tex2D (_Mask, IN.uv_MainTex + _LineSize); half4 lc3 = tex2D(_LineTexture, IN.uv_MainTex + _SinTime) * _Color; o.Albedo = c * _MainColor; o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap)); o.Alpha = 1; float factor = m.rgb.x + m.rgb.y + m.rgb.z; if(factor >= _Range) { float factor2 = lc.rgb.x + lc.rgb.y + lc.rgb.z; float factor3 = lc2.rgb.x + lc2.rgb.y + lc2.rgb.z; if(factor2 < _Range || factor3 < _Range) { o.Albedo = lc3; } else { o.Alpha = 0.0; } } } ENDCG } Fallback "Diffuse" }
      
      









透明の代わりに別のテクスチャを使用
 Shader "HolyMonkey/Dissolve/NotTransparent" { Properties { _MainColor ("Main Color", Color) = (1,1,1,1) _MainTex ("Base (RGB)", 2D) = "white" {} _BackTexture ("Back Texture", 2D) = "white" {} _Mask("Mask To Dissolve", 2D) = "white" {} _LineTexture("Line Texture", 2D) = "white" {} _Range ("Range", Range(0,3)) = 0 _LineSize ("LineSize", Float) = 0.001 _Color ("Line Color", Color) = (1,1,1,1) _BumpMap ("Normalmap", 2D) = "bump" {} } SubShader { LOD 300 ZWrite On Cull Off CGPROGRAM #pragma target 2.0 #include "UnityCG.cginc" #pragma surface surf Lambert sampler2D _MainTex; sampler2D _LineTexture; sampler2D _BumpMap; sampler2D _Mask; sampler2D _BackTexture; half4 _Color; half4 _MainColor; float _Range; float _LineSize; struct Input { float2 uv_MainTex; float2 uv_BumpMap; float2 uv_Detail; }; void surf (Input IN, inout SurfaceOutput o) { half4 c = tex2D (_MainTex, IN.uv_MainTex); half4 m = tex2D (_Mask, IN.uv_MainTex); half4 lc = tex2D (_Mask, IN.uv_MainTex - _LineSize); half4 lc2 = tex2D (_Mask, IN.uv_MainTex + _LineSize); half4 lc3 = tex2D(_LineTexture, IN.uv_MainTex + _SinTime) * _Color; half4 bc = tex2D(_BackTexture, IN.uv_MainTex); o.Albedo = c * _MainColor; o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap)); float factor = m.rgb.x + m.rgb.y + m.rgb.z; if(factor >= _Range) { float factor2 = lc.rgb.x + lc.rgb.y + lc.rgb.z; float factor3 = lc2.rgb.x + lc2.rgb.y + lc2.rgb.z; if(factor2 < _Range || factor3 < _Range) { o.Albedo = lc3; } else { o.Albedo = bc; o.Normal = float3(1,1,1); } } } ENDCG } Fallback "Diffuse" }
      
      









おわりに



書くことは少し判明しましたが、演ductive法がそれを引き換えると思います。 そこにはシンプルなものが使用されており、ハブにはその分析に関する記事があります。 GitHubのリポジトリからダウンロードできるすべての必要なリソースを備えたソース



All Articles