明暗器在材质编辑器中始终显示为固定值吗? (团结)

问题描述 投票:0回答:2

我正在尝试在运行时从附加在对象中的着色器获取value属性,但是在材质编辑器中永远不会更改它。也许我误解了着色器的工作原理?

我读过有关GetFloat,GetColor等的信息,但还没有弄清楚它如何在Update()中正确获取着色器的信息。这里的真正目标是(实时)从着色器捕获特定值,并在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 "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"
}

谢谢您的时间

c# unity3d shader
2个回答
0
投票

您几乎无法从着色器获得任何信息,GetColor函数从您已经设置的检查器而不是从着色器返回颜色。


0
投票

我想我已经知道您要做什么了,然后

这不是工作原理,对不起

将您的评论和问题汇总在一起,这是我想您要弄弄的东西:

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

不是这一个:

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 surfgeom都被多次并行调用,并且依赖于接收输入相同的数据,因此将Properties值读入CGPROGRAM,完成后将CGPROGRAM的值丢弃。

[我不认为您可以通过any方式使着色器CGPROGRAM执行您可以从C#读取的任何操作(因为该代码每帧运行数百次,您怎么知道哪一个阅读?)

我知道您可以使用properties(包括更改one实例或all实例的属性),但不能获取基础CGPROGRAM数据。我什至可以想到解决此问题的唯一方法是渲染到纹理,然后读取纹理数据,这将很慢(同样,您会进入“哪个像素具有所需的值”?)

© www.soinside.com 2019 - 2024. All rights reserved.