回答編集履歴

3

表現を一部修正

2017/09/23 21:29

投稿

Bongo
Bongo

スコア10807

test CHANGED
@@ -34,7 +34,7 @@
34
34
 
35
35
  ご提示いただいた```float Test =(1.0f/(PointDir*PointDir));```ですと、「PointDir(ライトから見たピクセルの方向)のx、y、zをそれぞれ2乗」→「x、y、zをそれぞれ逆数にする」→「xだけをTestに格納」という結果になってしまうはずです。
36
36
 
37
- この場合、ライトから見たピクセルの方向のx成分が小さいほどTestの値は大きくなるので、ご提示の画像のような奇妙な結果になったのかと思います。「ライトが床より少し上」の画像の床部分にこの効果が顕著に見られ、床中心に対して前後方向が最も明るく、左右方向が最も暗くなっています。
37
+ この場合、ライトから見たピクセルの方向のx成分の絶対値が小さいほどTestの値は大きくなるので、ご提示の画像のような奇妙な結果になったのかと思います。「ライトが床より少し上」の画像の床部分にこの効果が顕著に見られ、床中心に対して前後方向が最も明るく、左右方向が最も暗くなっています。
38
38
 
39
39
 
40
40
 
@@ -56,9 +56,9 @@
56
56
 
57
57
  PointDir /= PointDist; // 相対位置を距離で割る→これでPointDirがnormalize(In.wPos - LightPos)と同等になる
58
58
 
59
- float PointLPow = dot(-PointDir, w_normal); // 光の強さ -1~1
59
+ float PointLPow = dot(-PointDir, w_normal); // 光の強さ -1~1...この行は変更なし
60
60
 
61
- PointLPow = saturate(PointLPow); // 0~1内に収める このLPowが、このピクセルに当たる光の強さになる 0だと0% 1だと100%
61
+ PointLPow = saturate(PointLPow); // 0~1内に収める このLPowが、このピクセルに当たる光の強さになる 0だと0% 1だと100%...この行も変更なし
62
62
 
63
63
  //逆2乗--------------------------------------------------------
64
64
 

2

逆2乗バージョンの修正案を追記

2017/09/23 21:29

投稿

Bongo
Bongo

スコア10807

test CHANGED
@@ -25,3 +25,43 @@
25
25
 
26
26
 
27
27
  私の思うところですと、厳密な逆2乗の法則に基づく減衰は、最近のゲームのような写実的なライティング手法で真価を発揮するような気がします。[基礎からはじめる物理ベースレンダリング - Qiita](https://qiita.com/mebiusbox2/items/e7063c5dfe1424e0d01a)の記事などでリアルな絵作りの技法が紹介されていました。魅力的ですが、なかなかややこしいですね。
28
+
29
+
30
+
31
+ [追記]
32
+
33
+
34
+
35
+ ご提示いただいた```float Test =(1.0f/(PointDir*PointDir));```ですと、「PointDir(ライトから見たピクセルの方向)のx、y、zをそれぞれ2乗」→「x、y、zをそれぞれ逆数にする」→「xだけをTestに格納」という結果になってしまうはずです。
36
+
37
+ この場合、ライトから見たピクセルの方向のx成分が小さいほどTestの値は大きくなるので、ご提示の画像のような奇妙な結果になったのかと思います。「ライトが床より少し上」の画像の床部分にこの効果が顕著に見られ、床中心に対して前後方向が最も明るく、左右方向が最も暗くなっています。
38
+
39
+
40
+
41
+ シェーダーコードの先頭部分を下記のようにしてみましたがどうでしょうか?
42
+
43
+
44
+
45
+ ```
46
+
47
+ //------------------------------------------------
48
+
49
+ //拡散色
50
+
51
+ //------------------------------------------------
52
+
53
+ float3 PointDir = In.wPos - LightPos; // ライトを原点としたピクセルの相対位置...後で正規化して「ライトから見たピクセルの方向」にする
54
+
55
+ float PointDist = length(PointDir); // PointDirの長さ→ライトとピクセルの距離
56
+
57
+ PointDir /= PointDist; // 相対位置を距離で割る→これでPointDirがnormalize(In.wPos - LightPos)と同等になる
58
+
59
+ float PointLPow = dot(-PointDir, w_normal); // 光の強さ -1~1
60
+
61
+ PointLPow = saturate(PointLPow); // 0~1内に収める このLPowが、このピクセルに当たる光の強さになる 0だと0% 1だと100%
62
+
63
+ //逆2乗--------------------------------------------------------
64
+
65
+ float Test =(1.0f/(PointDist*PointDist)); // PointDirの代わりにPointDistの逆二乗を求める
66
+
67
+ ```

1

参考サイトの記事タイトルの誤りを修正

2017/09/23 21:21

投稿

Bongo
Bongo

スコア10807

test CHANGED
@@ -20,7 +20,7 @@
20
20
 
21
21
  といった感じで減衰率の分母が二次の多項式になっており、定数項(att0i)、1次の項(att1i)、2次の項(att2i)の係数を調整することで減衰のカーブを急にしたりなだらかにしたりできるようにしているようです。
22
22
 
23
- この方式での実装例としては[~プログラミング~ DirectX 11で平行光源ライティング](https://araramistudio.jimdo.com/2017/09/08/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-directx-11%E3%81%A7%E7%82%B9%E5%85%89%E6%BA%90%E3%83%A9%E3%82%A4%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0/)などはご参考になりますでしょうか?
23
+ この方式での実装例としては[~プログラミング~ DirectX 11で光源ライティング](https://araramistudio.jimdo.com/2017/09/08/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-directx-11%E3%81%A7%E7%82%B9%E5%85%89%E6%BA%90%E3%83%A9%E3%82%A4%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0/)などはご参考になりますでしょうか?
24
24
 
25
25
 
26
26