123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- Component({
- properties: {
- },
- data: {
- },
- methods: {
- handleReady({detail}) {
- const xrFrameSystem = wx.getXrFrameSystem()
- const createFrameEffect = (scene) => {
- const xrFrameSystem = wx.getXrFrameSystem()
- return scene.createEffect({
- name: 'frame-effect',
- properties: [
- {
- key: 'columCount',
- type: xrFrameSystem.EUniformType.FLOAT,
- default: 1
- },
- {
- key: 'rowCount',
- type: xrFrameSystem.EUniformType.FLOAT,
- default: 1
- },
- {
- key: 'during',
- type: xrFrameSystem.EUniformType.FLOAT,
- default: 1
- }
- ],
- images: [
- {
- key: 'u_baseColorMap',
- default: 'white',
- macro: 'WX_USE_BASECOLORMAP'
- }
- ],
- // 透明物体需要大于`2500`!
- defaultRenderQueue: 2501,
- passes: [
- {
- renderStates: {
- blendOn: false,
- depthWrite: true,
- cullOn: false,
- // 基础库 v3.0.1 开始 默认的 plane 切为适配 cw 的顶点绕序
- },
- lightMode: 'ForwardBase',
- useMaterialRenderStates: true,
- shaders: [0, 1]
- }
- ],
- shaders: [`#version 100
- precision highp float;
- precision highp int;
-
- attribute vec3 a_position;
- attribute highp vec2 a_texCoord;
-
- uniform mat4 u_view;
- uniform mat4 u_projection;
- uniform mat4 u_world;
- varying highp vec2 v_uv;
- void main()
- {
- v_uv = a_texCoord;
- gl_Position = u_projection * u_view * u_world * vec4(a_position, 1.0);
- }`,
- // float 使用 highp 保证精度
- `#version 100
- precision highp float;
- precision highp int;
- uniform sampler2D u_baseColorMap;
- uniform highp float u_gameTime;
- uniform highp float rowCount;
- uniform highp float columCount;
- uniform highp float during;
- varying highp vec2 v_uv;
- void main()
- {
- float loopTime = mod(u_gameTime, during);
- float tickPerFrame = during / (columCount * rowCount);
-
- float columTick = mod(floor(loopTime / tickPerFrame), columCount);
- float rowTick = floor(loopTime / tickPerFrame / columCount);
- vec2 texCoord = vec2(v_uv.x / columCount + (1.0 / columCount) * columTick , v_uv.y / rowCount + (1.0 / rowCount) * rowTick);
- vec4 color = texture2D(u_baseColorMap, texCoord);
- gl_FragColor = color;
- }`
- ],
- });
- }
- console.log('序列帧特效加载')
- xrFrameSystem.registerEffect('frame-effect', createFrameEffect)
- const xrScene = this.scene = detail.value;
- this.loadAsset()
- },
- async loadAsset(){
- const xrFrameSystem = wx.getXrFrameSystem();
- const xrScene = this.scene;
- const shadowRoot = xrScene.getElementById("shadow-root");
- await xrScene.assets.loadAsset({type: 'texture', assetId: 'frame', src: 'https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/sprite-frames.png'})
- // 第一个参数是效果实例的引用,第二个参数是默认`uniforms`
- const frameMaterial = xrScene.createMaterial(
- // 使用定制的效果
- xrScene.assets.getAsset('effect', 'frame-effect'),
- {u_baseColorMap: xrScene.assets.getAsset('texture', 'frame')}
- );
-
- // 可以将其添加到资源系统中备用
- xrScene.assets.addAsset('material', 'frame-effect', frameMaterial);
- const meshElement = xrScene.getElementById("animation-mesh").getComponent(xrFrameSystem.Mesh);
- frameMaterial.setFloat('columCount', 4);
- frameMaterial.setFloat('rowCount', 32);
- frameMaterial.setFloat('during', 2);
- frameMaterial.alphaMode = "BLEND";
- meshElement.material = frameMaterial
- },
- }
- })
|