第二部分:参数、纹理传递
shader的教程真的这么简单就结束了嘛,当然不,比如咱的图片制作工具,是用两张图片来计算,但启用shader以后只能有一个“绘制进去的内容”,另一张图,或者叫“背景”却没办法传递进去。再比如shader里有一些参数需要微调,不能针对每个参数做单独的shader吧,所以说还需要一个把参数传递到shader里用的方法。是的,这些都有。
在下一步的介绍之前,咱还是先说一下咱目前shader的几个原则:
1、使用shader的时候,绘制的内容、参考的背景(以及其他运算要用的图片)、还有绘制目标,一定都是等大的表面(surface);
2、除极少量的情况外,绘制目标一定是单独的表面;
3、如果涉及透明度方面运算,GM自己的混合模式(blend mode)一定是1,0(GMS2的gpu_set_blendmode_ext(bm_one,bm_zero);)
至于理由……
1、等大表面意味着在不同素材使用UV坐标不用转换;
2、以一个表面的数据运算后直接放回到这个表面,目前遇到的问题全都没有解决方案,而放到新表面上又完全没问题;
3、GM自带混色模式的锅,有必要的话单开一楼来解释
然后,如果想把东西传递到shader里,GML方面需要写的是
传递表面:texture_set_stage(shader_get_sampler_index(<shader名称>,"<shader里的接收名称>"),surface_get_texture(<表面名称>));
传递参数(实数形式):shader_set_uniform_f(shader_get_uniform(<shader名称>,"<shader里的接收名称>"),<变量或值>);
然后,shader里接收方面就是在fsh页里
接收表面:uniform sampler2D <接收名称>;
接收实数:uniform float <接收名称>;
直观一点,大概就是图片这样:
