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值,需要先做转换:
编辑器和Windows端对越界操作做了兼容处理,不会触发异常,但WebGL端会直接丢弃越界的像素修改请求。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)); - 格式兼容性兜底
如果你确实需要使用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
相关产品推荐
相关产品推荐

