Войти
ПрограммированиеФорумГрафика

Unity, Рендеринг в текстуру и ее сохранение

#0
14:05, 30 июня 2022

Вопрос наверное больше по графике чем по юнити, не уверен.
Есть такой код

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
            }
            
         }
#1
10:50, 1 июля 2022

Буква А в слове 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();
#2
13:19, 1 июля 2022

meekobold
> не совсем понятно, чего ты ожидаешь.
Спасибо.
Я сам не разобрался пока как это работает.
Мысли залить альфу единицей конечно были.

Можно было не переписывать альфу единицей, а сконвертировать в jpg, но там вроде 24 бита получилось, хотя настройки для этого я не менял.Хотя может и косякнул где то.Насколько я понял проблема была именно в PNG формате который конвертирует альфу в прозрачность и запекает это.
В общем закостылил код который трет альфу и делает две текстуры, одну RGBA32 с затёртой альфой, и одну с альфой в канале красного(не знаю как еще ее сохранить отдельно).
Нашел код для конвертации в TGA, в новых юнити он есть из коробки.В старых его нет.
Пока еще не проверял.

ПрограммированиеФорумГрафика

Тема в архиве.