回答編集履歴

5

初期テクスチャサイズが1の時エラーを起こすため、縮小ループをdo-whileからwhileに変更

2017/11/18 10:26

投稿

Bongo
Bongo

スコア10807

test CHANGED
@@ -206,7 +206,7 @@
206
206
 
207
207
 
208
208
 
209
- do
209
+ while (scaledSize > 1)
210
210
 
211
211
  {
212
212
 
@@ -226,8 +226,6 @@
226
226
 
227
227
  }
228
228
 
229
- while (scaledSize > 1);
230
-
231
229
 
232
230
 
233
231
  var currentActiveTexture = RenderTexture.active;

4

他環境での不具合を修正

2017/11/18 10:25

投稿

Bongo
Bongo

スコア10807

test CHANGED
@@ -44,6 +44,12 @@
44
44
 
45
45
 
46
46
 
47
+ [追記]
48
+
49
+ 当初のカメラスクリプトではテクスチャ生成時にテクスチャフォーマットを指定していましたが、それをやめてサイズだけ指定するようにしました(最初のコードはMac版OpenGL上でしか動作確認していなかったのですが、後で試したらMetalやWindows版で正しい結果が得られませんでした...)。また併せて、シェーダーコードで返していたフラグメントの色を`fixed4(result, 0.0, 0.0, 1.0)`から`fixed4(result, result, result, 1.0)`に変えました。動作上は変える必要はないのですが、縮小過程をフレームデバッガで見た時に、前者だと目的色部分が赤色になってしまいます。上記のコード概要説明では抽出結果を白だの黒だのと表現していますので、それに合わせるようにしてみました。
50
+
51
+
52
+
47
53
  - カメラのスクリプト
48
54
 
