Как добавить в простой шейдер входные данные о цвете вершин

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

Как добавить в простой шейдер входные данные о цвете вершин

Сообщение mrcoder 30 сен 2012, 22:38

Никак не могу разобратся с шейдерами, задачка вроде не сложная, но как ни пробовал - постоянно ругается на ошибки... :((
Вот сам шейдер. В него нужно добавить обработку переменной Color (которая означает цвета вершин треугольника)
Под первым шейдером приведен пример другого шейдера, который поддерживает эти входные данные.
Заранее спасибо.

Синтаксис:
Используется glsl
Shader "Animation/Grass" {
   Properties {
      _Color ("Main Color", Color) = (1,1,1,0.5)
      _MainTex ("Texture", 2D) = "white" { }
      _WaveAmplitude ("Wave Amplitude", Float) = 0.1
   }
     
      SubShader {    
            Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
            LOD 50
            ZWrite Off
            Blend SrcAlpha OneMinusSrcAlpha              
         Pass {
Cull Off                                                        
CGPROGRAM
#pragma exclude_renderers xbox360
#pragma vertex vert
#pragma fragment frag

#include "UnityCG.cginc"

float _WaveAmplitude;
float4 _Color;
sampler2D _MainTex;

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

float4 _MainTex_ST;
v2f vert (appdata_base v)
{  
   float wind = _WaveAmplitude  * sin( 1.57 *_Time.y + v.vertex.x);
    v.vertex.x += wind * step(0.8, v.texcoord.y) * step(0.8, v.texcoord.x);    
    v.vertex.z -= wind * step(0.8, v.texcoord.y) * step(v.texcoord.x, 0.8);      
   
    v2f o;
   o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
   o.uv = v.texcoord;
    return o;
}

half4 frag (v2f i) : COLOR
{
    half4 texcol = tex2D (_MainTex, i.uv);
    return texcol * _Color;
}

ENDCG
         }
      }
   Fallback "VertexLit"
}



Синтаксис:
Используется glsl
Shader "Shaderforterr" {
        Properties {
                _MainTex ("Base (RGB)", 2D) = "white" {}
                 _Cutoff ("Cutoff", Range (0,0.1)) = .09
        }
        SubShader {
                Pass {
                Cull Off               
                        CGPROGRAM
                        #pragma vertex vert
                        #pragma fragment frag
                        #include "UnityCG.cginc"
                        sampler2D _MainTex;
                        struct v2f
                        {
                                float4 pos : SV_POSITION;
                                float2 uv : TEXCOORD0;
                                float3 color : COLOR0;
                        };
                        struct indata
                        {
                                float4 vertex;
                                float3 normal;
                                float4 texcoord;
                                float4 color;
                        };
                        v2f vert(indata v)
                        {
                                v2f o;
                                o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
                                o.uv = TRANSFORM_UV(0);
                                o.color = v.color;
                                return o;
                        }
                        half4 frag(v2f i) : COLOR
                        {
                            half4 color = tex2D(_MainTex, i.uv.xy);
                                return half4(i.color*tex2D(_MainTex, i.uv).rgb, 1-tex2D(_MainTex, i.uv.xy).a);
                        }
                        ENDCG
                AlphaTest Less [_Cutoff]
                }
        }
}
Аватара пользователя
mrcoder
Старожил
 
Сообщения: 704
Зарегистрирован: 28 июн 2012, 22:40

Re: Как добавить в простой шейдер входные данные о цвете вершин

Сообщение mrcoder 30 сен 2012, 22:49

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

еще одна просьба - по шейдеру воды. возможно уже есть что то готовое, я не нашел, а из стандартных - все не то .
нужно два шейдера поверхности воды: в обоих случаях всё делает видеокарта. одиншейдер-простой. другой-посложнее. вообще сгодятся любые, в границах своих возможностей я смогу их модифицировать.

вода - просто ровная горизонтальная поверхность из очень небольшого количества треугольников видимая только сверху.
для простого варианта шейдера - я брал стандартный простой шейдер прозрачности, дополнял его обработкой текстуры, искажением вершин - но получалось месиво. это выглядело даже хуже чем просто полупрозрачная текстура...

и здесь все уткнулось в проблемы с программированием шейдеров. :(
Аватара пользователя
mrcoder
Старожил
 
Сообщения: 704
Зарегистрирован: 28 июн 2012, 22:40

Re: Как добавить в простой шейдер входные данные о цвете вершин

Сообщение waruiyume 30 сен 2012, 23:54

Синтаксис:
Используется glsl
Shader "Animation/Grass"
{
        Properties
        {
                _Color ("Main Color", Color) = (1,1,1,0.5)
                _MainTex ("Texture", 2D) = "white" { }
                _WaveAmplitude ("Wave Amplitude", Float) = 0.1
        }

        SubShader
        {
                Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
                LOD 50
                ZWrite Off
                Blend SrcAlpha OneMinusSrcAlpha
                Pass {
                Cull Off
                CGPROGRAM
                #pragma exclude_renderers xbox360
                #pragma vertex vert
                #pragma fragment frag

                #include "UnityCG.cginc"

                float _WaveAmplitude;
                float4 _Color;
                sampler2D _MainTex;

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

                struct appdata
                {
                        float4 vertex : POSITION;
                        float3 normal : NORMAL;
                        float4 texcoord : TEXCOORD0;
                        half4 color : COLOR;
                };

                float4 _MainTex_ST;
                v2f vert (appdata v )
                {
                        float wind = _WaveAmplitude * sin( 1.57 *_Time.y + v.vertex.x);
                        v.vertex.x += wind * step(0.8, v.texcoord.y) * step(0.8, v.texcoord.x);
                        v.vertex.z -= wind * step(0.8, v.texcoord.y) * step(v.texcoord.x, 0.8);

                        v2f o;
                        o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
                        o.uv = v.texcoord;
                        o.color = v.color;
                        return o;
                }

                half4 frag (v2f i) : COLOR
                {
                        half4 texcol = tex2D (_MainTex, i.uv);
                        return texcol * _Color * i.color;
                }

                ENDCG
        }
}
        Fallback "VertexLit"
}
 

-------------------------------------------------------------------
http://video.unity3d.com/video/3274383/unite-08-shaders (урок древний, как говно мамонта, дайте ссылку, если есть поновее)
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Как добавить в простой шейдер входные данные о цвете вершин

Сообщение mrcoder 01 окт 2012, 11:31

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

сейчас проанализирую ваше решение, посмотрю где у меня был затык.

еще раз спасибо. :ymparty:
Аватара пользователя
mrcoder
Старожил
 
Сообщения: 704
Зарегистрирован: 28 июн 2012, 22:40

Re: Как добавить в простой шейдер входные данные о цвете вершин

Сообщение mrcoder 01 окт 2012, 11:55

спасибо еще раз. :)
разобрался в чем допускал ошибку - не правильно указывал структуру для appdata.
видимо не все переменные перечислял, а компилятор шейдеров очень сухой и ошибки расписывает очень сухо, фактически и не описывает.
Аватара пользователя
mrcoder
Старожил
 
Сообщения: 704
Зарегистрирован: 28 июн 2012, 22:40

Re: Как добавить в простой шейдер входные данные о цвете вершин

Сообщение WhiteDevil 01 окт 2012, 13:16

Все было уже здесь
http://docs.unity3d.com/Documentation/C ... nputs.html

Все что вам нужно было знать, так это то, что appdata_* - это структура с определенным количеством входных данных
Если прочесать файл D:\Program Files\Unity\Editor\Data\CGIncludes\UnityCG.cginc
То в нем можно найти 3 заведомовые за вас структуры
appdata_base
appdata_tan
appdata_full
И разница между ними - наборы данных

Но вы ведь можете написать и свою структуру, где указываете какие данные вы ходите вынуть из appdata_full
Аватара пользователя
WhiteDevil
UNIверсал
 
Сообщения: 455
Зарегистрирован: 19 дек 2010, 15:55

Re: Как добавить в простой шейдер входные данные о цвете вершин

Сообщение mrcoder 01 окт 2012, 14:53

WhiteDevil спасибо.
дело в том что я программист обшего назначения :-B и +с сетевым упором. игры я конечно делал с тех пор как программировать начал, но с 3д и тем более юнити я всего 3 месяца. и сейчас огромное количество вещей более приоритетных есть по разработке, чем изучение программирования шейдеров с нуля. поэтому никак не получается выделить достаточно времени что бы изучить их и больше не возвращатся к этому вопросу. приходится расставлять приоритеты. и у них пока Low. :-B
Аватара пользователя
mrcoder
Старожил
 
Сообщения: 704
Зарегистрирован: 28 июн 2012, 22:40

Re: Как добавить в простой шейдер входные данные о цвете вершин

Сообщение WhiteDevil 01 окт 2012, 14:57

Ну для этого все мы тут и тусуемся :)
Аватара пользователя
WhiteDevil
UNIверсал
 
Сообщения: 455
Зарегистрирован: 19 дек 2010, 15:55

Re: Как добавить в простой шейдер входные данные о цвете вершин

Сообщение mrcoder 01 окт 2012, 17:24

WhiteDevil писал(а):Ну для этого все мы тут и тусуемся :)

видимо вы имеете в виду, что бы помогать друг другу? :) я тоже по мере свободного времени(обычно во время еды), отвечаю в почемучке периодически.

вот только вторая часть моего сообщения осталась даже без малейшего внимания. :(

mrcoder писал(а):еще одна просьба - по шейдеру воды. возможно уже есть что то готовое, я не нашел, а из стандартных - все не то .
нужно два шейдера поверхности воды: в обоих случаях всё делает видеокарта. одиншейдер-простой. другой-посложнее. вообще сгодятся любые, в границах своих возможностей я смогу их модифицировать.
вода - просто ровная горизонтальная поверхность из очень небольшого количества треугольников видимая только сверху.
для простого варианта шейдера - я брал стандартный простой шейдер прозрачности, дополнял его обработкой текстуры, искажением вершин - но получалось месиво. это выглядело даже хуже чем просто полупрозрачная текстура...
Аватара пользователя
mrcoder
Старожил
 
Сообщения: 704
Зарегистрирован: 28 июн 2012, 22:40


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

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

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