2017-01-06 4 views
1

Хорошо, я новичок в шейдерах, но я не могу найти способ анимировать или даже изменить значение цвета в моем пользовательском шейдере, прикрепленном к материалу.Невозможно изменить или изменить цвет в пользовательском шейдере в Unity?

Im используя материал для моей скайбоксе и градиент ж/3 свойства объявлен следующим образом:

Shader "Custom/Horizontal Skybox" 
{ 
    Properties 
    { 
     _Color1 ("Top Color", Color) = (1, 1, 1, 0) 
     _Color2 ("Horizon Color", Color) = (1, 1, 1, 0) 
     _Color3 ("Bottom Color", Color) = (1, 1, 1, 0) 
     _Exponent1 ("Exponent Factor for Top Half", Float) = 1.0 
     _Exponent2 ("Exponent Factor for Bottom Half", Float) = 1.0 
     _Intensity ("Intensity Amplifier", Float) = 1.0 
    } 

Я смотрел на Unitys документы и и пытаюсь изменить нижний цвет (в конце концов lerping так это анимировано, хотя я не знаю, как это сделать):

skybox.SetColor ("_Color3", afterColor); 

, где материал был публичным var. Я также попытался написать «Нижний цвет» в качестве параметра, но когда он ничего не запускает, это происходит. Я не понимаю, почему.

Как изменить цвет в моем пользовательском шейдере? Более того, как я могу изменить это изменение, как только я это сделаю?

EDIT: @Programmer Шейдер - это файл .shader, прикрепленный к материальному объекту. Shader код (я не пишу это как Im новой для шейдеров):

Shader "Custom/Horizontal Skybox" 
{ 
    Properties 
    { 
     _Color1 ("Top Color", Color) = (1, 1, 1, 0) 
     _Color2 ("Horizon Color", Color) = (1, 1, 1, 0) 
     _Color3 ("Bottom Color", Color) = (1, 1, 1, 0) 
     _Exponent1 ("Exponent Factor for Top Half", Float) = 1.0 
     _Exponent2 ("Exponent Factor for Bottom Half", Float) = 1.0 
     _Intensity ("Intensity Amplifier", Float) = 1.0 
    } 

    CGINCLUDE 

    #include "UnityCG.cginc" 

    struct appdata 
    { 
     float4 position : POSITION; 
     float3 texcoord : TEXCOORD0; 
    }; 

    struct v2f 
    { 
     float4 position : SV_POSITION; 
     float3 texcoord : TEXCOORD0; 
    }; 

    half4 _Color1; 
    half4 _Color2; 
    half4 _Color3; 
    half _Intensity; 
    half _Exponent1; 
    half _Exponent2; 

    v2f vert (appdata v) 
    { 
     v2f o; 
     o.position = mul (UNITY_MATRIX_MVP, v.position); 
     o.texcoord = v.texcoord; 
     return o; 
    } 

    half4 frag (v2f i) : COLOR 
    { 
     float p = normalize (i.texcoord).y; 
     float p1 = 1.0f - pow (min (1.0f, 1.0f - p), _Exponent1); 
     float p3 = 1.0f - pow (min (1.0f, 1.0f + p), _Exponent2); 
     float p2 = 1.0f - p1 - p3; 
     return (_Color1 * p1 + _Color2 * p2 + _Color3 * p3) * _Intensity; 
    } 

    ENDCG 

    SubShader 
    { 
     Tags { "RenderType"="Background" "Queue"="Background" } 
     Pass 
     { 
      ZWrite Off 
      Cull Off 
      Fog { Mode Off } 
      CGPROGRAM 
      #pragma fragmentoption ARB_precision_hint_fastest 
      #pragma vertex vert 
      #pragma fragment frag 
      ENDCG 
     } 
    } 
} 

Попытка изменить это с помощью публичных переменных, как это из сценария в пустой:

public Material skybox; 
public Color afterColor; 

void Start() { 

     chars = GameObject.FindGameObjectsWithTag("BeginChar"); 
     balls = GameObject.FindGameObjectsWithTag ("Ball"); 
     StartCoroutine (waitForTheRun()); 

     skybox.SetColor ("_Color3", afterColor); //here 

    } 

enter image description here

+0

Вы не можете изменить этот цвет из редактора? Если да, то вы можете сделать это из кода. Если нет, вы также не можете сделать это из кода, и вы должны исправить свой шейдерный код. – Programmer

+0

Да, я могу изменить его непосредственно в инспекторе, изменяя SHADER, однако я пытаюсь сделать это из другого скрипта и его не работает – skyguy

+0

Хорошо. Какой цвет вы можете изменить? Цвет верхнего цвета? Цвет горизонта? Нижний цвет? – Programmer

ответ

1

Не видите ничего плохого с вашим кодом.

вещи попробовать:

.Вы должны подключить skybox3 материал в слот с текстурой неба. После этого вы можете изменить материал. Это гарантирует, что вы модифицируете правильный материал.

enter image description here

.Direct SkyBox изменение

Вы не должны делать # 1 с этим. Он будет модифицировать любой материал, прикрепленный к SkyBox.

public Material skybox; 
public Color afterColor = Color.white; 

// Use this for initialization 
public void Start() 
{ 
    skybox = RenderSettings.skybox; 
    skybox.SetColor("_Color3", afterColor); //here 
} 
Смежные вопросы