Javascript 在unity中加载www图像时出现js压缩问题

Javascript 在unity中加载www图像时出现js压缩问题,javascript,unity3d,Javascript,Unity3d,当我试图从服务器导入图像(到unity中)时,我遇到了一个压缩问题 我在unity内的resources文件夹中有一个名为“glass”的jpg图像,我希望在运行时将此图像替换为服务器上的图像。我找到了这个用于导入图像的脚本,并将其分配给了我的“玻璃”图像 唯一的问题是图像的压缩是(NPOT)RGBA压缩的DXT5,而链接中的代码表示jpg被压缩为DXT1 你们谁能告诉我我做错了什么 #pragma strict // random url link from google //

当我试图从服务器导入图像(到unity中)时,我遇到了一个压缩问题

我在unity内的resources文件夹中有一个名为“glass”的jpg图像,我希望在运行时将此图像替换为服务器上的图像。我找到了这个用于导入图像的脚本,并将其分配给了我的“玻璃”图像

唯一的问题是图像的压缩是(NPOT)RGBA压缩的DXT5,而链接中的代码表示jpg被压缩为DXT1

你们谁能告诉我我做错了什么

#pragma strict
    // random url link from google
    // and DXT compress them at runtime
    var url = "https://i.ytimg.com/vi/yaqe1qesQ8c/maxresdefault.jpg";

    function Start () {
        // Create a texture in DXT1 format
        GetComponent.<Renderer>().material.mainTexture = new Texture2D(4, 4, TextureFormat.DXT1, false);
        while(true) {
            // Start a download of the given URL
            var www = new WWW(url);

            // wait until the download is done
            yield www;

            var Texture_1: Texture2D;
            Texture_1 = Resources.Load("glass");

            // assign the downloaded image to the main texture of the object
            www.LoadImageIntoTexture(Texture_1);
        }
    }
#pragma strict
//来自谷歌的随机url链接
//DXT在运行时压缩它们
变量url=”https://i.ytimg.com/vi/yaqe1qesQ8c/maxresdefault.jpg";
函数启动(){
//以DXT1格式创建纹理
GetComponent.(.material.mainTexture=新纹理2D(4,4,TextureFormat.DXT1,false);
while(true){
//开始下载给定的URL
var www=新的www(url);
//等待下载完成
产生www;
var-Texture_1:Texture2D;
纹理_1=Resources.Load(“玻璃”);
//将下载的图像指定给对象的主纹理
www.LoadImageIntoTexture(Texture_1);
}
}

我运行了一些测试,在我看来它像一个Unity bug

与文档相矛盾的是,在LoadImageIntoTexture之前,纹理格式是什么并不重要,如果纹理被压缩,它总是DXT5

发生的情况如下:

  • 如果将图像加载到以前未压缩的纹理(例如RGB24),则生成的格式为未压缩的RGB24或ARGB32(取决于图像是否包含alpha通道)
  • 如果将图像加载到先前压缩的纹理中,结果将是使用DXT5压缩的纹理。图像是否具有alpha通道并不重要
  • 如果使用www.texture而不是www.LoadImageIntoTexture,则结果始终为未压缩纹理(RGB24或ARGB32)
  • 在未压缩的纹理上手动调用Texture.Compress()可以提供正确的格式(DXT1或DXT5,具体取决于alpha通道)
无论如何,这里有一个解决方法:不使用

 www.LoadImageIntoTexture(Texture_1);
使用

结果将是JPG的DXT1或PNG的DTX5,应该是这样


另外,这不是JS独有的,在C#中也会发生。

我运行了一些测试,对我来说它看起来像一个Unity bug

与文档相矛盾的是,在LoadImageIntoTexture之前,纹理格式是什么并不重要,如果纹理被压缩,它总是DXT5

发生的情况如下:

  • 如果将图像加载到以前未压缩的纹理(例如RGB24),则生成的格式为未压缩的RGB24或ARGB32(取决于图像是否包含alpha通道)
  • 如果将图像加载到先前压缩的纹理中,结果将是使用DXT5压缩的纹理。图像是否具有alpha通道并不重要
  • 如果使用www.texture而不是www.LoadImageIntoTexture,则结果始终为未压缩纹理(RGB24或ARGB32)
  • 在未压缩的纹理上手动调用Texture.Compress()可以提供正确的格式(DXT1或DXT5,具体取决于alpha通道)
无论如何,这里有一个解决方法:不使用

 www.LoadImageIntoTexture(Texture_1);
使用

结果将是JPG的DXT1或PNG的DTX5,应该是这样


另外,这不是JS独有的,在C#中也会发生。

DXT5有什么问题?问题是什么?你有错误日志吗?或者图像只是没有显示?你好,尼卡,图像显示在inspector中,但在assets文件夹中以及作为纹理添加到游戏对象时,图像保持黑色。其次,我想以这种方式添加更多图像,其中一些图像被添加到cubemap/skybox中。我得到一个警告,alpha使图像与hdr不兼容。我还发现JS将其转换为dxt5很奇怪。这意味着代码无法以某种方式工作,如果我想在项目中更改压缩(无论出于何种原因),那么我不能使用此代码。谢谢你的回复!我认为这是一个服务器端问题。尝试在服务器上以png格式上载图像。或者查看服务器设置。通常的做法是以压缩格式提供文件(有时会像您的情况那样覆盖压缩)。如果您有权访问服务器管理,请尝试更改提供文件的压缩。(我不是后端专家,但我也遇到过类似的情况,服务器调整解决了这个问题)我尝试上传png,但得到了相同的dxt5压缩。但是如果你上传一个png,它应该是dxt5,对吗?我也不是后端专家,但我不认为服务器正在压缩文件,因为我可以在没有压缩问题的情况下下载它们。DXT5有什么问题?问题是什么?你有错误日志吗?或者图像只是没有显示?你好,尼卡,图像显示在inspector中,但在assets文件夹中以及作为纹理添加到游戏对象时,图像保持黑色。其次,我想以这种方式添加更多图像,其中一些图像被添加到cubemap/skybox中。我得到一个警告,alpha使图像与hdr不兼容。我还发现JS将其转换为dxt5很奇怪。这意味着代码无法以某种方式工作,如果我想在项目中更改压缩(无论出于何种原因),那么我不能使用此代码。谢谢你的回复!我认为这是一个服务器端问题。尝试在服务器上以png格式上载图像。或者查看服务器设置。通常的做法是以压缩格式提供文件(有时会像您的情况那样覆盖压缩)。如果您有权访问服务器管理,请尝试更改提供文件的压缩。(我不是后端专家