質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

574閲覧

UnityのParticleSystemで使用するShaderを作成したい

nakamun

総合スコア2

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

2グッド

0クリップ

投稿2022/10/09 15:09

前提

Unity、Shader初心者です・・・。
UnityのParticleSystemでエフェクトを作成しております。

実現したいこと

ParticleSystemで使用するShaderを作成したいです。

発生している問題・エラーメッセージ

現在、リムライトの要素を含んだShaderになっております。
ただ、現在のShaderの情報ですと、
ParticleSystemで入力したStartColorやColor Over Lifetimeでの
不透明度の情報がマテリアルに反映されず、困っております。。
普段デザイナー業務がメインのため、
コードの知識が大変浅く、サイトで集めたコードの情報を切り貼りして
シェーダー作成したため、だいぶ読みづらい状態かもしれません・・。
大変お恥ずかしいですが、ご教授してくださると幸いです。。。

参考にしたリムライトのシェーダーサイト様

https://www.wwwmaplesyrup-cs6.work/entry/2020/08/07/001046

該当のソースコード

Shader "Custom/RimLight" { Properties { _MainTex ("Texture", 2D) = "white" {} _Color ("Color", Color) = (1,1,1,1) _RimColor ("RimColor", Color) = (1,1,1,1) _RimPower("RimPower", float) = 0.0 } SubShader { Tags {"Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" } Blend SrcAlpha One Cull Off Lighting Off ZWrite Off Fog { Mode Off } Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma multi_compile_particles #pragma multi_compile_fog #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float3 normal : NORMAL; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; float3 viewDir : TEXCOORD1; float3 normalDir : TEXCOORD2; fixed4 color: COLOR; UNITY_FOG_COORDS(1) }; sampler2D _MainTex; fixed4 _MainTex_ST; fixed4 _Color; fixed4 _RimColor; half _RimPower; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); float4x4 modelMatrix = unity_ObjectToWorld; o.normalDir = normalize(UnityObjectToWorldNormal(v.normal)); o.viewDir = normalize(_WorldSpaceCameraPos - mul(modelMatrix, v.vertex).xyz); return o; } fixed4 frag (v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.uv) * _Color; UNITY_APPLY_FOG_COLOR(i.fogCoord, col, (fixed4)0); half rim = 1.0 - abs(dot(i.viewDir, i.normalDir)); fixed3 emission = _RimColor.rgb * pow(rim, _RimPower) * _RimPower; col.rgb += emission; col = fixed4(col.rgb, 1.0); return col; } ENDCG } } Fallback off }

補足情報(FW/ツールのバージョンなど)

Unity2019.4.28f1
Unlit Shader

nakamun👍を押しています
takezoux2👏を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

パーティクルの色は頂点カラーとして取得できるかと思います。そこでご提示のコードを下記のように改変してみましたが、いかがでしょうか?

ShaderLab

1Shader "Custom/RimLight" 2{ 3 Properties 4 { 5 _MainTex ("Texture", 2D) = "white" {} 6 _Color ("Color", Color) = (1,1,1,1) 7 _RimColor ("RimColor", Color) = (1,1,1,1) 8 _RimPower("RimPower", float) = 0.0 9 } 10 SubShader 11 { 12 Tags {"Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" } 13 Blend SrcAlpha One 14 Cull Off Lighting Off ZWrite Off Fog 15 { 16 Mode Off 17 } 18 19 Pass 20 { 21 CGPROGRAM 22 #pragma vertex vert 23 #pragma fragment frag 24 #pragma multi_compile_particles 25 #pragma multi_compile_fog 26 27 #include "UnityCG.cginc" 28 29 struct appdata 30 { 31 float4 vertex : POSITION; 32 float3 normal : NORMAL; 33 float2 uv : TEXCOORD0; 34 fixed4 color : COLOR; // 個々のパーティクルの色は頂点カラーとして入力されるので、appdataにCOLOR属性を追加しておきます 35 }; 36 37 struct v2f 38 { 39 float2 uv : TEXCOORD0; 40 float4 vertex : SV_POSITION; 41 float3 viewDir : TEXCOORD1; 42 float3 normalDir : TEXCOORD2; 43 fixed4 color : COLOR; // v2fに未使用のcolorがあったので、これを頂点カラー伝達に使うことにしました 44 UNITY_FOG_COORDS(1) 45 }; 46 47 sampler2D _MainTex; 48 fixed4 _MainTex_ST; 49 fixed4 _Color; 50 fixed4 _RimColor; 51 half _RimPower; 52 53 v2f vert (appdata v) 54 { 55 v2f o; 56 o.vertex = UnityObjectToClipPos(v.vertex); 57 o.uv = TRANSFORM_TEX(v.uv, _MainTex); 58 float4x4 modelMatrix = unity_ObjectToWorld; 59 o.normalDir = normalize(UnityObjectToWorldNormal(v.normal)); 60 o.viewDir = normalize(_WorldSpaceCameraPos - mul(modelMatrix, v.vertex).xyz); 61 o.color = v.color; // 頂点カラーをfragへ送り... 62 return o; 63 } 64 65 fixed4 frag (v2f i) : SV_Target 66 { 67 fixed4 col = tex2D(_MainTex, i.uv) * _Color; 68 UNITY_APPLY_FOG_COLOR(i.fogCoord, col, (fixed4)0); 69 70 half rim = 1.0 - abs(dot(i.viewDir, i.normalDir)); 71 fixed3 emission = _RimColor.rgb * pow(rim, _RimPower) * _RimPower; 72 col.rgb += emission; 73 col = fixed4(col.rgb, 1.0); 74 75 // あとはfrag内でi.colorを出力色に組み合わせてやればいいはずです 76 // どう組み合わせるかはご自由に決めていいかと思いますが、さしあたりの例として 77 // リムライト効果適用後の最終色にさらにi.colorを乗算してみました 78 col *= i.color; 79 80 return col; 81 } 82 ENDCG 83 } 84 } 85 Fallback off 86}

投稿2022/10/09 23:39

Bongo

総合スコア10807

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nakamun

2022/10/10 02:46

早朝からご対応ありがとうございます・・! Unityシーン上で無事、教えていただいたコードで動作確認できました・・! 理想のシェーダーに修正していただき、大変助かりました。 また親切にコードのコメントも残して下さり、大変勉強になります。 この度はご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問