You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity运行时创建的Texture2D在WebGL端无法用于显示与顶点位移问题

问题解决方案

你遇到的是Unity WebGL构建特有的运行时纹理操作限制,以下是可直接验证的修复方向:

  • 修改texture.Apply()调用参数
    Unity提供的无参Apply()方法等价于执行Apply(true, true),第二个参数makeNoLongerReadable设为true时,会在上传纹理到GPU后直接释放CPU侧的像素缓存。WebGL平台对该参数的处理比编辑器/Windows端更严格,后续调用SetPixel时会因为没有CPU侧缓存直接静默失败。
    把更新纹理的代码改成如下即可:
    texture.SetPixel(pixelUV.x, pixelUV.y, new Color(value, value, value, value));
    // 第二个参数设为false,保留CPU侧像素数据允许后续修改
    texture.Apply(true, false);
    
  • 避免Shader变体被打包剥离
    你是运行时才给材质赋值_TexDYN纹理,Unity打包时默认会检测不到该纹理的使用,自动剥离掉对应采样逻辑的Shader变体,导致WebGL端无法正常采样纹理。
    操作步骤:打开Edit > Project Settings > Graphics,找到Preloaded Shaders列表,把你MeshRenderer和RawImage用到的Shader添加到列表中,重新打包测试即可。
  • 边界合法性校验
    WebGL对纹理操作的边界检查更严格,SetPixel传入的坐标必须是0到textureSize-1之间的整数,如果你的pixelUV是0-1范围的UV值,需要先做转换:
    int x = Mathf.Clamp(Mathf.FloorToInt(pixelUV.x * textureSize), 0, textureSize - 1);
    int y = Mathf.Clamp(Mathf.FloorToInt(pixelUV.y * textureSize), 0, textureSize - 1);
    texture.SetPixel(x, y, new Color(value, value, value, value));
    
    编辑器和Windows端对越界操作做了兼容处理,不会触发异常,但WebGL端会直接丢弃越界的像素修改请求。
  • 格式兼容性兜底
    如果你确实需要使用Alpha8格式,可以在创建纹理后主动初始化所有像素值,避免浏览器默认值导致的透明不可见问题:
    texture = new Texture2D(textureSize, textureSize, TextureFormat.Alpha8, true);
    // 初始化所有像素为不透明白色
    Color[] initColors = new Color[textureSize * textureSize];
    for (int i = 0; i < initColors.Length; i++)
    {
        initColors[i] = Color.white;
    }
    texture.SetPixels(initColors);
    texture.Apply(true, false);
    

内容的提问来源于stack exchange,提问作者o-tone

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 14:39:02