Вопрос наверное больше по графике чем по юнити, не уверен.
Есть такой код
private Texture2D RT_Texture(Texture mainTexture) { Texture2D texture2D = new Texture2D( mainTexture.width, mainTexture.height, TextureFormat.ARGB32, false);//RGB24 RenderTexture currentRT = RenderTexture.active; RenderTexture renderTexture = new RenderTexture( mainTexture.width, mainTexture.height, 32); Graphics.Blit( mainTexture, renderTexture); RenderTexture.active = renderTexture; texture2D.ReadPixels( new Rect( 0, 0, renderTexture.width, renderTexture.height), 0, 0); texture2D.Apply( ); Color[] pixels = texture2D.GetPixels( ); RenderTexture.active = currentRT; return texture2D; }
В строке Texture2D texture2D = new Texture2D(mainTexture.width, mainTexture.height, TextureFormat.ARGB32, false);
Если ставлю RGB24 дифузка сохраняется нормально, если RGBA32 или ARGB32 то текстура какая то не такая, с прозрачностью.
Не пойму куда копать.
Используется примерно следующим образом
public void MeshToFile(Mesh m, Material[] mats, string filename, string model_folder) { //a filename is fullpath using ( StreamWriter sw = new StreamWriter( filename)) { sw.Write( MeshToString( m, mats)); } for ( int material = 0; material < m.subMeshCount; material++) { var tex = RT_Texture( mats[material].mainTexture); if ( tex) { byte[] texture_bytes = ImageConversion.EncodeToPNG( tex); File.WriteAllBytes( model_folder + @"\" + mats[material].mainTexture.name + ".png", texture_bytes); } else //log } }
Буква А в слове RGBA32 значит "alpha", это форматы с прозрачностью, не совсем понятно, чего ты ожидаешь. Ну залей всю альфу единицей:
RenderTexture.active = renderTexture; texture2D.ReadPixels(new Rect(0, 0, renderTexture.width, renderTexture.height), 0, 0); texture2D.Apply(); Color[] pixels = texture2D.GetPixels(); for(int i = 0; i < pixels.Length; i++) { pixels[i].a = 1.0f; } texture2D.SetPixels(); texture2D.Apply();
meekobold
> не совсем понятно, чего ты ожидаешь.
Спасибо.
Я сам не разобрался пока как это работает.
Мысли залить альфу единицей конечно были.
Можно было не переписывать альфу единицей, а сконвертировать в jpg, но там вроде 24 бита получилось, хотя настройки для этого я не менял.Хотя может и косякнул где то.Насколько я понял проблема была именно в PNG формате который конвертирует альфу в прозрачность и запекает это.
В общем закостылил код который трет альфу и делает две текстуры, одну RGBA32 с затёртой альфой, и одну с альфой в канале красного(не знаю как еще ее сохранить отдельно).
Нашел код для конвертации в TGA, в новых юнити он есть из коробки.В старых его нет.
Пока еще не проверял.
Тема в архиве.