Развитие игровой вспышки
Текущее время: Пт ноя 16, 2018 12:38 pm

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: Рендер дырки в текстуру
СообщениеДобавлено: Чт май 18, 2017 10:30 am 
Не в сети
Аватар пользователя

Зарегистрирован: Ср авг 05, 2009 6:42 pm
Сообщений: 577
Откуда: Санкт-Петербург
Medals: 1
People's Choice FGD2 (1)
Всем привет!

Помогите пожалуйста понять как мне отрендерить в текстуру дырку по форме заранее сделанной картинки?
Мне нужно использовать RenderTexture и специально обученный шейдер, назначенный на материал кисточки?


RenderTexture я совсем не понял как использовать. Я могу ее создать и она будет черной, могу назначить на материал в качестве текстуры. А что дальше?
Вроде бы я должен указать RenderTexture в качестве таргета, потом отрендерить что мне нужно в заранее созданную Texture2D, назначить текстуру в материал Renderer того объекта, который будет показывать результат и обнулить таргет, чтобы рендер сцены шел куда нужно.

Но я не понимаю роль RenderTexture и у меня не выходит сделать так, чтобы работало:)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Рендер дырки в текстуру
СообщениеДобавлено: Чт май 18, 2017 12:09 pm 
Не в сети
Аватар пользователя

Зарегистрирован: Ср ноя 09, 2016 4:17 pm
Сообщений: 13
Откуда: Харьков
Сохранить результат работы шейдера в RenderTexture можно с помощью
https://docs.unity3d.com/ScriptReference/Graphics.Blit.html
Код:
RenderTexture renderTexture = new RenderTexture(1920, 1080, 0);
Graphics.Blit(_sourceTexture,renderTexture, _material);


Нужно написать простой Transparent шейдер, который будет принимать на вход две текстуры и применять к первой текстуре значение альфы из второй.
Создать материал, применить к нему этот шейдер и подать как _material в Graphics.Blit

В renderTexture будет сохранен результат работы шейдера, его можно будет использовать для вывода на экран
Код:
_drawResultImageComponent.texture= renderTexture;


Вложения:
cutResult.png
cutResult.png [ 505.46 KIB | Просмотров: 1832 ]
Вернуться наверх
 Профиль Отправить e-mail  
 
 Заголовок сообщения: Re: Рендер дырки в текстуру
СообщениеДобавлено: Сб май 20, 2017 12:05 am 
Не в сети
Аватар пользователя

Зарегистрирован: Ср авг 05, 2009 6:42 pm
Сообщений: 577
Откуда: Санкт-Петербург
Medals: 1
People's Choice FGD2 (1)
Спасибо, alexnown!

Пробую разобраться, но не получается даже самые простые вещи сделать:)
Помогите понять?

1) Сделал RawImage. Как я понял только в этот тип картинки можно назначить RenderTexture
2) Назначил на объект скрипт, который в Start выполняет следующий код:
Код:
        RectTransform rt = (RectTransform)gameObject.transform;
        RenderTexture renderTexture = new RenderTexture((int)rt.rect.width, (int)rt.rect.height, 0);
        Material mat = new Material(Shader.Find("Custom/Test"));
        mat.SetTexture("_MainTex", texture1);

        RenderTexture.active = renderTexture;

        Graphics.Blit(texture1, renderTexture, mat);

        RenderTexture.active = null;

        RawImage rim = gameObject.GetComponent<RawImage>();
        rim.texture = renderTexture;


texture1 - публичная переменная типа Texture2D, куда я перетащил картинку из папки с игрой.
Моя цель номер один - чтобы шейдер отобразил texture1 без изменений в renderTexture, и чтобы я увидел этот результат.

код шейдера:
Код:
Shader "Custom/Test"
  {
    Properties
    {
      _MainTex ("Texture (RGB)", 2D) = "white" {}
    }
    SubShader {
      Tags { "RenderType" = "Opaque" }
      Cull Off
      CGPROGRAM
      //if you're not planning on using shadows, remove "addshadow" for better performance
      #pragma surface surf Lambert
      struct Input {
          float2 uv_MainTex;
      };
      sampler2D _MainTex;
      void surf (Input IN, inout SurfaceOutput o)
      {
            float4 tex = tex2D (_MainTex, IN.uv_MainTex);

           o.Albedo = tex.rgb;
      }
      ENDCG
    }
    Fallback "Diffuse"
  }


Ошибок нет, но после запуска картинка становится пустой.
Что не так?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Рендер дырки в текстуру
СообщениеДобавлено: Сб май 20, 2017 9:38 am 
Не в сети
Аватар пользователя

Зарегистрирован: Ср авг 05, 2009 6:42 pm
Сообщений: 577
Откуда: Санкт-Петербург
Medals: 1
People's Choice FGD2 (1)
Если просто назначить этот шейдер на картинку, то в сцене картинка выглядит затемненной, а в игре абсолютно черный квадрат.
Почему?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Рендер дырки в текстуру
СообщениеДобавлено: Сб май 20, 2017 12:36 pm 
Не в сети
Аватар пользователя

Зарегистрирован: Ср ноя 09, 2016 4:17 pm
Сообщений: 13
Откуда: Харьков
Vogd писал(а):
Если просто назначить этот шейдер на картинку, то в сцене картинка выглядит затемненной, а в игре абсолютно черный квадрат.
Почему?

