回答編集履歴

1

陰影付きのひびについて追記

2018/09/16 19:53

投稿

Bongo
Bongo

スコア10807

test CHANGED
@@ -9,3 +9,177 @@
9
9
 
10
10
 
11
11
  ![スプライトマスク](1daa2bb753618d473b6675bba8b4c998.gif)
12
+
13
+
14
+
15
+ ### 追記
16
+
17
+
18
+
19
+ 上記のやり方ですと、ひびが平坦で、キューブの上にひびの絵が描かれただけのように見えてしまってご不満かもしれません。
20
+
21
+ 下図のような濃淡のあるひび画像を作っておいて...
22
+
23
+ ![ひび](98c5199d3aa573a71ebcdbe3e1530b5c.png)
24
+
25
+ キューブの前面にQuadを配置し、そのマテリアルを下記のような濃淡をもとに面の向きを決定するような形にすると...
26
+
27
+ ```ShaderLab
28
+
29
+ Shader "Custom/Crack"
30
+
31
+ {
32
+
33
+ Properties
34
+
35
+ {
36
+
37
+ _Color ("Color", Color) = (1, 1, 1, 1)
38
+
39
+ _MainTex ("Albedo (RGB)", 2D) = "white" {}
40
+
41
+ _BumpMap ("Normal", 2D) = "bump" {}
42
+
43
+ _Glossiness ("Smoothness", Range(0, 1)) = 0.5
44
+
45
+ _Metallic ("Metallic", Range(0, 1)) = 0.0
46
+
47
+ _CrackTex ("Crack (Grayscale)", 2D) = "white" { }
48
+
49
+ _Progress ("Crack Progress", Range(0, 1)) = 1.0
50
+
51
+ _CrackHeight ("Crack Height", Range(0, 0.1)) = 0.05
52
+
53
+ }
54
+
55
+
56
+
57
+ SubShader
58
+
59
+ {
60
+
61
+ Tags { "Queue" = "AlphaTest" "RenderType" = "Opaque" }
62
+
63
+ LOD 200
64
+
65
+
66
+
67
+ CGPROGRAM
68
+
69
+
70
+
71
+ #pragma surface surf Standard fullforwardshadows
72
+
73
+ #pragma target 3.0
74
+
75
+
76
+
77
+ sampler2D _MainTex;
78
+
79
+ sampler2D _BumpMap;
80
+
81
+ sampler2D _CrackTex;
82
+
83
+ float4 _CrackTex_TexelSize;
84
+
85
+
86
+
87
+ struct Input
88
+
89
+ {
90
+
91
+ float2 uv_MainTex;
92
+
93
+ float2 uv_BumpMap;
94
+
95
+ float2 uv_CrackTex;
96
+
97
+ };
98
+
99
+
100
+
101
+ half _Glossiness;
102
+
103
+ half _Metallic;
104
+
105
+ fixed4 _Color;
106
+
107
+ float _Progress;
108
+
109
+ float _CrackHeight;
110
+
111
+
112
+
113
+ #define PROGRESS_EXPONENT 2.0
114
+
115
+ #define CAVITY_EXPONENT 2.0
116
+
117
+
118
+
119
+ inline float getAlpha(float2 uv, float2 edge)
120
+
121
+ {
122
+
123
+ return 1.0 - saturate(tex2D(_CrackTex, uv).r + smoothstep(edge.x, edge.y, uv.x));
124
+
125
+ }
126
+
127
+
128
+
129
+ void surf(Input IN, inout SurfaceOutputStandard o)
130
+
131
+ {
132
+
133
+ float2 edge = pow(_Progress, float2(PROGRESS_EXPONENT, 1.0 / PROGRESS_EXPONENT));
134
+
135
+ float alpha = getAlpha(IN.uv_CrackTex, edge);
136
+
137
+ clip(alpha - 0.00001);
138
+
139
+ float cavity = 1.0 - pow(alpha, CAVITY_EXPONENT);
140
+
141
+ float alphaYP = getAlpha(IN.uv_CrackTex + float2(0.0, _CrackTex_TexelSize.y), edge);
142
+
143
+ float alphaXP = getAlpha(IN.uv_CrackTex + float2(_CrackTex_TexelSize.x, 0.0), edge);
144
+
145
+ float alphaYN = getAlpha(IN.uv_CrackTex + float2(0.0, -_CrackTex_TexelSize.y), edge);
146
+
147
+ float alphaXN = getAlpha(IN.uv_CrackTex + float2(-_CrackTex_TexelSize.x, 0.0), edge);
148
+
149
+ float3 tx = float3(_CrackTex_TexelSize.x * 2.0, 0.0, (alphaXN - alphaXP) * _CrackHeight);
150
+
151
+ float3 ty = float3(0.0, _CrackTex_TexelSize.y * 2.0, (alphaYN - alphaYP) * _CrackHeight);
152
+
153
+ float3 normal = normalize(normalize(cross(tx, ty)) + UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap)));
154
+
155
+ fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
156
+
157
+ o.Albedo = c.rgb * cavity;
158
+
159
+ o.Metallic = _Metallic;
160
+
161
+ o.Smoothness = _Glossiness;
162
+
163
+ o.Alpha = c.a;
164
+
165
+ o.Normal = normal;
166
+
167
+ o.Occlusion = cavity;
168
+
169
+ }
170
+
171
+ ENDCG
172
+
173
+
174
+
175
+ }
176
+
177
+ FallBack "Diffuse"
178
+
179
+ }
180
+
181
+ ```
182
+
183
+ 下図のように陰影の付いたひびにすることもできるかと思います。
184
+
185
+ ![陰影付きひび](f57c6808be7aa6e0fb22e1347df4d5c0.gif)