LoginSignup
51
33

More than 3 years have passed since last update.

Minecraftで影をつけてみよう!【glsl】

Last updated at Posted at 2021-02-07

前回:基本の解説・ブロックの色を変更する方法
次回:光源の色を変更する方法

はじめに

今回はMinecraftの影Modの代名詞と言っても過言ではない、
影をつける方法を解説していこうと思います!

影をつける方法と聞けば、
「太陽の位置とブロックの位置を計算して~」
といった感じに想像する人が大半だと思います。

もちろんその方法で影をつけることは可能なのですが、

・マトリックスなどの計算をそこそこ複雑に行うので、処理が重くなる
・仕組みが複雑なので、理解が難しい
・私の低スペックPCに打撃を与える

以上の理由から、リアルな影をつける方法の紹介は断念(機会があれば記事を書くかもしれない)しました。

でも心配しないでください。
ブロックの明るさの情報から影を求めれば、より軽量でより簡単な仕組みで影をつけることができます!

ブロックの明るさから影をつける方法

今回も「gbuffers_terrain.fsh」を編集していきましょう。

ファイルの中を探せば、次のようなコードが見つかるはずです。

diffuse *= texture2D(lightmap, lmcoord);

これはブロックに明るさをつける命令で、「lmcoord」をもとに処理されています。

この「lmcoord」を利用します!

「lmcoord」のしくみ

「lmcoord」には、「lmcoord.x」「lmcoord.y」の二種類の情報が入っています。

「lmcoord.x」は、松明などの光の強さ、「lmcoord.y」は、ブロックの真上から光を当てたときに、そこが影になるかならないかのレベル...のようなものです。

「lmcoord.y」を使えば、明るさをもとに影をつけることができます!

影をつけてみましょう!

if(lmcoord.y <= 0.95){
diffuse.rgb *= vec3(0.0);
}

このコードを書いてみましょう。

「if(){}」は、()の中の条件が成立すれば{}の中のコードが実行されるという命令なので、

「lmcoord.y」が0.95以下の部分をvec3(0.0)にする
といった仕組みです。

「vec3(0.0)」は、「vec3(0.0 , 0.0 , 0.0)」を省略したものです!

2021-02-07_12.08.53.png

影がつきましたが、真っ黒ですね...

「vec3(0.0)」を「vec3(0.7)」にして、明るめにしてみましょう。

2021-02-07_12.08.34.png

だいぶ影っぽくなりましたね!
2021-02-07_12.33.34.png

このままでもいいのですが、松明などの光で照らされても暗いままなので不自然です...

if(lmcoord.y <= 0.95){
diffuse.rgb *= vec3(0.7) * (lmcoord.x + 0.7);
}

光の情報を持った「lmcoord.x」を掛け算してみましょう!

lmcoord.xの数値は低めなので、0.7を足しています。
()をつけると、その中の式が優先して計算されます!

2021-02-07_12.10.27.png

完璧~!

「mix()」や「smoothstep()」といった関数を使うことによって、影の境目を滑らかにすることもできます。

ぜひ考えてみてくださいね!

おわりに

次回があれば松明などの光の色を変更する方法を解説しようと思います!
(勘の良い人はやり方が分かると思います。)

それではまた会いましょう!さようなら!

51
33
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
51
33