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

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

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

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

解決済

1回答

1280閲覧

透過シェーダーに画像の回転機能を追加したい

kaishinn

総合スコア2

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

0グッド

0クリップ

投稿2022/07/14 09:52

編集2022/07/14 09:53

解決したいこと

テクスチャの回転させたいのですが、うまくできません。
Unity上ではマテリアルの表示はされますが、回転の動作だけできません。
回転のソースコードは下記のサイトを参照しております。
https://zenn.dev/kento_o/articles/64c8d585924c60633342
お手数をおかけしますが、ご教授頂けると幸いです。

実現したいこと

  • テクスチャの回転

該当のソースコード

Shader "Wit/StandardTransparent_js_Rotation" { Properties { _Color ("Color", Color) = (1, 1, 1, 1) _MainTex ("Albedo (RGB)", 2D) = "white" {} [Header(Base Spec)] _Glossiness ("Glossiness", Range(0,1)) = 0.5 _Shininess ("Shininess", Range(0,1)) = 0.0 _SpecularColor ("SpecColor", Color) = (1, 1, 1, 1) [Space][Space][Space][Space][Space] [Toggle]_Active ("Second Spec", Range(0, 1)) = 0 [Header(uv.X2)] _Glossiness2 ("Glossiness2", Range(0,1)) = 0.5 _Shininess2 ("Shininess2", Range(0,1)) = 0.0 _SpecularColor2 ("SpecColor2", Color) = (1, 1, 1, 1) [Space][Space][Space][Space][Space] [Header(uv.Y2)] [NOScaleOffset]_BumpMap ("NormalMap", 2D) = "bump"{} _NormalTiling("NormalTiling", range(1, 50)) = 1 _NormalPower("NormalPower", range(0,3)) = 1 [Space][Space][Space][Space][Space] [Header(uv.Y3)] //sparkle variables _SparkleTex("Sequin Texture", 2D) = "black" {} //the noise texture _SparkleColor("SequinColor", Color) = (1,1,1,1) //color of the sparkle effect _SparkleRange("SequinRange", range(0.1, 10)) = 0.1 //range of the sparkle effect _Intensity("Intensity", range(0.1, 30)) = 1 //intensity of the sparkle effect [Space][Space][Space][Space][Space] //rim lighting variables _RimColor("RimColor", Color) = (1,1,1,1) //color of rim lighting _RimPower("RimPower", Float) = 1 //intensity of rim lighting [HideInInspector]_LogLut ("_LogLut", 2D) = "white" {} //テクスチャー(オフセット、タイリングの設定なし) [NoScaleOffset] _MainTex ("Texture", 2D) = "white" {} //回転の速度 _RotateSpeed ("Rotate Speed", float) = 1.0 } SubShader { Tags { "RenderType"="Transparent" "Queue" = "Transparent" } zwrite off cull off CGPROGRAM #pragma surface surf StandardSpecular alpha:blend finalcolor:tonemapping #include "ToneMapping.cginc" sampler2D _MainTex; sampler2D _BumpMap; //sparkle variables sampler2D _SparkleTex; float _SparkleRange, _Intensity; half4 _SparkleColor; //rim lighting variables half4 _RimColor; float _RimPower; struct Input { float2 uv_MainTex; float2 uv_BumpMap; float2 uv_SparkleTex; float3 viewDir; float3 worldNormal; INTERNAL_DATA }; half _Glossiness, _Glossiness2, _Shininess, _Shininess2; fixed4 _Color; fixed4 _SpecularColor; fixed4 _SpecularColor2; fixed _NormalPower, _Active, _NormalTiling; void surf(Input IN, inout SurfaceOutputStandardSpecular o) { // Albedo comes from a texture tinted by color fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color; //sparkel effect fixed3 sparklemap = tex2D(_SparkleTex, IN.uv_SparkleTex); sparklemap -= half3(0.1, 0.8, 0.1); sparklemap = normalize(sparklemap); half sparkle = step(2, IN.uv_MainTex.y) * (pow(saturate((dot(IN.viewDir * float3(_SparkleRange, 0, _SparkleRange), normalize(sparklemap + IN.worldNormal)))), _Intensity)); //Metallic and smoothness come from slider variables o.Specular = (_Shininess * (1 - (step(1, IN.uv_MainTex.x) * _Active)) * _SpecularColor) + (_Shininess2 * (step(1, IN.uv_MainTex.x) * _Active) * _SpecularColor2); o.Smoothness = (_Glossiness * (1 - (step(1, IN.uv_MainTex.x) * _Active))) + (_Glossiness2 * (step(1, IN.uv_MainTex.x) * _Active)); fixed3 nm = UnpackNormal(tex2D(_BumpMap, fixed2(IN.uv_MainTex.x * _NormalTiling, IN.uv_MainTex.y * _NormalTiling))); o.Normal = ((nm * fixed3(_NormalPower, _NormalPower, 1)) * step(1, IN.uv_MainTex.y)) + ((nm * fixed3(0, 0, 1)) * (1 - step(1, IN.uv_MainTex.y))); //rim lighting float rim = dot(o.Normal, IN.viewDir); o.Albedo = c.rgb; o.Emission = (max(0, (pow(1 - rim, _RimPower) * _RimColor.rgb)) + (_SparkleColor * sparkle * smoothstep(0, 1, pow(rim, _RimPower - 0.05)))) * step(1, IN.uv_MainTex.y); o.Alpha = c.a; } void tonemapping(Input IN, SurfaceOutputStandardSpecular o, inout fixed4 color) { color = ApplyColorGrading(color); } ENDCG // 보물 for js pass { Name "ALPHA_WRITER" Blend One OneMinusSrcAlpha ColorMask A CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata_t { float4 vertex : POSITION; float4 color : COLOR; float2 texcoord : TEXCOORD0; float2 uv : TEXCOORD1; //1番目のUV座標 という意味らしい  }; struct v2f { float4 vertex : SV_POSITION; fixed4 color : COLOR; float2 texcoord : TEXCOORD0; float2 uv : TEXCOORD1; //テクスチャUV }; sampler2D _MainTex; float4 _MainTex_ST; fixed4 _Color; float _RotateSpeed; v2f vert (appdata_t v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex);//3D空間座標→スクリーン座標変換 o.uv = v.uv; //受け取ったUV座標をフラグメントシェーダーで使うので代入しとく o.color = v.color; o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex); return o; } fixed4 frag (v2f i) : SV_Target { return _Color * tex2D(_MainTex, i.texcoord); // Timeを入力として現在の回転角度を作る half timer = _Time.x; // 回転行列を作る half angleCos = cos(timer * _RotateSpeed); half angleSin = sin(timer * _RotateSpeed); /* |cosΘ -sinΘ| R(Θ) = |sinΘ cosΘ| 2次元回転行列の公式*/ half2x2 rotateMatrix = half2x2(angleCos, -angleSin, angleSin, angleCos); //中心 half2 uv = i.uv - 0.5; // 中心を起点にUVを回転させる i.uv = mul(uv, rotateMatrix) + 0.5; fixed4 col = tex2D(_MainTex, i.uv); return col; } ENDCG } } FallBack "Wit/Standard(NoColor)" }

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

バージョン
Unity 2020.3.9f1
お手数おかけしますが、「ToneMapping.cginc」はこちらからDLお願い致します。
https://studio.zepeto.me/jp/guides/creating-your-item-custom-shader

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

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

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

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

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

guest

回答1

0

ベストアンサー

回転を組み込むとしたら下記のような感じでいかがでしょうか。
ですがあいにくZEPETOについては無知でして、不具合を見逃しているかもしれません。もし変な挙動を見つけましたら、症状を詳しくご説明いただければなるべく直してみようとは思いますが、うまく直せるかどうかはちょっと自信がなくご希望に添えないかもしれません。すみません...

それともう一つ注意事項として、今回はシンプルにUVを回転させるだけの改造にとどめていますが、おそらく本当は法線テクスチャについては回転の影響を考慮して補正を加えてやるべきかと思います。
陰影の付き方が多少狂っていても見栄え上問題なさそうでしたらいいのですが、見た目への影響が大きいようでしたらコメントいただければ改修してみようと思います。

ShaderLab

1Shader "Wit/StandardTransparent_js_Rotation" 2{ 3 Properties 4 { 5 _Color ("Color", Color) = (1, 1, 1, 1) 6 _MainTex ("Albedo (RGB)", 2D) = "white" {} 7 8 [Header(Base Spec)] 9 _Glossiness ("Glossiness", Range(0,1)) = 0.5 10 _Shininess ("Shininess", Range(0,1)) = 0.0 11 _SpecularColor ("SpecColor", Color) = (1, 1, 1, 1) 12 [Space][Space][Space][Space][Space] 13 14 [Toggle]_Active ("Second Spec", Range(0, 1)) = 0 15 [Header(uv.X2)] 16 _Glossiness2 ("Glossiness2", Range(0,1)) = 0.5 17 _Shininess2 ("Shininess2", Range(0,1)) = 0.0 18 _SpecularColor2 ("SpecColor2", Color) = (1, 1, 1, 1) 19 [Space][Space][Space][Space][Space] 20 21 [Header(uv.Y2)] 22 [NOScaleOffset]_BumpMap ("NormalMap", 2D) = "bump"{} 23 _NormalTiling("NormalTiling", range(1, 50)) = 1 24 _NormalPower("NormalPower", range(0,3)) = 1 25 [Space][Space][Space][Space][Space] 26 27 [Header(uv.Y3)] 28 //sparkle variables 29 _SparkleTex("Sequin Texture", 2D) = "black" {} //the noise texture 30 _SparkleColor("SequinColor", Color) = (1,1,1,1) //color of the sparkle effect 31 _SparkleRange("SequinRange", range(0.1, 10)) = 0.1 //range of the sparkle effect 32 _Intensity("Intensity", range(0.1, 30)) = 1 //intensity of the sparkle effect 33 34 [Space][Space][Space][Space][Space] 35 //rim lighting variables 36 _RimColor("RimColor", Color) = (1,1,1,1) //color of rim lighting 37 _RimPower("RimPower", Float) = 1 //intensity of rim lighting 38 39 [HideInInspector]_LogLut ("_LogLut", 2D) = "white" {} 40 41 // _MainTexプロパティはすでに存在するので、再度追加してしまうとまずいかと思います 42 /* 43 //テクスチャー(オフセット、タイリングの設定なし) 44 [NoScaleOffset] _MainTex ("Texture", 2D) = "white" {} 45 */ 46 47 //回転の速度 48 _RotateSpeed ("Rotate Speed", float) = 1.0 49 } 50 51 SubShader 52 { 53 Tags { "RenderType"="Transparent" "Queue" = "Transparent" } 54 55 ZWrite Off 56 57 CGINCLUDE 58 59 float _RotateSpeed; 60 61 // UV回転はサーフェスシェーダーとALPHA_WRITERパスの両方で行う必要があるだろうと思い、 62 // 関数化して使い回せるようにしてみました 63 float2 rotateUV(float2 uv, float angle) 64 { 65 float2 angleSinCos; 66 sincos(angle, angleSinCos.x, angleSinCos.y); 67 float2x2 rotation = float2x2(angleSinCos.y, -angleSinCos.x, angleSinCos); 68 float2 offset = floor(uv) + 0.5; 69 return mul(uv - offset, rotation) + offset; 70 } 71 72 ENDCG 73 74 CGPROGRAM 75 76 #pragma surface surf StandardSpecular alpha:blend finalcolor:tonemapping 77 #include "ToneMapping.cginc" 78 79 sampler2D _MainTex; 80 sampler2D _BumpMap; 81 82 //sparkle variables 83 sampler2D _SparkleTex; 84 float _SparkleRange, _Intensity; 85 half4 _SparkleColor; 86 87 //rim lighting variables 88 half4 _RimColor; 89 float _RimPower; 90 91 struct Input 92 { 93 float2 uv_MainTex; 94 float2 uv_BumpMap; 95 float2 uv_SparkleTex; 96 97 float3 viewDir; 98 float3 worldNormal; INTERNAL_DATA 99 }; 100 101 half _Glossiness, _Glossiness2, _Shininess, _Shininess2; 102 fixed4 _Color; 103 fixed4 _SpecularColor; 104 fixed4 _SpecularColor2; 105 fixed _NormalPower, _Active, _NormalTiling; 106 107 void surf(Input IN, inout SurfaceOutputStandardSpecular o) 108 { 109 // surfの冒頭でIN.uv_MainTexを回転しておくことで、以降IN.uv_MainTexを 110 // 使っている部分では回転済みのUVが使われるかと思います 111 IN.uv_MainTex = rotateUV(IN.uv_MainTex, radians(_RotateSpeed * _Time.y)); 112 113 // Albedo comes from a texture tinted by color 114 fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color; 115 116 //sparkel effect 117 fixed3 sparklemap = tex2D(_SparkleTex, IN.uv_SparkleTex); 118 sparklemap -= half3(0.1, 0.8, 0.1); 119 sparklemap = normalize(sparklemap); 120 half sparkle = step(2, IN.uv_MainTex.y) * (pow(saturate((dot(IN.viewDir * float3(_SparkleRange, 0, _SparkleRange), normalize(sparklemap + IN.worldNormal)))), _Intensity)); 121 122 //Metallic and smoothness come from slider variables 123 o.Specular = (_Shininess * (1 - (step(1, IN.uv_MainTex.x) * _Active)) * _SpecularColor) + (_Shininess2 * (step(1, IN.uv_MainTex.x) * _Active) * _SpecularColor2); 124 o.Smoothness = (_Glossiness * (1 - (step(1, IN.uv_MainTex.x) * _Active))) + (_Glossiness2 * (step(1, IN.uv_MainTex.x) * _Active)); 125 fixed3 nm = UnpackNormal(tex2D(_BumpMap, fixed2(IN.uv_MainTex.x * _NormalTiling, IN.uv_MainTex.y * _NormalTiling))); 126 o.Normal = ((nm * fixed3(_NormalPower, _NormalPower, 1)) * step(1, IN.uv_MainTex.y)) + ((nm * fixed3(0, 0, 1)) * (1 - step(1, IN.uv_MainTex.y))); 127 128 //rim lighting 129 float rim = dot(o.Normal, IN.viewDir); 130 131 o.Albedo = c.rgb; 132 o.Emission = (max(0, (pow(1 - rim, _RimPower) * _RimColor.rgb)) + (_SparkleColor * sparkle * smoothstep(0, 1, pow(rim, _RimPower - 0.05)))) * step(1, IN.uv_MainTex.y); 133 o.Alpha = c.a; 134 } 135 136 void tonemapping(Input IN, SurfaceOutputStandardSpecular o, inout fixed4 color) 137 { 138 color = ApplyColorGrading(color); 139 } 140 141 ENDCG 142 143 // 보물 for js 144 pass 145 { 146 Name "ALPHA_WRITER" 147 148 Blend One OneMinusSrcAlpha 149 ColorMask A 150 151 CGPROGRAM 152 153 #pragma vertex vert 154 #pragma fragment frag 155 #include "UnityCG.cginc" 156 157 struct appdata_t 158 { 159 float4 vertex : POSITION; 160 float4 color : COLOR; 161 float2 texcoord : TEXCOORD0; 162 }; 163 164 struct v2f 165 { 166 float4 vertex : SV_POSITION; 167 fixed4 color : COLOR; 168 float2 texcoord : TEXCOORD0; 169 }; 170 171 sampler2D _MainTex; 172 float4 _MainTex_ST; 173 fixed4 _Color; 174 175 v2f vert(appdata_t v) 176 { 177 v2f o; 178 o.vertex = UnityObjectToClipPos(v.vertex); 179 o.color = v.color; 180 o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex); 181 return o; 182 } 183 184 fixed4 frag(v2f i) : SV_Target 185 { 186 // surfと同様に、こちらではi.texcoordを回転させます 187 i.texcoord = rotateUV(i.texcoord, radians(_RotateSpeed * _Time.y)); 188 189 return _Color * tex2D(_MainTex, i.texcoord); 190 } 191 192 ENDCG 193 } 194 } 195 196 FallBack "Wit/Standard(NoColor)" 197}

投稿2022/07/15 22:46

Bongo

総合スコア10807

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

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

kaishinn

2022/07/17 01:52

この度はご回答いただき誠にありがとうございます。 私の環境で試したところエラーもなく描画されました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問