Particles/Additive + RenderToTexture

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

Particles/Additive + RenderToTexture

Сообщение Shock 13 янв 2017, 23:35

Привет, ребята. Есть ParticleEmitter со стандартным шейдром Particles/Additive и камера, которая рендерить все это в текстуру с прозрачным фоном.
Поверх объектоов партиклы рендерятся корректно, а поверх прозрачной части текстуры - не рендерятся вообще.
Подскажите, как можно отрендерить партиклы на прозрачную текстуру?
Аватара пользователя
Shock
UNIт
 
Сообщения: 77
Зарегистрирован: 10 окт 2016, 18:22

Re: Particles/Additive + RenderToTexture

Сообщение jetyb 16 янв 2017, 09:00

Никак.
Потому что прозрачных текстур как и "прозрачных частей текстур" не бывает. (popcorn1)
jetyb
Адепт
 
Сообщения: 1486
Зарегистрирован: 31 окт 2011, 17:21

Re: Particles/Additive + RenderToTexture

Сообщение Shock 17 янв 2017, 02:05

Ваше замечание было бы очень грустным, если бы было истинным. Формат РендерТекстуры по-умолчанию - ARGB32, 8 бит на альфаканал.

Смотрите, я для эксперимента создал такую сцену:
2017-01-17 00_54_29-Unity Personal (64bit) - Untitled - TestProj - PC, Mac & Linux Standalone_ _DX11.png


CubeAtBackground и Canvas находятся на слоях, которые рендерятся "Main Camera"

SphereOnTexture и ParticleSystemOnTexture находятся на отдельном слое, который рендерит только "Texture Camera"

"Texture Camera" я присвоил такой короткий скрипт, а в качестве цели указал RawImage. То есть теперь "Texture Camera" рендерит в RenderTexture, которая присвоена RawImage, которая рендерит MainCamera:
Синтаксис:
Используется csharp
using UnityEngine;
using UnityEngine.UI;

public class CameraToRawImage : MonoBehaviour {
       
        public RawImage targetImage;

        public void Start ()
        {
                var texture = new RenderTexture(Screen.width, Screen.height, 24);
                GetComponent<Camera>().targetTexture = texture;
                targetImage.texture = texture;
        }
}
 


Теперь самое интересное. Если в редакторе TextureCamera поставить ClearFlags=SolidColor и Background=Black, то получим ожидаемый результат - у текстуры черный фон, она на весь экран, Сфера и Частички отрендерились корректно, текст отрендерился поверх текстуры:
ResultSolid.png


Если же TextureCamera в качестве Background использовать прозрачный цвет (а=0), то мячик рендерится корректно, а частички рендерятся только поверх мячика, но не там, где у текстуры a=0
ResultTransp.png


То есть текстура рендерится корректно, альфаканал у нее есть, но шейдер частичек написан так, что поверх прозрачных областей они не рендерятся.
У вас нет доступа для просмотра вложений в этом сообщении.
Аватара пользователя
Shock
UNIт
 
Сообщения: 77
Зарегистрирован: 10 окт 2016, 18:22

Re: Particles/Additive + RenderToTexture

Сообщение kripto289 17 янв 2017, 20:03

Shock писал(а):Ваше замечание было бы очень грустным, если бы было истинным. Формат РендерТекстуры по-умолчанию - ARGB32, 8 бит на альфаканал.

Смотрите, я для эксперимента создал такую сцену:
2017-01-17 00_54_29-Unity Personal (64bit) - Untitled - TestProj - PC, Mac & Linux Standalone_ _DX11.png


CubeAtBackground и Canvas находятся на слоях, которые рендерятся "Main Camera"

SphereOnTexture и ParticleSystemOnTexture находятся на отдельном слое, который рендерит только "Texture Camera"

"Texture Camera" я присвоил такой короткий скрипт, а в качестве цели указал RawImage. То есть теперь "Texture Camera" рендерит в RenderTexture, которая присвоена RawImage, которая рендерит MainCamera:
Синтаксис:
Используется csharp
using UnityEngine;
using UnityEngine.UI;

