1

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

我已经尝试过此处提供的建议Find and change property name in a shader和此处如何根据顶点颜色丢弃像素并在 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,则会丢弃网格的蓝色部分,这是预期的结果。我在上面粘贴的脚本应该与手动更改检查器面板中的设置具有相同的结果。

4

1 回答 1

1

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

在着色器中,将此行添加到 pragma 中:

#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");

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

于 2019-06-20T11:33:22.400 回答