49
55
  ```C#
@@ -180,7 +186,7 @@
180
186
 
181
187
  {
182
188
 
183
- this.queryResultTexture = new Texture2D(1, 1, TextureFormat.RGB24, false);
189
+ this.queryResultTexture = new Texture2D(1, 1);
184
190
 
185
191
  }
186
192
 
@@ -188,7 +194,7 @@
188
194
 
189
195
  var scaledSize = this.level0TextureSize;
190
196
 
191
- var previousLevelTexture = RenderTexture.GetTemporary(scaledSize, scaledSize, 0, RenderTextureFormat.R8);
197
+ var previousLevelTexture = RenderTexture.GetTemporary(scaledSize, scaledSize);
192
198
 
193
199
 
194
200
 
@@ -208,7 +214,7 @@
208
214
 
209
215
 
210
216
 
211
- var scaledTexture = RenderTexture.GetTemporary(scaledSize, scaledSize, 0, RenderTextureFormat.R8);
217
+ var scaledTexture = RenderTexture.GetTemporary(scaledSize, scaledSize);
212
218
 
213
219
 
214
220
 
@@ -338,195 +344,195 @@
338
344
 
339
345
  {
340
346
 
341
- Properties
342
-
343
- {
344
-
345
- _MainTex ("Texture", 2D) = "white" {}
346
-
347
- _ReferenceColor ("Reference Color", Color) = (1.0, 0.0, 0.0, 1.0)
348
-
349
- _ReferenceColorThreshold ("Reference Color Threshold", Range(0.0, 1.0)) = 0.5
350
-
351
- }
352
-
353
-
354
-
355
- SubShader
356
-
357
- {
358
-
359
- Cull Off ZWrite Off ZTest Always
360
-
361
-
362
-
363
- // 抽出パス
364
-
365
- Pass
366
-
367
- {
368
-
369
- CGPROGRAM
370
-
371
- #pragma vertex vert
372
-
373
- #pragma fragment frag
374
-
375
-
376
-
377
- #include "UnityCG.cginc"
378
-
379
-
380
-
381
- struct appdata
382
-
383
- {
384
-
385
- float4 vertex : POSITION;
386
-
387
- float2 uv : TEXCOORD0;
388
-
389
- };
390
-
391
-
392
-
393
- struct v2f
394
-
395
- {
396
-
397
- float2 uv : TEXCOORD0;
398
-
399
- float4 vertex : SV_POSITION;
400
-
401
- };
402
-
403
-
404
-
405
- sampler2D _MainTex;
406
-
407
- float4 _ReferenceColor;
408
-
409
- float _ReferenceColorThreshold;
410
-
411
-
412
-
413
- v2f vert(appdata v)
414
-
415
- {
416
-
417
- v2f o;
418
-
419
- o.vertex = UnityObjectToClipPos(v.vertex);
420
-
421
- o.uv = v.uv;
422
-
423
- return o;
424
-
425
- }
426
-
427
-
428
-
429
- fixed4 frag(v2f i) : SV_Target
430
-
431
- {
432
-
433
- // ピクセル色と目的色の距離がしきい値未満なら1、さもなくば0
434
-
435
- float result = sign(max(_ReferenceColorThreshold - length(_ReferenceColor.rgb - tex2D(_MainTex, i.uv).rgb), 0.0));
436
-
437
-
438
-
439
- return fixed4(result, 0.0, 0.0, 1.0);
440
-
441
- }
442
-
443
- ENDCG
444
-
445
- }
446
-
447
-
448
-
449
- // 縮小パス
450
-
451
- Pass
452
-
453
- {
454
-
455
- CGPROGRAM
456
-
457
- #pragma vertex vert
458
-
459
- #pragma fragment frag
460
-
461
-
462
-
463
- #include "UnityCG.cginc"
464
-
465
-
466
-
467
- struct appdata
468
-
469
- {
470
-
471
- float4 vertex : POSITION;
472
-
473
- float2 uv : TEXCOORD0;
474
-
475
- };
476
-
477
-
478
-
479
- struct v2f
480
-
481
- {
482
-
483
- float2 uv : TEXCOORD0;
484
-
485
- float4 vertex : SV_POSITION;
486
-
487
- };
488
-
489
-
490
-
491
- sampler2D _MainTex;
492
-
493
-
494
-
495
- v2f vert(appdata v)
496
-
497
- {
498
-
499
- v2f o;
500
-
501
- o.vertex = UnityObjectToClipPos(v.vertex);
502
-
503
- o.uv = v.uv;
504
-
505
- return o;
506
-
507
- }
508
-
509
-
510
-
511
- fixed4 frag(v2f i) : SV_Target
512
-
513
- {
514
-
515
- // 近傍4テクセルの中心からサンプリング、ピクセル色が0より大きければ(1のテクセルが1つ以上あれば)1、さもなくば0
516
-
517
- float result = sign(tex2D(_MainTex, i.uv).r);
518
-
519
-
520
-
521
- return fixed4(result, 0.0, 0.0, 1.0);
522
-
523
- }
524
-
525
- ENDCG
526
-
527
- }
528
-
529
- }
347
+ Properties
348
+
349
+ {
350
+
351
+ _MainTex ("Texture", 2D) = "white" {}
352
+
353
+ _ReferenceColor ("Reference Color", Color) = (1.0, 0.0, 0.0, 1.0)
354
+
355
+ _ReferenceColorThreshold ("Reference Color Threshold", Range(0.0, 1.0)) = 0.5
356
+
357
+ }
358
+
359
+
360
+
361
+ SubShader
362
+
363
+ {
364
+
365
+ Cull Off ZWrite Off ZTest Always
366
+
367
+
368
+
369
+ // 抽出パス
370
+
371
+ Pass
372
+
373
+ {
374
+
375
+ CGPROGRAM
376
+
377
+ #pragma vertex vert
378
+
379
+ #pragma fragment frag
380
+
381
+
382
+
383
+ #include "UnityCG.cginc"
384
+
385
+
386
+
387
+ struct appdata
388
+
389
+ {
390
+
391
+ float4 vertex : POSITION;
392
+
393
+ float2 uv : TEXCOORD0;
394
+
395
+ };
396
+
397
+
398
+
399
+ struct v2f
400
+
401
+ {
402
+
403
+ float2 uv : TEXCOORD0;
404
+
405
+ float4 vertex : SV_POSITION;
406
+
407
+ };
408
+
409
+
410
+
411
+ sampler2D _MainTex;
412
+
413
+ float4 _ReferenceColor;
414
+
415
+ float _ReferenceColorThreshold;
416
+
417
+
418
+
419
+ v2f vert(appdata v)
420
+
421
+ {
422
+
423
+ v2f o;
424
+
425
+ o.vertex = UnityObjectToClipPos(v.vertex);
426
+
427
+ o.uv = v.uv;
428
+
429
+ return o;
430
+
431
+ }
432
+
433
+
434
+
435
+ fixed4 frag(v2f i) : SV_Target
436
+
437
+ {
438
+
439
+ // ピクセル色と目的色の距離がしきい値未満なら1、さもなくば0
440
+
441
+ float result = sign(max(_ReferenceColorThreshold - length(_ReferenceColor.rgb - tex2D(_MainTex, i.uv).rgb), 0.0));
442
+
443
+
444
+
445
+ return fixed4(result, result, result, 1.0);
446
+
447
+ }
448
+
449
+ ENDCG
450
+
451
+ }
452
+
453
+
454
+
455
+ // 縮小パス
456
+
457
+ Pass
458
+
459
+ {
460
+
461
+ CGPROGRAM
462
+
463
+ #pragma vertex vert
464
+
465
+ #pragma fragment frag
466
+
467
+
468
+
469
+ #include "UnityCG.cginc"
470
+
471
+
472
+
473
+ struct appdata
474
+
475
+ {
476
+
477
+ float4 vertex : POSITION;
478
+
479
+ float2 uv : TEXCOORD0;
480
+
481
+ };
482
+
483
+
484
+
485
+ struct v2f
486
+
487
+ {
488
+
489
+ float2 uv : TEXCOORD0;
490
+
491
+ float4 vertex : SV_POSITION;
492
+
493
+ };
494
+
495
+
496
+
497
+ sampler2D _MainTex;
498
+
499
+
500
+
501
+ v2f vert(appdata v)
502
+
503
+ {
504
+
505
+ v2f o;
506
+
507
+ o.vertex = UnityObjectToClipPos(v.vertex);
508
+
509
+ o.uv = v.uv;
510
+
511
+ return o;
512
+
513
+ }
514
+
515
+
516
+
517
+ fixed4 frag(v2f i) : SV_Target
518
+
519
+ {
520
+
521
+ // 近傍4テクセルの中心からサンプリング、ピクセル色が0より大きければ(1のテクセルが1つ以上あれば)1、さもなくば0
522
+
523
+ float result = sign(tex2D(_MainTex, i.uv).r);
524
+
525
+
526
+
527
+ return fixed4(result, result, result, 1.0);
528
+
529
+ }
530
+
531
+ ENDCG
532
+
533
+ }
534
+
535
+ }
530
536
 
531
537
  }
532
538
 

3

マテリアルをHideFlags.DontSave指定する必要はなかった気がしたので削除

2017/11/18 03:04

投稿

Bongo
Bongo

スコア10807

test CHANGED
@@ -168,8 +168,6 @@
168
168
 
169
169
  this.material = new Material(Shader.Find("Hidden/Color Extractor"));
170
170
 
171
- this.material.hideFlags = HideFlags.DontSave;
172
-
173
171
  this.referenceColorId = Shader.PropertyToID("_ReferenceColor");
174
172
 
175
173
  this.referenceColorThresholdId = Shader.PropertyToID("_ReferenceColorThreshold");

2

リファレンスのリンク先を修正

2017/11/17 23:39

投稿

Bongo
Bongo

スコア10807

test CHANGED
@@ -24,7 +24,7 @@
24
24
 
25
25
  - 画面をレンダリングする。天球画像の代用としてシーンに赤い球を配置し、カメラに赤色が写り込んでいるかを判定することにした。
26
26
 
27
- - [ポストプロセッシングエフェクト](https://docs.unity3d.com/Manual/PostProcessingWritingEffects.html)のやり方を参考に、カメラにアタッチしたスクリプトの[OnRenderImage](https://docs.unity3d.com/ScriptReference/Camera.OnRenderImage.html)内で色判定処理を行う。
27
+ - [ポストプロセッシングエフェクト](https://docs.unity3d.com/Manual/PostProcessingWritingEffects.html)のやり方を参考に、カメラにアタッチしたスクリプトの[OnRenderImage](https://docs.unity3d.com/ScriptReference/MonoBehaviour.OnRenderImage.html)内で色判定処理を行う。
28
28
 
29
29
  - レンダリング結果を適当な2の冪乗サイズの一時レンダーテクスチャに写す。この時色判定を行い、目的の色であれば白、そうでなければ黒として写す。
30
30
 

1

リンクを追加、機能名を訂正

2017/11/17 23:02

投稿

Bongo
Bongo

スコア10807

test CHANGED
@@ -544,8 +544,8 @@
544
544
 
545
545
 
546
546
 
547
- - フレームデバッで見た描画の過程
547
+ - [フレームデバッガ](https://docs.unity3d.com/Manual/FrameDebugger.html)で見た描画の過程
548
-
549
-
550
-
548
+
549
+
550
+
551
- ![フレームデバッ](ce43511581e94bfc1e5fc171a31dba0a.gif)
551
+ ![フレームデバッ](ce43511581e94bfc1e5fc171a31dba0a.gif)