public class CameraToRawImage : MonoBehaviour {
       
        public RawImage targetImage;

        public void Start ()
        {
                var texture = new RenderTexture(Screen.width, Screen.height, 24);
                GetComponent<Camera>().targetTexture = texture;
                targetImage.texture = texture;
        }
}
 


Теперь самое интересное. Если в редакторе TextureCamera поставить ClearFlags=SolidColor и Background=Black, то получим ожидаемый результат - у текстуры черный фон, она на весь экран, Сфера и Частички отрендерились корректно, текст отрендерился поверх текстуры:
ResultSolid.png


Если же TextureCamera в качестве Background использовать прозрачный цвет (а=0), то мячик рендерится корректно, а частички рендерятся только поверх мячика, но не там, где у текстуры a=0
ResultTransp.png


То есть текстура рендерится корректно, альфаканал у нее есть, но шейдер частичек написан так, что поверх прозрачных областей они не рендерятся.

У меня несколько предположений.
Самое первое - юнити кусок забагованной херни. Конкретно сейчас, у меня проблема, которую я решаю 2-ой день. Создаю в инспекторе дополнительную камеру, которая игнорирует opaque геометрию только когда выставлено небо. (для android билда, а для пк всё нормально). То есть проблема не в моих руках уж точно.
Первое, у частиц юнити в шейдере юзается "ColorMask RGB". То есть альфа отбрасывается. Попробуйте написать шейдер без этого тега.
Второе, попробуйте поменять у материала частиц очередь отрисовки.
Попробуйте юзать Standard шейдер с прозрачностью.
Попробуйте написать свой шейдер с тегом ZTest Always/ZTest Off
Полагаю вы хотите даунскейлить разрешение прозрачных частей рендера? Почему не подходит вариант с solid цветом и дальнейшей заливкой текстуры на экран с помощью аддитивного шейдера? (который как раз игнорирует чёрный цвет)

jetyb писал(а):Никак.
Потому что прозрачных текстур как и "прозрачных частей текстур" не бывает. (popcorn1)

Текстуры бывают. https://forum.unity3d.com/threads/rende ... post-23778
Render texture alpha contains whatever is rendered into alpha. So if you make sure all your objects render "white" into alpha, then you get white. Alternatively, you could render a full-screen quad with a shader that writes only to alpha channel. Sort of an image effect that doesn't do anything interesting, just sets alpha to white everywhere.

Ежели вы имели ввиду, что рендер камеры в текстуру не пишет в альфа канал? То да.
Аватара пользователя
kripto289
UNIверсал
 
Сообщения: 476
Зарегистрирован: 30 сен 2013, 03:30
Откуда: Екатеринбург
  • Сайт

Re: Particles/Additive + RenderToTexture

Сообщение waruiyume 17 янв 2017, 20:53

Частицы не пишут в альфу, а шейдер, который используется по умолчанию, для отрисовки RawImage использует альфаблендинг.
Ежели вы имели ввиду, что рендер камеры в текстуру не пишет в альфа канал? То да.

А это откуда в альфаканале появилось тогда?
https://yadi.sk/i/UmfWD-nG39WNQL
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Particles/Additive + RenderToTexture

Сообщение Shock 17 янв 2017, 21:31

Первое, у частиц юнити в шейдере юзается "ColorMask RGB". То есть альфа отбрасывается. Попробуйте написать шейдер без этого тега.

Вы мой кумир =) Спасибо огромное, это именно то, что работало некорректно

Полагаю вы хотите даунскейлить разрешение прозрачных частей рендера? Почему не подходит вариант с solid цветом и дальнейшей заливкой текстуры на экран с помощью аддитивного шейдера? (который как раз игнорирует чёрный цвет)

Даунскейлить вроде не хочу. Рендер в текстуру мне нужен, чтобы часть сцены появлялась плавно (fade-in - fade-out), а там есть не только партиклы, но и черные куски, которые должны остаться черными.

