[1.17.1]Minecraft数据包---夜视仪

另一个着色器实例,尝试做了个夜视仪。
但是其实完全没有夜视的效果啊,只是把屏幕变绿了而已XD,但是观感还是不错的,这也得亏深度缓冲。

效果演示

B站视频演示:

https://www.bilibili.com/video/BV1464y1q7NE

演示1

演示2

大致原理

当玩家戴着一个特殊帽子的时候,在玩家面前生成发光实体,然后调用着色器。
帽子的判断使用断言。当玩家戴着特定帽子时,断言通过。

1
2
3
4
5
6
7
8
9
10
11
12
13
{
"condition": "minecraft:entity_properties",
"entity": "this",
"predicate": {
"equipment": {
"head": {
"items": ["leather_helmet"],
"count": 1,
"nbt": "{id:\"nvh:helmet\"}"
}
}
}
}

然后刷发光实体,并且糊到玩家脸上。
但是这个方案并不完备,由于tp的延迟,如果玩家快速转动视角,实体就会离开玩家视野然后导致着色器失效一瞬间,观感不是很好。
解决方法是检测模型材质来实现的,把模型放的足够大就可以基本避免着色器失效。

1
2
3
execute as @a at @s if entity @s[predicate=nvh:helmet] unless entity @e[type=armor_stand,tag=nvh-marker] run summon armor_stand ^ ^ ^5 {NoAI:1b,Tags:["nvh-marker"],Small:1,Marker:1,Invisible:1}
execute as @a[predicate=nvh:helmet] at @s anchored eyes run tp @e[type=armor_stand,tag=nvh-marker,limit=1] ^ ^ ^5
execute as @a at @s unless entity @s[predicate=nvh:helmet] if entity @e[type=armor_stand,tag=nvh-marker] run tp @e[type=armor_stand,tag=nvh-marker] ~ ~-366 ~

然后调用发光效果的着色器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#minecraft/shaders/post/entity_outline.json

{
"targets": [
"swap",
"final"
],
"passes": [
{
"name": "entity_outline",
"intarget": "final",
"outtarget": "swap",
"auxtargets": [
{
"name":"DiffuseDepthSampler",
"id": "minecraft:main:depth"
}
]
},
{
"name": "blit",
"intarget": "swap",
"outtarget": "final"
}
]
}

可以看到,在entity_outline当中调用了深度缓冲。
在program的entity_outline中进行相关设置,同时使用片段着色器night_vision

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#minecraft/shaders/post/night_vision.fsh

#version 150

uniform sampler2D DiffuseSampler;
uniform sampler2D DiffuseDepthSampler;

in vec2 texCoord;

out vec4 fragColor;

void main(){
float fromcenter = distance(texCoord, vec2(0.5,0.5));
float color = (1.0 - texture(DiffuseDepthSampler, texCoord).r) * 15.0;

if (fromcenter < 0.62){
fragColor = vec4(0.0, color + 0.1, color - 0.1, 0.9);
}
else if (fromcenter >= 0.62){
fragColor = vec4(0.0, 0.0, 0.0, 0.99);
}
}

获取了屏幕上每个像素点到中心的距离,若小于等于0.62,则输出夜视画面的主体(深度缓冲)。
若大于0.62,则输出黑色像素,作为周围的一个边框。
根据这个原理,原版的发光效果就没法用了:(,因为一旦玩家视野内出现发光实体,就会触发着色器,所以这个包也就是娱乐向的XD
同样通过识别模型材质可以躲过这个问题,不过等我有空再试吧。
原版的shader限制还是有很多的,不过在地图创作方面也确实是极大丰富了视觉效果。

鸣谢

  • ch2的深度缓冲教程
  • 其他所有的shader教程

datapack

链接: https://pan.baidu.com/s/1X23epcmeNake3GpkTF1C7Q
提取码: f5pp

  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2020-2021 Argon_gas

请我喝杯咖啡吧~