如何在运行时使用MonoBehaviour设置着色器设置/属性?

时间:2019-06-19 21:37:51

标签: unity3d shader hlsl shaderlab

我有一个着色器,用于显示网格的顶点颜色,并能够裁剪蓝色的顶点。我希望用户能够在使用该应用程序时打开/关闭此设置。

我已经尝试过Find and change property name in a shaderHow do I discard pixels based on vertex color and turn that on or off in a MonoBehaviour?这里提供的建议 但到目前为止,这些都没有为我工作。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using HoloToolkit.Unity;
using System;

public class AnchorScript : MonoBehaviour
{
private Renderer rend;
Vector3 scale;

public WorldAnchorManager worldAnchorManager;
// Start is called before the first frame update
void Start()
{
    rend = gameObject.GetComponent<Renderer>();
    // transform.localScale = scale;
    TurnOffContext();
}

private void Update()
{
    SaveScale();
    TurnOffContext();
}
public void AnchorIt()
{
    worldAnchorManager.AttachAnchor(this.gameObject);
    this.gameObject.GetComponent<Renderer>().material.color = Color.red;
}

public void ReleaseAnchor()
{
    worldAnchorManager.RemoveAnchor(this.gameObject);
    this.gameObject.GetComponent<Renderer>().material.color = 
Color.green;
}

public void ShowDifferences()
{
    gameObject.GetComponent<Renderer>().enabled = true; 
}

public void HideAugmentations()
{
    gameObject.GetComponent<Renderer>().enabled = false;
}
public void TurnOffContext()
{
    rend.material.SetFloat("_Toggle", 1);
    Debug.Log("Toggle ");
}

public void SaveScale()
{
    scale = gameObject.GetComponent<Transform>().localScale;
}
}

我希望此脚本会导致网格的蓝色部分被丢弃,因为在着色器的片段中我有

clip(_Toggle * (0.5f - IN.vertColor.b)); 

特别是无效的部分是线条

rend.material.Setfloat("_Toggle", 1); 

该函数正在被调用,但是没有将_Toggle值设置为1。

如果在检查器面板中手动将_Toggle设置从0更改为1,则将丢弃网格的蓝色部分,这是预期的结果。我上面粘贴的脚本应具有与在检查器面板中手动更改设置相同的结果。

1 个答案:

答案 0 :(得分:0)

我不知道为什么您当前的解决方案不起作用(对我来说看起来不错),但是我知道您可以使用着色器变体解决整个问题。

在着色器中,将以下行添加到编译指示中:

#pragma multi_compile __ DISCARD_BLUE

然后将您的clip语句更改为此:

#ifdef DISCARD_BLUE
clip(0.5f - IN.vertColor.b);
#endif

要启用和禁用此功能,只需将C#脚本更改为分别使用rend.material.EnableKeyword("DISCARD_BLUE")rend.material.DisableKeyword("DISCARD_BLUE")。这样做还有一个好处,就是在禁用关键字时可以保存一些指令。您还可以像这样在全局范围内启用/禁用关键字:

Shader.Find("Custom/VertexColor").EnableKeyword("DISCARD_BLUE");

除此之外,您是否绝对确定脚本引用了正确的渲染器?