Страница 1 из 1

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

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

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

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

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

Третий способ? может кто знает сталкивался и т.п.

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

СообщениеДобавлено: 30 ноя 2010, 18:50
Neodrop
Повесьте скрипт на камеру. В него этот код.
Прощай альфа :-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();
    }
 
 

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

СообщениеДобавлено: 30 ноя 2010, 19:36
Battle Angel Alita
Я ничего не поняла, но видимо ему как раз надо альфу в рендер-текстуре, а от прозрачные обьекты её не дают.
Если так, то это помоему то того, что во всех альфа-шейдерах стоит ColorMask RGB. Деже если это прямо не написано, компиллер сюрфейс-шейдеров сам добавляет эту строчку.

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

СообщениеДобавлено: 30 ноя 2010, 20:08
Neodrop
Дорогая Алита, у меня ну вовсе нет времени читать весь форум наискосок. Если выхватил не то, звиняйте - других бананов нема. :D

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

СообщениеДобавлено: 30 ноя 2010, 22:03
gnoblin
можно попробовать из скомпилированного шейдера ColorMask RGB выпилить,
т.к. шейдерлаб в асм не транслируется и найти должно быть просто :)

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

СообщениеДобавлено: 02 дек 2010, 15:13
Ichimitsu
На самом деле приведенный код он из примера использования OnPostRender
собственно он несколько для другого используется.

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

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

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

Иакие вот пертурбации, вопрос как это побороть и какими способами, шейдером ли, который карёжит текстуру отрендеренную как надо или же через SetReplacementShader или же еще как остается открытым.

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

СообщениеДобавлено: 02 дек 2010, 15:50
gnoblin
запостите плиз пример проекта с болваночной графикой чтобы проще было помогать :)

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

СообщениеДобавлено: 02 дек 2010, 17:50
Ichimitsu
в общем то как решить проблему придумал, осталось написать шейдер

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

т.е. есть текстура нужно в ней везде где ее цвет = _Color поставить альфу = 0, а в остальных случая поставить ее = 1