Как установить параметр / свойство шейдера во время выполнения, используя MonoBehaviour? - PullRequest
0 голосов
/ 20 июня 2019

У меня есть шейдер, который отображает цвета вершин меша и имеет возможность обрезать вершины синего цвета.Я бы хотел, чтобы пользователь мог включать / отключать этот параметр при использовании приложения.

Я пробовал предложенные здесь предложения Найти и изменить имя свойства в шейдере издесь Как мне отбрасывать пиксели на основе цвета вершин и включать или выключать их в 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 голосов
/ 20 июня 2019

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

Внутри вашего шейдера добавьте эту строку в прагмы:

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

Кроме этого, вы абсолютно уверены, что ваш скрипт ссылается на правильный рендерер?

...