欢迎光临散文网 会员登陆 & 注册

Particle Bloom粒子辉光解析-适合新人学习的实用着色器

2022-02-19 21:03 作者:轩宇1725  | 我要投稿

(本教程使用了完全没有着色器经验的视角编写,提供了一种拆包的方法)

之前我在逛mcbbs时发现了一款很神奇的资源包,这里附上效果图和原贴:https://www.mcbbs.net/thread-1210511-1-1.html


Particle Bloom着色器对游戏做了哪些影响?

最简单的办法当然是找原作者

 


Hmmmm…

看来要知道这个着色器的原理,只能拆包了

 

乍一看文件很多,很复杂,但仔细阅读就能发现:

这个着色器只修改了2个核心着色器,一个后处理着色器,添加了一堆着色器程序

那么下一步就是要理清着色器工作的顺序:

在我的着色器基础教程中讲过,游戏使用核心着色器渲染之后交给后处理着色器,后处理着色器对已经渲染完毕的缓冲进行更改再移交到用户屏幕上。

Step1:

检查核心着色器修改了什么东西

 

如果对原版代码不熟悉建议双开,上面是Particle Bloom的内容,下面是从版本jar文件中提取的着色器。

 

(上面才是要解析的着色器,别看反了)

检查后发现,着色器中只对particle.vsh的这行做了修改。

 

我们可以先把其他的着色器占时放到不被游戏识别的任意文件夹内。(因为着色器文件之间的关联很大,没有修改的文件一般是为了防止出现兼容问题,这里只是解析着色器所以可以忽略)

 

这个如果你不知道vertexColor是什么,我们可以在其他大多数的片段着色器中找到它(这个变量由顶点着色器传递给片段着色器运算)

 

把它去掉之后:

 

 

可以说:这个变量控制了画面的光影变化和colormap的着色效果。当然也控制着粒子的着色效果。那么去掉的texelFetch(Sampler2, UV2 / 16, 0)到底有什么效果呢?

我们不妨把它加回去试试

 


好像变暗了一些?旁边的末影龙火球粒子也几乎看不清了。

很可能这个参数就是控制着粒子随着环境的明暗变化,事实上也的确如此,作为同时控制粒子着色效果和明暗变化的变量,如果只剩从材质中采样出来的颜色,自然就只保留了着色效果,去除了明暗变化,让粒子以原始亮度渲染。这对于粒子的辉光效果处理显然是必须的,否则会让这个效果看起来很怪(粒子明明很暗但是还是会发光)。

处理1:在vertexColor中删除了texelFetch采样让粒子以原始亮度渲染

下一步,将渲染完成后的画面交给后处理着色器(也就是下图的画面)

 

查看后处理着色器,发现修改了用户在极佳画面质量下使用的后处理着色器


检查了一遍文件,发现了一大堆没有启用的程序

 

排除这些干扰后,再次检查内容:

 

在targets中添加了”removegreen”,”swap”,”green”,”green_h”,”green_v”,”target_particle”几个缓冲。

 

调用了4次makebloom程序,每次都传入两份同样的缓冲,一份由intarget传入,系统标记为DiffuseSampler,另一份由auxtargets传入,标记为GreenSampler,提供的参数Power的值分别为1.0,2.0,4.0,8.0。

处理2:将覆盖前将particles缓冲模糊化,做到辉光效果

makebloom的内容不再具体分析,简单来说就是通过数学运算将只有粒子效果的一个渲染层变成光晕(或者可以理解为变糊了?),“变糊”的方式有很多种,可以自行更改。

再将“变糊的”green缓冲和游戏内容final缓冲在fade程序中叠加在一起。

最后在back中将重新被游戏渲染的粒子和之前的缓冲再次叠加,输出到minecraft:main中

处理3:将模糊的辉光叠加到游戏内容上

(该资源包的使用的后处理顶点着色器程序都是对内容没有任何影响的系统着色器)

 

对原理进行了分析后,我们可以对以下现象做出解释:

作者未对粒子做出筛选,但黑色的粒子并没有辉光效果:

黑色的粒子变糊之后会和没有粒子的背景部分处理成一个颜色,在fade中组合的时候会被当成没有粒子的情况,所以不会有辉光效果。

 

以及一些优化的方式:

检查UV2对一些不应该发光的粒子不做模糊处理

使用采样器对一些较暗的粒子进行模糊程度的修改


Particle Bloom粒子辉光解析-适合新人学习的实用着色器的评论 (共 条)

分享到微博请遵守国家法律