Может есть более хороший способ сделать fade-in кроме отрисовки в текстуру. Я знаю про material.a, но он мне не подходит - у меня не один объект, а множество и они видны друг сквозь друга, а должны быть цельными.

Есть еще какая возможность сделать определенной камере типа опасити?
Аватара пользователя
Shock
UNIт
 
Сообщения: 77
Зарегистрирован: 10 окт 2016, 18:22

Re: Particles/Additive + RenderToTexture

Сообщение kripto289 17 янв 2017, 23:54

Shock писал(а):
Полагаю вы хотите даунскейлить разрешение прозрачных частей рендера? Почему не подходит вариант с solid цветом и дальнейшей заливкой текстуры на экран с помощью аддитивного шейдера? (который как раз игнорирует чёрный цвет)

Даунскейлить вроде не хочу. Рендер в текстуру мне нужен, чтобы часть сцены появлялась плавно (fade-in - fade-out), а там есть не только партиклы, но и черные куски, которые должны остаться черными.

Может есть более хороший способ сделать fade-in кроме отрисовки в текстуру. Я знаю про material.a, но он мне не подходит - у меня не один объект, а множество и они видны друг сквозь друга, а должны быть цельными.

Есть еще какая возможность сделать определенной камере типа опасити?

Можно получить список всех объектов с определённым слоем, затем для каждой системы частиц сделать затухание
public bool FadeStatus;
public float ColorFadeSpeed;
...
foreach(var go in gameObjects)
{
ps = go.GetComponent<ParticleSystem>();
var color = ps.startColor;
if(FadeStatus) color.a -= Time.deltaTime * colorFadeSpeed;
else color.a += Time.deltaTime * colorFadeSpeed;
ps.startColor = color;
}
Правда если вы дополнительно юзайте геометрию всякую, то в таком случае ещё дополнительно можно получить все объекты, пройтись по вершинкам и записать прозрачность в вершины.
Но будет дикий оверхед на перезапись, если будет много геометрии, порядка сотни тысяч прозрачных треугольников. А ежели пару десятков тысяч, то нормально.
Аватара пользователя
kripto289
UNIверсал
 
Сообщения: 476
Зарегистрирован: 30 сен 2013, 03:30
Откуда: Екатеринбург
  • Сайт

Re: Particles/Additive + RenderToTexture

Сообщение kripto289 17 янв 2017, 23:56

waruiyume писал(а):Частицы не пишут в альфу, а шейдер, который используется по умолчанию, для отрисовки RawImage использует альфаблендинг.
Ежели вы имели ввиду, что рендер камеры в текстуру не пишет в альфа канал? То да.

А это откуда в альфаканале появилось тогда?
https://yadi.sk/i/UmfWD-nG39WNQL

На этом же форуме, кто-то говорил что камера не пишет в альфу за ненадобностью. Я ещё подумал что логично, есть clearFlag который заливает картинку всегда чем-нибудь. Было давно, могу ошибаться :-B
Аватара пользователя
kripto289
UNIверсал
 
Сообщения: 476
Зарегистрирован: 30 сен 2013, 03:30
Откуда: Екатеринбург
  • Сайт

Re: Particles/Additive + RenderToTexture

Сообщение Shock 18 янв 2017, 01:48

Правда если вы дополнительно юзайте геометрию всякую, то в таком случае ещё дополнительно можно получить все объекты, пройтись по вершинкам и записать прозрачность в вершины.
Но будет дикий оверхед на перезапись, если будет много геометрии, порядка сотни тысяч прозрачных треугольников. А ежели пару десятков тысяч, то нормально.

У меня около 200 000 трехугольников (в режиме Opaque). Я сейчас рендерю их в текстуру, а потом текстуру с необходимой полупрозрачностью вывожу основной камерой.
Аватара пользователя
Shock
UNIт
 
Сообщения: 77
Зарегистрирован: 10 окт 2016, 18:22


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

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

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