让我们在Minecraft中尝试添加阴影吧!【GLSL】

上次:如何基本解释和改变方块的颜色
下次:如何改变光源的颜色的方法

首先()

这次我想要解释一下添加光影Mod的方法,可以说它是Minecraft中的代名词!

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

当然可以用这种方法给影子添上去,

由于进行矩阵等复杂计算,因此处理变得繁重。
由于机制复杂,因此难以理解。
给我的低配置电脑带来了冲击。

因为以上的原因,我决定放弃介绍制造真实影子的方法(如果有机会的话,可能会考虑写一篇文章)。

不过不用担心。
如果根据方块的亮度信息来计算阴影,就可以用更简单更轻量的机制加上阴影!

从方块的亮度中产生阴影的方法

让我们继续编辑“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);
}

让我们来编写这段代码吧。

如果(){}条件符合,则执行{}中的代码。

将「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()」といった関数を使うことによって、影の境目を滑らかにすることもできます。

请务必考虑一下哦!

最后

如果下一次有机会的话,我打算解释一下如何改变火把等光源的颜色!(聪明的人应该知道怎么做。)

再见,我们下次见面!再见!

广告
将在 10 秒后关闭
bannerAds