Потому что твой шейдер учитывает освещение.
Чтоб работало, можно создать Unlit шейдер:
Код:
Shader "Image/CutTexture"
{
   Properties
   {
      _MainTex ("Texture", 2D) = "white" {}
       _CutFormTex("Texture", 2D) = "white" {}
   }
   SubShader
   {
      Tags{ "Queue" = "Transparent" }

      LOD 100
      Blend SrcAlpha OneMinusSrcAlpha

      Pass
      {
         CGPROGRAM
         #pragma vertex vert
         #pragma fragment frag
         
         #include "UnityCG.cginc"

         struct appdata
         {
            float4 vertex : POSITION;
            float2 uv : TEXCOORD0;
         };

         struct v2f
         {
            float2 uv : TEXCOORD0;
            float4 vertex : SV_POSITION;
         };

         v2f vert (appdata v)
         {
            v2f o;
            o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
            o.uv = v.uv;
            return o;
         }
         
         sampler2D _MainTex;
         sampler2D _CutFormTex;

         fixed4 frag (v2f i) : SV_Target
         {
            fixed4 col = tex2D(_MainTex, i.uv);
            fixed4 cutFormText = tex2D(_CutFormTex, i.uv);
            col.a = cutFormText.a;
            return col;
         }
         ENDCG
      }
   }
}


Вернуться наверх
 Профиль Отправить e-mail  
 
 Заголовок сообщения: Re: Рендер дырки в текстуру
СообщениеДобавлено: Сб май 20, 2017 6:39 pm 
Не в сети
Аватар пользователя

Зарегистрирован: Ср авг 05, 2009 6:42 pm
Сообщений: 577
Откуда: Санкт-Петербург
Medals: 1
People's Choice FGD2 (1)
alexnown спасибо снова!

Я правильно понял, что имено строчка
#pragma surface surf Lambert
задавала то, каким образом будет работать шейдер и что там будет учитываться - освещение и прочее, да?

Я не смог понять что делает строка
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);

И что значит
: SV_Target

У меня получилось использовать этот шейдер чтобы рисовать дырку в нужном мне месте, но теперь я не понимаю как мне нарисовать еще одну дырку рядом:)
Я создал еще одну текстуру RenderTexture и отрендерил в нее, использовав предыдущий результат как текстуру на входе.
Получилось нормально, но я не уверен что это правильно.
Так и нужно делать - чередовать текстуры, или все же можно обойтись одной и отрендерить в текстуру имея на входе ту же текстуру? Или это физически невозможно?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Рендер дырки в текстуру
СообщениеДобавлено: Вс май 21, 2017 10:12 pm 
Не в сети
Аватар пользователя

Зарегистрирован: Ср ноя 09, 2016 4:17 pm
Сообщений: 13
Откуда: Харьков
Vogd писал(а):
Я правильно понял, что имено строчка
#pragma surface surf Lambert
задавала то, каким образом будет работать шейдер и что там будет учитываться - освещение и прочее, да?

Эта строчка определяет какой алгоритм освещения будет использоваться.
Вообще советую почитать как реализованы surface шейдеры в unity, в этой серии статей хорошо рассказано про особенности разных light model и отличие surface от vertex&fragment шейдеров: http://www.alanzucconi.com/2015/06/17/surface-shaders-in-unity3d/

Vogd писал(а):
Я не смог понять что делает строка
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);

умножение на mvp матрицу, с помощью нее позиция вертекса пересчитывается из мировых координат в позицию на экране, подробнее это есть в 4 части статьи
Vogd писал(а):
И что значит
: SV_Target

Фрагментный шейдер возвращает цвет для каждого пикселя, если заменить SV_Target на COLOR, тоже будет работать

Vogd писал(а):
У меня получилось использовать этот шейдер чтобы рисовать дырку в нужном мне месте, но теперь я не понимаю как мне нарисовать еще одну дырку рядом:)
Я создал еще одну текстуру RenderTexture и отрендерил в нее, использовав предыдущий результат как текстуру на входе.
Получилось нормально, но я не уверен что это правильно.
Так и нужно делать - чередовать текстуры, или все же можно обойтись одной и отрендерить в текстуру имея на входе ту же текстуру? Или это физически невозможно?

С рендером в RenderTexture нужно быть осторожным. Возможно, нужно использовать текстуру для вырезания уже с двумя дырками, или изменить шейдер так, чтоб он принимал на вход не две, а более текстур дырок и добавлять их текстуры по мере необходимости. Тут сложно сказать, не зная что именно нужно получить в итоге:)


Вернуться наверх
 Профиль Отправить e-mail  
 
 Заголовок сообщения: Re: Рендер дырки в текстуру
СообщениеДобавлено: Чт май 25, 2017 4:17 am 
Не в сети
Аватар пользователя

Зарегистрирован: Ср авг 05, 2009 6:42 pm
Сообщений: 577
Откуда: Санкт-Петербург
Medals: 1
People's Choice FGD2 (1)
alexnown, спасибо!
Моя цель - сделать чтобы игрок мог стирать защитный слой с лотерейного билетика водя мышкой.


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на форуме

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB