让我们在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)」的简写!

影已经出现了,但是变得漆黑了呢…
「vec3(0.0)」を「vec3(0.7)」にして、明るめにしてみましょう。


这个状态也可以,但是只用火把之类的光线照亮仍然很暗,感觉不自然。
if(lmcoord.y <= 0.95){
diffuse.rgb *= vec3(0.7) * (lmcoord.x + 0.7);
}
让我们将具有光信息的“lmcoord.x”乘以它!
lmcoord.xの数値は低めなので、0.7を足しています。
()をつけると、その中の式が優先して計算されます!

完美!
「mix()」や「smoothstep()」といった関数を使うことによって、影の境目を滑らかにすることもできます。
请务必考虑一下哦!
最后
如果下一次有机会的话,我打算解释一下如何改变火把等光源的颜色!(聪明的人应该知道怎么做。)
再见,我们下次见面!再见!