我们想在使用pixi的时候,使用自己写的shader。
之前尝试过两种方式实现。
自己实现了一个Renderer,然后使用自己实现的renderer进行render。
使用Mesh。
第一种方式,有些复杂,如果不是特别需要的话还是简单一点好。
第二种方式要自己处理顶点数据,索引数据等等。也比较麻烦。
我们想要使用PIXI.Sprite的功能,只是重写一下片段着色器。
最近发现BatchPluginFactory可以满足需求。
官网demo如下:
const fragment = `
varying vec2 vTextureCoord;
varying vec4 vColor;
varying float vTextureId;
uniform sampler2D uSamplers[%count%];
void main(void){
vec4 color;
%forloop%
gl_FragColor = vColor * vec4(color.a - color.rgb, color.a);
}
`;
const InvertBatchRenderer = PIXI.BatchPluginFactory.create({ fragment });
PIXI.Renderer.registerPlugin('invert', InvertBatchRenderer);
const sprite = new PIXI.Sprite();
sprite.pluginName = 'invert';%count%和%forloop%必须有,创建shader的时候会自动替换成官方指定的代码(有兴趣可以查看)。
PIXI默认是支持同时传入多个Texture的,本身是为了提高效率,但是我们可以利用它来做一些其它操作,这里先不展开。
这里有一个坑:使用PIXI.Renderer.registerPlugin注册插件必须在创建Application之前,否则无效,因为在获取webgl的上下文之后,contextChange的时候会创建Shader,如果是在创建Application之后,就需要手动去注册(创建实例,调用contextChange)了。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。