Шейдеры всегда отображаются с фиксированными значениями в редакторе материалов? (Единство) - PullRequest
0 голосов
/ 23 октября 2019

Я пытаюсь получить свойство value из shader, прикрепленного к объекту во время выполнения, но оно никогда не изменяется в редакторе материалов. Может быть, я что-то неправильно понял о том, как работают шейдеры?

Я читал о GetFloat, GetColor и т. Д., Но пока не понимаю, как это правильно работает, чтобы получить информацию о shader в Update(). Настоящая цель здесь - поймать определенное значение из shader (в режиме реального времени) и сделать что-нибудь в скрипте C #, если это возможно.

C # пример

public Color colorInfo;

Awake()
{
    rend = GetComponent<Renderer>();// Get renderer
    rend.material.shader = Shader.Find("Unlit/shadowCreatures");//shader
}

Update()// I want the info in a realtime
{
    //get current float state of the shader
    colorInfo = rend.material.GetColor("_Color"); 
    //If I setup a white color in shader properties, the color in material editor is always white
}

Shader

Shader "Unlit/shadowCreatures"
{
Properties {
    _Color ("Color", Color) = (1,1,1,1)
    [PerRendererData]_MainTex ("Sprite Texture", 2D) = "white" {}
    _Cutoff("Shadow alpha cutoff", Range(0,1)) = 0.5
}
SubShader {
    Tags 
    { 
        "Queue"="Geometry"
        "RenderType"="TransparentCutout"
        "PreviewType"="Plane"
        "CanUseSpriteAtlas"="True"
    }
    LOD 200

    Cull Off

    CGPROGRAM
    // Lambert lighting model, and enable shadows on all light types
    #pragma surface surf Lambert addshadow fullforwardshadows

    // Use shader model 3.0 target, to get nicer looking lighting
    #pragma target 3.0

    sampler2D _MainTex;
    fixed4 _Color;
    fixed _Cutoff;

    struct Input
    {
        float2 uv_MainTex;
    };

    void surf (Input IN, inout SurfaceOutput o) {
        fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
        o.Albedo = c.rgb;
        o.Alpha = c.a;
        clip(o.Alpha - _Cutoff);
        _Color = (0,0,0,0); //trying turn to black just for a test, and nothing happens
    }
    ENDCG
}
FallBack "Diffuse"
}

Спасибо за ваше время

1 Ответ

1 голос
/ 23 октября 2019

Я думаю, что я понял, что вы пытаетесь сделать, и

Это не так, как все работает, извините

Собирая воедино ваши комментарии и вопросы, это то, что я думаю, что выпытаясь возиться с:

void surf (Input IN, inout SurfaceOutput o) {
    _Color = (0,0,0,0); //trying turn to black just for a test, and nothing happens
}

Это не делает то, что вы думаете, что делает. Эта строка устанавливает this _Color:

#pragma target 3.0

sampler2D _MainTex;
fixed4 _Color;
fixed _Cutoff; //here

Not this:

Properties {
    _Color ("Color", Color) = (1,1,1,1) //here
    [PerRendererData]_MainTex ("Sprite Texture", 2D) = "white" {}
    _Cutoff("Shadow alpha cutoff", Range(0,1)) = 0.5
}

Этот второй - то, что показано напанель инспектора и ее связь с блоком CGPROGRAM фактически односторонние, потому что frag surf и geom все вызываются несколько раз параллельно и полагаются на получение одних и тех же данных, поэтому Propertiesзначение считывается в CGPROGRAM, а значения CGPROGRAM отбрасываются, когда это делается.

Я не думаю, что есть любой способ, которым вы можете заставить шейдер CGPROGRAM делать все, что вы можете прочитать изC # (поскольку этот код выполняется сотни раз за кадр, как вы узнаете , какой из них для чтения?)

Я знаю, что вы можете получить свойства (включая изменение свойства для одного экземпляра или для всех экземпляров), но не базовых данных CGPROGRAM. Единственный способ, который я могу даже обойти, - это рендерить в текстуру, а затем читать данные текстуры, и это будет медленно (и снова вы попадаете в «какой пиксель имеет желаемое значение»?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...