RenderToTexture и Background Color c 0 Альфой

Шейдеры и все-все-все.

RenderToTexture и Background Color c 0 Альфой

Сообщение Ichimitsu 30 ноя 2010, 17:01

В ходе девелопмента одно проекта, наткнулся на такую фичу (объяснение почему именно так - есть, но как побороть не понятно).
Фича следующая: при рендерениге в текстуру из камеры с Background Color = 0.0.0.0 (в целом не важно какой цвет, важно что Alpha = 0) объектов с Shader из области Transparent
происходит дикий микс Alpha каналов, в итоге объекты эти не отрисовываются, точнее отрисовываются с 0 альфой.
На объекты без альфы (в материале и в главное в текстуре) это не влияет, они рендерятся в виде маски в альфоканале.

Если в камере альфу поставить 1 то все нормально, но бэк в текстуре появляется нежелательный, поскольку текстура потом в GUI используется.

Теперь пытаюсь придумать способ как обойти.
Мегакривой - на основе RenderToTexture сделать Texture2D и заменять альфу через SetPixel по маске цвета (фактически убирать фон от камеры). Но я опасаюсь за производительность сего метода

Долгий и сложный это писать новый шейдер для SetReplacementShader в камере, которая рендерит собственно объект.

Третий способ? может кто знает сталкивался и т.п.
Аватара пользователя
Ichimitsu
UNец
 
Сообщения: 30
Зарегистрирован: 30 ноя 2010, 16:58
  • Сайт

Re: RenderToTexture и Background Color c 0 Альфой

Сообщение Neodrop 30 ноя 2010, 18:50

Повесьте скрипт на камеру. В него этот код.
Прощай альфа :-h

Синтаксис:
Используется csharp
private Material mat;

    void OnPostRender()
    {
        if (!mat)
        {
            mat = new Material("Shader \"Hidden/Alpha\" {" +
                "SubShader {" +
                "    Pass {" +
                "        ZTest Always Cull Off ZWrite Off" +
                "        ColorMask A" +
                "        Color (1,1,1,1)" +
                "    }" +
                "}" +
                "}"
            );
            mat.shader.hideFlags = HideFlags.HideAndDontSave;
            mat.hideFlags = HideFlags.HideAndDontSave;
        }
        GL.PushMatrix();
        GL.LoadOrtho();
        for (int i = 0; i < mat.passCount; ++i)
        {
            mat.SetPass(i);
            GL.Begin(GL.QUADS);
            GL.Vertex3(0, 0, 0.1f);
            GL.Vertex3(1, 0, 0.1f);
            GL.Vertex3(1, 1, 0.1f);
            GL.Vertex3(0, 1, 0.1f);
            GL.End();
        }
        GL.PopMatrix();
    }
 
 
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: RenderToTexture и Background Color c 0 Альфой

Сообщение Battle Angel Alita 30 ноя 2010, 19:36

Я ничего не поняла, но видимо ему как раз надо альфу в рендер-текстуре, а от прозрачные обьекты её не дают.
Если так, то это помоему то того, что во всех альфа-шейдерах стоит ColorMask RGB. Деже если это прямо не написано, компиллер сюрфейс-шейдеров сам добавляет эту строчку.
Мозг рака
Изображение
Аватара пользователя
Battle Angel Alita
UNIверсал
 
Сообщения: 476
Зарегистрирован: 25 ноя 2009, 14:52

Re: RenderToTexture и Background Color c 0 Альфой

Сообщение Neodrop 30 ноя 2010, 20:08

Дорогая Алита, у меня ну вовсе нет времени читать весь форум наискосок. Если выхватил не то, звиняйте - других бананов нема. :D
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: RenderToTexture и Background Color c 0 Альфой

Сообщение gnoblin 30 ноя 2010, 22:03

можно попробовать из скомпилированного шейдера ColorMask RGB выпилить,
т.к. шейдерлаб в асм не транслируется и найти должно быть просто :)
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: RenderToTexture и Background Color c 0 Альфой

Сообщение Ichimitsu 02 дек 2010, 15:13

На самом деле приведенный код он из примера использования OnPostRender
собственно он несколько для другого используется.

Наша задача другая, отрендерить меш в текстуру с маской по контуру меша.

Задача осложняется тем, что смешение альфы бэкколора и альфы из материала вида Transparent происходит достаточно криво

т.е. пример есть у нас меш Бошка Человечья и есть Волосы, Волосы свисают на лицо.
В обычном случае при рендеренге в буфер кадра, все просто, на Волосах лежит Transparent материал и сквозь него мы видим лицо.
При рендеренге в текстуру с бэкколор с 0 альфой получаем прозрачность насквозь, т.е. мы уже видим не лицо а что то там "ничего"
В этом и состоит проблема. Rсли бэкколор альфа не 0 то "ничего" сразу превращается в лицо.

Иакие вот пертурбации, вопрос как это побороть и какими способами, шейдером ли, который карёжит текстуру отрендеренную как надо или же через SetReplacementShader или же еще как остается открытым.
Аватара пользователя
Ichimitsu
UNец
 
Сообщения: 30
Зарегистрирован: 30 ноя 2010, 16:58
  • Сайт

Re: RenderToTexture и Background Color c 0 Альфой

Сообщение gnoblin 02 дек 2010, 15:50

запостите плиз пример проекта с болваночной графикой чтобы проще было помогать :)
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: RenderToTexture и Background Color c 0 Альфой

Сообщение Ichimitsu 02 дек 2010, 17:50

в общем то как решить проблему придумал, осталось написать шейдер

который по маске цвета делает альфу

т.е. есть текстура нужно в ней везде где ее цвет = _Color поставить альфу = 0, а в остальных случая поставить ее = 1
Аватара пользователя
Ichimitsu
UNец
 
Сообщения: 30
Зарегистрирован: 30 ноя 2010, 16:58
  • Сайт


Вернуться в Shader Lab

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2