ios 3.5.2 uv动画求助

  • Creator 版本: 3.5.2

  • 目标平台: iOS(16.0 iphone 13 pro max)

  • 之前哪个版本是正常的: Android或者web是正常的,ios异常

*使用的图片:miaozhunxian2

android正常的视频如下:androidOrWeb.zip (108.0 KB)

ios异常的视频如下:ios.mov.zip (2.1 MB)

图片是一张白色的很小的图片,上传之后有点看不见,见谅

ios 的分辨率需要2的次幂

感谢回复,我试试

不好意思,我试了下用了一张16*16的图片,还是不对。能麻烦在帮忙看下嘛,感谢
sprite的设置如下,


其中material的effect如下,

CCEffect %{
  techniques:
  - passes:
    - vert: sprite-vs:vert
      frag: sprite-fs:frag
      depthStencilState:
        depthTest: false
        depthWrite: false
      blendState:
        targets:
        - blend: true
          blendSrc: src_alpha
          blendDst: one_minus_src_alpha
          blendDstAlpha: one_minus_src_alpha
      rasterizerState:
        cullMode: none
      properties:
        time: { value: 0.0 }
        speed: { value: 5.0 }
        alphaThreshold: { value: 0.5 }
}%

CCProgram sprite-vs %{
  precision highp float;
  #include <cc-global>
  #if USE_LOCAL
    #include <cc-local>
  #endif
  #if SAMPLE_FROM_RT
    #include <common>
  #endif
  in vec3 a_position;
  in vec2 a_texCoord;
  in vec4 a_color;

  out vec4 color;
  out vec2 uv0;

  vec4 vert () {
    vec4 pos = vec4(a_position, 1);

    #if USE_LOCAL
      pos = cc_matWorld * pos;
    #endif

    #if USE_PIXEL_ALIGNMENT
      pos = cc_matView * pos;
      pos.xyz = floor(pos.xyz);
      pos = cc_matProj * pos;
    #else
      pos = cc_matViewProj * pos;
    #endif

    uv0 = a_texCoord;
    #if SAMPLE_FROM_RT
      CC_HANDLE_RT_SAMPLE_FLIP(uv0);
    #endif
    color = a_color;

    return pos;
  }
}%

CCProgram sprite-fs %{
  precision highp float;
  #include <embedded-alpha>
  #include <alpha-test>

  uniform Time {
    float time;
  };

  uniform SPEED {
    float speed;
  };
  in vec4 color;

  #if USE_TEXTURE
    in vec2 uv0;
    #pragma builtin(local)
    layout(set = 2, binding = 10) uniform sampler2D cc_spriteTexture;
  #endif

  vec4 frag () {
    vec4 o = vec4(1, 1, 1, 1);

    #if USE_TEXTURE
      vec2 uv = vec2(uv0.x, fract(uv0.y - time * speed));
      o *= CCSampleWithAlphaSeparated(cc_spriteTexture, uv);
      #if IS_GRAY
        float gray  = 0.2126 * o.r + 0.7152 * o.g + 0.0722 * o.b;
        o.r = o.g = o.b = gray;
      #endif
    #endif

    o *= color;
    ALPHA_TEST(o);
    return o;
  }
}%

脚本UIMove.ts如下所示,

import { Component, Material, Sprite, _decorator } from "cc";

const { ccclass, property } = _decorator;

@ccclass("UVMove")
export default class UVMove extends Component {
    private _time = 0
    private _material: Material;
    delta: number = 0.01;
    start() {
        this._time = 0;
        this._material = this.getComponent(Sprite).getMaterial(0);
    }

    update(dt) {
        this._time += this.delta;
        this._material.setProperty('time', this._time);
    }
}

2D的没遇到过

  1. 是尽量用内置的cc_time.x *speed,这样就不需要cpu在update里去算速度了
  2. 确保下图片的sprite没有没裁剪,设置custom
  3. 不用tiled试试,直接uv.x *tiling 设置呢

给个你的 demo ,可以看一下。

如果在 3.4.x 版本上,想用 sprite 的 tield 模式,如果你图片的尺寸和原图,扩大很多倍,是有报错的。报错的原因是和 合批的限制有关。
可以查看 2D 渲染组件合批说明 · Cocos Creator

比如你原图 2 * 2 ,使用了 tield 扩展之后,需要图片 5000 * 5000 就超过顶点最大限制,就会报错。可以适当改大 BATCHER2D_MEM_INCREMENT 数值。

感谢回复,之前一直有一个报错,像这样https://forum.cocos.org/t/topic/136955,根据解决办法改成了11,然后把这个功能单独拿出来新建了工程,然后在ios上是正常的,无论图片的原始尺寸是不是2次幂

根据您那个帖子的解决办法改成11,可以了,感谢感谢

感谢回复,之前一直有一个报错,像这样https://forum.cocos.org/t/topic/136955,根据解决办法改成了11,然后把这个功能单独拿出来新建了工程,然后在ios上是正常的,无论图片的原始尺寸是不是2次幂