teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

コード全文 画像の追加

2017/12/13 10:16

投稿

donafudo
donafudo

スコア46

title CHANGED
File without changes
body CHANGED
@@ -1,6 +1,30 @@
1
1
  UnityのShaderで、カメラとの距離に応じて画面の色合いを変える処理を実装しようとしています
2
2
  その際に、カメラとカメラに移されている頂点との距離を、以下のコードで取得しようとしています
3
+
4
+ コード全文に変更
3
5
  ```lang-HLSL
6
+ Shader "Hidden/DepthOfField"
7
+ {
8
+ Properties
9
+ {
10
+ _MainTex ("Texture", 2D) = "white" {}
11
+ _Depth("Depth",FLOAT) = 0.8
12
+ }
13
+ SubShader
14
+ {
15
+ // No culling or depth
16
+ Cull Off ZWrite Off ZTest Always
17
+
18
+ Pass
19
+ {
20
+ CGPROGRAM
21
+ #pragma vertex vert
22
+ #pragma fragment frag
23
+
24
+ #include "UnityCG.cginc"
25
+
26
+ float _Depth;
27
+
4
28
  struct appdata
5
29
  {
6
30
  float4 vertex :POSITION;
@@ -11,7 +35,7 @@
11
35
  {
12
36
  float2 uv : TEXCOORD0;
13
37
  float4 vertex : SV_POSITION;
14
- float dist : TEXCOORD1;
38
+ float3 vertexWorldPos: TEXCOORD1;
15
39
  };
16
40
 
17
41
  v2f vert (appdata v)
@@ -20,14 +44,37 @@
20
44
  o.vertex = UnityObjectToClipPos(v.vertex);
21
45
  o.uv = v.uv;
22
46
 
23
- float3 vertexWorldPos = mul(unity_ObjectToWorld,v.vertex).xyz;
47
+ o.vertexWorldPos = mul(unity_ObjectToWorld,v.vertex).xyz;
24
-          //distの値に応じてfragment内で分岐
25
- o.dist = distance(_WorldSpaceCameraPos , vertexWorldPos);
26
48
 
27
49
  return o;
28
50
  }
51
+
52
+ sampler2D _MainTex;
53
+ sampler2D _CameraDepthTexture;
54
+
55
+ fixed4 frag (v2f i) : SV_Target
56
+ {
57
+ float depth= tex2D(_CameraDepthTexture,i.uv);
58
+ float4 col = tex2D(_MainTex, i.uv);
59
+ float dist = length(i.vertexWorldPos - _WorldSpaceCameraPos);
60
+
61
+ if (dist < _Depth) {
62
+ return depth;
63
+ }
64
+ else {
65
+ return col;
66
+ }
67
+ }
68
+ ENDCG
69
+ }
70
+ }
71
+ }
72
+
29
73
  ```
30
74
  調べた限りでは、モデルマトリクスに(ローカル座標の)頂点位置を掛けると、その頂点のワールド座標が求められるので
31
75
  distance関数で、カメラとの距離を求められると思ったのですが
32
76
  期待した結果になりません
33
- 私が勘違いしているところや別の方法はありませんでしょうか?
77
+ 私が勘違いしているところや別の方法はありませんでしょうか?
78
+ ![現実](63bc15965aaa40e94ee6d8b31545ff58.png)![理想](f3057c8ec376ca667ccda2739e8146b5.png)
79
+ 上:実行結果(カメラを動かすと描画が分かれている部分も移動する) 
80
+ 下:理想(これは直線的なので距離フォグのようにしたい)