Страница 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
Повесьте скрипт на камеру. В него этот код.
Прощай альфа
Используется 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
Дорогая Алита, у меня ну вовсе нет времени читать весь форум наискосок. Если выхватил не то, звиняйте - других бананов нема.
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