Изменить свойство шейдера камеры - PullRequest
0 голосов
/ 21 октября 2018

Мне нужно установить переменную шейдера без материала, который его окружает.

Я объясню проблему и почему она не похожа на вопрос " Как получить доступ к переменным шейдера изscript?".

Проблема

Мой шейдер похож на это (99% ненужного кода удалено):

Shader "Hidden/XShader"
{
    Properties
    {
        _x ("", float) = 0
    }

    SubShader
    {
        Pass
        {
            float _x;

            half4 frag(v2f i) : SV_Target
            {
                // "col" and "wpos" have been correctly defined

                if (wpos.x >= _x)
                {
                    col.r = 1;
                } else {
                    col.r = 0;
                }

                return col;
            }
        }
    }
}

Этот шейдер устанавливается с помощью опции Edit->Project Settings->Graphics->Deferred.Это основной шейдер по умолчанию, используемый основной камерой.

Теперь мне нужно установить значение _x из кода, прикрепленного к камере:

public class XCameraController : MonoBehaviour
{
    public float x;

    void Update()
    {
        <something>.SetFloat("_x", x);
    }
}

Обычно заполнитель <something>быть материалом, как здесь определено SetFloat().Но у камеры и шейдера нет материала.Понятие материал даже не относится к шейдеру по умолчанию.

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

Я не ожидаю, что внедренное решение, достаточно указателя, где я могу найти помощь!

1 Ответ

0 голосов
/ 21 октября 2018

Но у камеры и шейдера нет материала.Понятие материала даже не относится к шейдеру по умолчанию.

Да, но материалы просто предоставляют все свойства шейдера, поэтому это актуально, поскольку вы хотите изменить свойства шейдера.

У вас есть пользовательский шейдер, но он используется не для рендеринга GameObject, а для камеры. Для изменения шейдера по-прежнему необходим материал. Если вы не хотите использовать материал, вы можете использовать функции Shader.SetGlobalXXX, такие как Shader.SetGlobalFloat("_x", 3), но это изменит все свойства шейдера.Это нереально.


Правильный способ сделать это - создать временный материал, который вы будете использовать для изменения шейдера, изменить свойства шейдера, а затем обновить шейдер, используемый камерой.Для этого вам необходимо:

Найти шейдер или получить ссылку на шейдер с общедоступной переменной:

Shader camShader = Shader.Find("Hidden/XShader");

Создать материал из шейдера

Material camMat = new Material(camShader);

Измените свойство по своему желанию

camMat.SetFloat("_x", 3);

Примените к измененному свойству шейдера к камере

Camera.main.SetReplacementShader(camShader, "RenderType");

Если вы вручную визуализируете камеру, тогда используйте Camera.main.RenderWithShader(camShader, "RenderType") вместоCamera.main.SetReplacementShader(camShader, "RenderType").

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