Сохранение переменных шейдера

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

Сохранение переменных шейдера

Сообщение alt3d 15 окт 2015, 10:10

Есть шейдер, в котором некоторые переменные не вынесенны в блок Properties.
Указываю их значения в редакторе через кастомный скрипт для редактора, используя Shader.SetGlobal.
Так вот, эти значения не сохраняются в сцене/ассетах/билде.
При перезапуске редактора они сбрасываются на дефолтные значения - все флоаты по нулям, цвета - черные и так далее.

Если я правильно понимаю Юнити не сериализует эти переменные т.к. их нет в инспекторе.
Есть-ли какой-то способ заставить его сохранять значения переменных?

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

Синтаксис:
Используется csharp
Shader "Custom/Global Sand/"
{
        Properties
        {
                // Свойства назначаются только через код
        }

        SubShader
        {
                Tags { "RenderType"="Opaque" }
                LOD 400
               
                CGPROGRAM
                #pragma surface surf Standard fullforwardshadows
                #pragma target 3.0

                // Глобальные переменные
                float4 SandsColor;
                sampler2D SandTex;

                // ===
                // Далее обычный код шейдера
                // ===

                ENDCG
        }
}  
}
Последний раз редактировалось alt3d 15 окт 2015, 12:31, всего редактировалось 1 раз.
alt3d
Старожил
 
Сообщения: 687
Зарегистрирован: 04 сен 2011, 21:19
  • Сайт
  • ICQ

Re: Сохранение переменных шейдера

Сообщение Razor_V 15 окт 2015, 11:53

Попробуй огласить переменные как uniform.
Тобишь так:

Синтаксис:
Используется csharp
Shader "Custom/Global Sand/"
{
        Properties
        {
                // Свойства назначаются только через код
        }

        SubShader
        {
                Tags { "RenderType"="Opaque" }
                LOD 400
               
                CGPROGRAM
                #pragma surface surf Standard fullforwardshadows
                #pragma target 3.0

                // Глобальные переменные
               uniform  float4 SandsColor;
               uniform  sampler2D SandTex;

                // ===
                // Далее обычный код шейдера
                // ===

                ENDCG
        }
}  
}
Razor_V
UNец
 
Сообщения: 12
Зарегистрирован: 19 ноя 2014, 14:56

Re: Сохранение переменных шейдера

Сообщение alt3d 15 окт 2015, 12:28

Razor_V писал(а):Попробуй огласить переменные как uniform.

Я пробовал, не помогает.
alt3d
Старожил
 
Сообщения: 687
Зарегистрирован: 04 сен 2011, 21:19
  • Сайт
  • ICQ

Re: Сохранение переменных шейдера

Сообщение Razor_V 15 окт 2015, 13:53

Вот рабочий вариант:
Код
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class ChelovekLudyna : MonoBehaviour {



        // Use this for initialization
        void Start () {

                Shader.SetGlobalColor ("_Herak", Color.red);
        }
       
        // Update is called once per frame
//      void Update () {
//              do.Sleep.Eat.Fuck.Listen_Panzerballett;
//      }
}
 

Шейдер
Синтаксис:
Используется csharp
Shader "Custom/testShader1" {
                        Properties {
                _MainTex ("Base (RGB)", 2D) = "white" {}
                _MaskTex ("Mask R- Metallic, G- gloss, B- Blur", 2D) = "white" {}
                _M ("Mult",Range(0.01,1)) = 1

                }
SubShader {
       
                Tags { "RenderType"="Opaque" "Queue" = "Geometry+5" }
                LOD 200

               
                CGPROGRAM
                #pragma only_renderers metal gles gles3 OpenGL
                #pragma surface surf Lambert exclude_path:prepass noforwardadd  halfasview
                #include "UnityCG.cginc"

                sampler2D _MainTex;
                sampler2D _MaskTex;
                uniform fixed4 _Herak;
                fixed _M;

        struct Input {
                fixed2 uv_MainTex;
                };
                void surf (Input IN, inout SurfaceOutput o) {
                fixed3 c = tex2D (_MainTex, IN.uv_MainTex);
                fixed3 c2 = tex2D (_MaskTex, IN.uv_MainTex);
                o.Albedo = ((c.rgb + (c2.rgb * _M))-(_M/2)) + _Herak;
          }
            ENDCG
        }
    FallBack "Diffuse"
  }
 
Razor_V
UNец
 
Сообщения: 12
Зарегистрирован: 19 ноя 2014, 14:56

Re: Сохранение переменных шейдера

Сообщение alt3d 15 окт 2015, 14:29

Razor_V писал(а):Вот рабочий вариант:
Код
Синтаксис:
Используется csharp
Shader.SetGlobalColor ("_Herak", Color.red);
 


Спасибо за помощь.
Если вы имеете ввиду "назначать при старте переменные", то именно так сейчас и делаю. )
alt3d
Старожил
 
Сообщения: 687
Зарегистрирован: 04 сен 2011, 21:19
  • Сайт
  • ICQ

Re: Сохранение переменных шейдера

Сообщение Razor_V 15 окт 2015, 14:51

Если вы имеете ввиду "назначать при старте переменные", то именно так сейчас и делаю. )

По сути можно и в апдейте. Все зависит от того, когда и при каких условиях должна присваиваться ваша переменная. В старте я запустил чисто ради примера. Шейдер тоже взял для примера, названия переменных и подписи в пропертях там левые. Я намедни на нем тестировал смешивание текстур.

Пример в апдейте:
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class ChelovekLudyna : MonoBehaviour {



        // Use this for initialization
//      void Start () {
//
//              Shader.SetGlobalColor ("_Herak", Color.red);
//      }
       
        // Update is called once per frame
        void Update () {
                if (Input.GetKey(KeyCode.R))
                {
                        Shader.SetGlobalColor ("_Herak", Color.red);
                }
                else Shader.SetGlobalColor ("_Herak", Color.white);
                //do.Sleep.Eat.Fuck.Listen_Panzerballett;
        }
}
Razor_V
UNец
 
Сообщения: 12
Зарегистрирован: 19 ноя 2014, 14:56


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

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

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