質問編集履歴

3

コードの追加

2019/12/06 22:30

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -265,3 +265,319 @@
265
265
  対策方法を調べたのですが、現状出て来なかったので、どうしても分からず質問しました。ちらつきをなくす方法はあるでしょうか?
266
266
 
267
267
  [Unity2D 描画がちらつく](https://teratail.com/questions/198116)の方法では解決しませんでした。
268
+
269
+
270
+
271
+ ・使用しているシェーダーのコード
272
+
273
+ ```ShaderLab
274
+
275
+ Shader "Unlit/World"
276
+
277
+ {
278
+
279
+ Properties
280
+
281
+ {
282
+
283
+ [NoScaleOffset] _MainTex ("Texture", 2D) = "white" {}
284
+
285
+
286
+
287
+ // 見た目調整用プロパティを変更、前回と異なり大きくするほど鋭くなる
288
+
289
+ [PowerSlider(10)] _EdgeSharpness ("Edge Sharpness", Range(0, 100.0)) = 10.0
290
+
291
+
292
+
293
+ _EdgeDist ("Edge Disturbance", Range(0.0, 1.0)) = 0.05
294
+
295
+ _EdgeDistFreq ("Edge Disturbance Frequency", Range(0.0, 16.0)) = 4.0
296
+
297
+ }
298
+
299
+
300
+
301
+ SubShader
302
+
303
+ {
304
+
305
+ Tags { "RenderType"="Opaque" }
306
+
307
+
308
+
309
+ Pass
310
+
311
+ {
312
+
313
+ CGPROGRAM
314
+
315
+ #pragma vertex vert
316
+
317
+ #pragma fragment frag
318
+
319
+ #include "UnityCG.cginc"
320
+
321
+
322
+
323
+ // 頂点アトリビュートからはUV関連を削除
324
+
325
+ struct appdata
326
+
327
+ {
328
+
329
+ float4 vertex : POSITION;
330
+
331
+ float4 color : COLOR;
332
+
333
+ };
334
+
335
+
336
+
337
+ // tileUvには(0, 0)、(1, 0)、(0, 1)、(1, 1)のいずれかが入る
338
+
339
+ struct v2f
340
+
341
+ {
342
+
343
+ float4 vertex : SV_POSITION;
344
+
345
+ float2 tileUv : TEXCOORD0;
346
+
347
+ float weight : TEXCOORD1;
348
+
349
+ float2 modelPos : TEXCOORD2;
350
+
351
+ };
352
+
353
+
354
+
355
+ inline float random(float2 st) {
356
+
357
+ return frac(sin(dot(st, float2(12.9898, 78.233))) * 43758.5453123);
358
+
359
+ }
360
+
361
+
362
+
363
+ float noise(float2 st)
364
+
365
+ {
366
+
367
+ float2 i = floor(st);
368
+
369
+ float2 f = frac(st);
370
+
371
+ float a = random(i);
372
+
373
+ float b = random(i + float2(1.0, 0.0));
374
+
375
+ float c = random(i + float2(0.0, 1.0));
376
+
377
+ float d = random(i + float2(1.0, 1.0));
378
+
379
+ float2 u = f * f * (3.0 - 2.0 * f);
380
+
381
+
382
+
383
+ return dot(float2(lerp(a, b, u.x), lerp(c - a, d - b, u.x)), float2(1.0, u.y));
384
+
385
+ }
386
+
387
+
388
+
389
+ float fractal(float2 st)
390
+
391
+ {
392
+
393
+ float4 amp = float4(1.0, 0.5, 0.25, 0.125);
394
+
395
+ float4 v;
396
+
397
+
398
+
399
+ v.x = noise(st);
400
+
401
+ st = st * 2.0 + float2(14.1421356237, 17.3205080757);
402
+
403
+ v.y = noise(st);
404
+
405
+ st = st * 2.0 + float2(22.360679775, 26.4575131106);
406
+
407
+ v.z = noise(st);
408
+
409
+ st = st * 2.0 + float2(31.4159265359, 27.1828182846);
410
+
411
+ v.w = noise(st);
412
+
413
+
414
+
415
+ return dot(v, amp) / dot(1.0, amp);
416
+
417
+ }
418
+
419
+
420
+
421
+ sampler2D _MainTex;
422
+
423
+ float4 _MainTex_ST;
424
+
425
+ float4 _MainTex_TexelSize;
426
+
427
+ float _EdgeSharpness;
428
+
429
+ float _EdgeDist;
430
+
431
+ float _EdgeDistFreq;
432
+
433
+
434
+
435
+ // ユニフォーム変数を追加
436
+
437
+ #define TYPE_COUNT_MAX 8
438
+
439
+ int _TypeCount;
440
+
441
+ float4 _TypeUvs[TYPE_COUNT_MAX / 2];
442
+
443
+ float2 _TileSize;
444
+
445
+ float _TypeLevels[TYPE_COUNT_MAX];
446
+
447
+
448
+
449
+ float4 _Color;
450
+
451
+
452
+
453
+ v2f vert(appdata v)
454
+
455
+ {
456
+
457
+ v2f o;
458
+
459
+ o.tileUv = v.color.xy;
460
+
461
+ o.weight = v.color.a;
462
+
463
+ o.modelPos = v.vertex.xy;
464
+
465
+ o.vertex = UnityObjectToClipPos(v.vertex);
466
+
467
+ return o;
468
+
469
+ }
470
+
471
+
472
+
473
+ fixed4 frag(v2f i) : SV_Target
474
+
475
+ {
476
+
477
+ // まずは前回同様weightを計算する
478
+
479
+ float f = dot(float2(_EdgeDist, 1.0 - _EdgeDist), float2(fractal(i.modelPos * _EdgeDistFreq), 0.5));
480
+
481
+ float upper = 1.0 - 2.0 * (1.0 - i.weight) * (1.0 - f);
482
+
483
+ float lower = 2.0 * i.weight * f;
484
+
485
+ float weight = lerp(lower, upper, step(0.5, i.weight));
486
+
487
+
488
+
489
+ // weightを比較してどの範囲にいるか判定し、それを越えない最大のインデックスを調べる
490
+
491
+ uint index = 0;
492
+
493
+ [unroll(TYPE_COUNT_MAX)]
494
+
495
+ for (int k = 0; k < _TypeCount; k++)
496
+
497
+ {
498
+
499
+ if (_TypeLevels[k] < weight)
500
+
501
+ {
502
+
503
+ index = k + 1;
504
+
505
+ continue;
506
+
507
+ }
508
+
509
+ break;
510
+
511
+ }
512
+
513
+ index = min(index, _TypeCount - 1);
514
+
515
+
516
+
517
+ // さらに、その一つ下・一つ上のインデックスを求めておく
518
+
519
+ uint prevIndex = index > 0 ? index - 1 : 0;
520
+
521
+ uint nextIndex = min(index + 1, _TypeCount - 1);
522
+
523
+
524
+
525
+ // 範囲の下限・上限の高さを取得し、lowerLevelを0、upperLevelを1としたときのweightの位置を調べる
526
+
527
+ float lowerLevel = (index == prevIndex) ? 0.0 : _TypeLevels[prevIndex];
528
+
529
+ float upperLevel = (index == nextIndex) ? 1.0 : _TypeLevels[index];
530
+
531
+ float weightInRange = (lowerLevel == upperLevel) ? 0.0 : (weight - lowerLevel) / (upperLevel - lowerLevel);
532
+
533
+
534
+
535
+ // weightInRangeが0.5以上かどうかでnextIndex、prevIndexのいずれかを選択する
536
+
537
+ uint edgeIndex = weightInRange >= 0.5 ? nextIndex : prevIndex;
538
+
539
+
540
+
541
+ // weightInRangeが0.5の時0、そこより範囲境界に近いほど1になるような値を作る
542
+
543
+ // このとき_EdgeSharpness乗して、カーブを適宜鋭くする
544
+
545
+ float edgeFactor = saturate(pow(abs(weightInRange * 2.0 - 1.0), _EdgeSharpness));
546
+
547
+
548
+
549
+ // 範囲中心および範囲境界に対応するUVを取得し、そこからそれぞれ色を取得する
550
+
551
+ float4 edgeVector = _TypeUvs[edgeIndex / 2];
552
+
553
+ float4 centerVector = _TypeUvs[index / 2];
554
+
555
+ float2 edgeUv = lerp(edgeVector.xy, edgeVector.zw, edgeIndex % 2);
556
+
557
+ float2 centerUv = lerp(centerVector.xy, centerVector.zw, index % 2);
558
+
559
+ float2 uvOffset = i.tileUv * _TileSize;
560
+
561
+ fixed4 edgeColor = tex2D(_MainTex, edgeUv + uvOffset);
562
+
563
+ fixed4 centerColor = tex2D(_MainTex, centerUv + uvOffset);
564
+
565
+
566
+
567
+ // 範囲中心でcenterColorが100%、境界部分でcenterColorとedgeColorが
568
+
569
+ // 50%混合になるように2つの色を混ぜ合わせる
570
+
571
+ return lerp(centerColor, edgeColor, edgeFactor * 0.5);
572
+
573
+ }
574
+
575
+ ENDCG
576
+
577
+ }
578
+
579
+ }
580
+
581
+ }
582
+
583
+ ```

2

書式の改善

2019/12/06 22:30

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -264,6 +264,4 @@
264
264
 
265
265
  対策方法を調べたのですが、現状出て来なかったので、どうしても分からず質問しました。ちらつきをなくす方法はあるでしょうか?
266
266
 
267
- [Unity2D 描画がちらつく
268
-
269
- ](https://teratail.com/questions/198116)の方法では解決しませんでした。
267
+ [Unity2D 描画がちらつく](https://teratail.com/questions/198116)の方法では解決しませんでした。

1

書式の改善

2019/12/06 18:46

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -264,6 +264,6 @@
264
264
 
265
265
  対策方法を調べたのですが、現状出て来なかったので、どうしても分からず質問しました。ちらつきをなくす方法はあるでしょうか?
266
266
 
267
- 前に質問した[Unity2D 描画がちらつく
267
+ [Unity2D 描画がちらつく
268
268
 
269
269
  ](https://teratail.com/questions/198116)の方法では解決しませんでした。