Шейдеры и TEXCOORD

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Шейдеры и TEXCOORD

Сообщение BornFoRdeatH 16 апр 2013, 22:18

В общем в шейдерах я полный нуб, пишу на сколько хватает соображалки.
Вот приплыл к такой проблемке, не смертельной но хотелось бы решить.

Значит что у меня получается.

Синтаксис:
Используется csharp
uv: TEXCOORD0;
normal: TEXCOORD1;
vlight : TEXCOORD2;
LIGHTING_COORDS(3,4)
 


итого, уже пять. А мне нужно сюда еще четыре UV добавить, можно ли это сделать за один пасс? Сейчас сделал через одну, но вот тайлинг у четырех текстур общий.


да, пробовал еще так
Синтаксис:
Используется csharp
float2 uvs[4]
 

Все работало, но под dx11 не компилило
Не бойся, если ты один, бойся, если ты ноль.
BornFoRdeatH
Адепт
 
Сообщения: 2377
Зарегистрирован: 22 окт 2011, 23:41
Откуда: Украина
Skype: bornfordeath

Re: Шейдеры и TEXCOORD

Сообщение Paul Siberdt 16 апр 2013, 22:55

Вы напишите лучше, что хотите получить, а не как пытаетесь реализовывать задумку.
Имхо, 90% задач решаются на одном uv-сете. Зачем нужен третий и четвертый - мне непостижимо. :)
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт

Re: Шейдеры и TEXCOORD

Сообщение BornFoRdeatH 16 апр 2013, 22:56

Можно ли сделать например так?
Синтаксис:
Используется csharp
float4 uv2s: TEXCOORD0;

float2 uv1 = uv2s.xy;
float2 uv2 = uv2s.zw;
 


Тоесть использовать float4 для записи двух значений float2?
Не бойся, если ты один, бойся, если ты ноль.
BornFoRdeatH
Адепт
 
Сообщения: 2377
Зарегистрирован: 22 окт 2011, 23:41
Откуда: Украина
Skype: bornfordeath

Re: Шейдеры и TEXCOORD

Сообщение BornFoRdeatH 16 апр 2013, 22:57

Paul Siberdt писал(а):Вы напишите лучше, что хотите получить, а не как пытаетесь реализовывать задумку.
Имхо, 90% задач решаются на одном uv-сете. Зачем нужен третий и четвертый - мне непостижимо. :)


В шейдере пять текстур :) 4 текстуры, и одна маска наложения. собственно 4 текстуры нужны тайлить по разному (ну это мое мнение для удобства и меньших проблем с дизайнером)
Не бойся, если ты один, бойся, если ты ноль.
BornFoRdeatH
Адепт
 
Сообщения: 2377
Зарегистрирован: 22 окт 2011, 23:41
Откуда: Украина
Skype: bornfordeath

Re: Шейдеры и TEXCOORD

Сообщение Paul Siberdt 16 апр 2013, 22:59

У вас из TEXCOORD0 не вытащится 4-хмерный вектор.
Если считаете что-нить внутри шейдера, просто создавайте float4, если снаружи - передавайте через материал vector

Вопчем, у меня самого есть шейдер на 4 текстуры, число которых планирую расширить вдвое :). Для тестов я сначала передавал в него снаружи 4 флота (мне нужен был не тайлинг, а скорость скролла по одной оси),
когда все настроил, заменил флоты на вектор, а потом совсем отрубил все и пробил цифры в самом коде. Но все изначально юзалось на одном ювисете.

Код: Выделить всё
Shader "FictionWare/Tunnel" {
    Properties {
      _Color ("Main Color", Color) = (1,0.5,0.5,0.5)
      _ColorTex ("Texture", 2D) = "white" { }
      _Tile01 ("Tile 1", 2D) = "white" { }
      _Tile02 ("Tile 2", 2D) = "white" { }
      _Tile03 ("Tile 3", 2D) = "white" { }
      
      _Counters ("Counters", Vector) = (1.0,1.0,1.0,1.0) // это внешний счетчик смещения, который передаю в материал   
    }

    SubShader
    {
        Tags { "RenderType"="Opaque"}       
        pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
           // #include "UnityCG.cginc"

         float4 _Color;
         float4 _Counters;

         sampler2D _ColorTex;
         sampler2D _Tile01;
         sampler2D _Tile02;
         sampler2D _Tile03;

         struct appdata {
            float4 vertex : POSITION;
            float4 texcoord : TEXCOORD0;
            float4 color : COLOR;
         };

         struct v2f {
            float4 pos : SV_POSITION;
            float4 uv : TEXCOORD0;
            float4 color : COLOR;
         };

         float4 _ColorTex_ST;
         float4 _Tile01_ST;
         float4 _Tile02_ST;
         float4 _Tile03_ST;

         v2f vert (appdata v) {
            v2f o;
            o.pos = mul( UNITY_MATRIX_MVP, v.vertex );
            o.uv = float4( v.texcoord.xy, 0, 0 );
         //   o.uv = TRANSFORM_TEX (v.texcoord, _Tile01);
            o.color = v.color;
            return o;
         }

         half4 frag( v2f i ) : COLOR
         {

            float2 uvs = i.uv;

            half4 texcol =   tex2D (_Tile01, float2(uvs.x + _Counters.y, uvs.y));   
            texcol +=      tex2D (_Tile02, float2(uvs.x + _Counters.z, uvs.y));
            texcol +=      tex2D (_Tile03, float2(uvs.x + _Counters.w, uvs.y));
            texcol +=      tex2D (_ColorTex, float2(0.2 * (uvs.x + _Counters.x), uvs.y + 0.2 *_Counters.x));

            return i.color * texcol * _Color;
         }
         ENDCG
      }
   }
}
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт


Вернуться в Почемучка

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

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