Unity 6.3
0 онлайн 134 гостей 3 в системе
Вход
Материалы и шейдеры Шаг 352 из 442

Настройка и использование RSUV

Узнайте, как настроить и использовать Пользовательское значение (RSUV) на примере.

Установить значение

Чтобы установить значение, нужно написать скрипт.

Следующий пример устанавливает случайный цвет для всех MeshRenderer сцены, закодированных как 24-битное целое число:

        MeshRenderer[] allMeshRenderers = FindObjectsByType<MeshRenderer>(FindObjectsSortMode.InstanceID);
        foreach (MeshRenderer meshRenderer in allMeshRenderers)
        {
            // compute a random color
            Color32 c = Color.HSVToRGB(UnityEngine.Random.Range(0f, 1f), UnityEngine.Random.Range(0.6f, 1.0f), UnityEngine.Random.Range(0.6f, 1.0f));

            // set it as a LDR color in the RSUV value of the renderer
            uint cc = ((uint)c.b << 16) | ((uint)c.g << 8) | ((uint)c.r << 0);
            meshRenderer.SetShaderUserValue(cc);
        }

Используйте значение

После установки значения, вы можете использовать его в коде шейдера или в графе шейдера. Вы также можете использовать его с Графика объектов.

Использовать значение в коде шейдера

В коде шейдера вы можете декодировать 24-битное целое число как цвет float4. Например:

uint c = unity_RendererUserValue;
float4 mycolor = float4((float)((c >> 0) & 255) * (1.f / 255.f),
                        (float)((c >> 8) & 255) * (1.f / 255.f),
                        (float)((c >> 16) & 255) * (1.f / 255.f),
                        (float)1.f);

Использовать значение в графе шейдера

Чтобы извлечь RSUV в граф шейдера, используйте a Пользовательская функция узел.

Например:

  1. В вашем проекте создайте файл HLSL со следующим содержимым:

    ``` lang-hlsl

    ifndef (неопределённый) DECODE_RSUV_INCLUDED определить DECODE_RSUV_INCLUDED

    void DecodeRSUVColor_float(out float4 Out) { uint c = unity_RendererUserValue; Out = float4((float)((c >> 0) & 255) * (1.f / 255.f), (float)((c >> 8) & 255) * (1.f / 255.f), (float)((c >> 16) & 255) * (1.f / 255.f), 1.f); }

#endif // DECODE_RSUV_INCLUDED
```
  1. Назовите файл DecodeRSUV.hlsl, например.

  2. В течение Shader Graph рабочее место, добавить Пользовательская функция узел и выберите его.

  3. В графе Inspector, в свойствах узла Пользовательская Функция:

  4. Добавить Выход типа Вектор 4 и назвать его Выход.

  5. Установите Тип на Файл.

  6. Установите Имя на DecodeRSUVColor.

  7. В поле Источник выберите DecodeRSUV.hlsl, который вы создали ранее.

  8. В рабочей области Shader Graph подключите порт Out узла Пользовательская Функция к входу Фрагмента Базовый Цвет.

Используйте RSUV с графическими объектами

Вы также можете использовать функцию RSUV вместе с пакетом Графика объектовUnity.

В следующем примере кода всем объектам, включающим компонент MaterialMeshInfo, назначается отдельное значение RSUV.


using Unity.Entities;
using UnityEngine;
using Unity.Rendering;
using Unity.Burst;

[MaterialProperty("unity_RendererUserValuesPropertyEntry")]
public struct RendererUserValue_BaseValue : IComponentData
{
    public uint Value;
}

[BurstCompile]
public partial struct MaterialMeshInfoDebugSystem : ISystem
{

    private bool m_done;

    public void OnCreate(ref SystemState state)
    {
        m_done = false;
    }

    public void OnUpdate(ref SystemState state)
    {
        if ( !m_done )
        {
            var entityManager = state.EntityManager;
            var mQuery = entityManager.CreateEntityQuery(ComponentType.ReadOnly<MaterialMeshInfo>());
            // subscene may not be fully loaded, so wait for some entities to be here
            if (!mQuery.IsEmpty)
            {
                using (var entities = mQuery.ToEntityArray(Unity.Collections.Allocator.Temp))
                {
                    foreach (var entity in entities)
                    {
                        Color32 c = Color.HSVToRGB(UnityEngine.Random.Range(0f, 1f), UnityEngine.Random.Range(0.6f, 1.0f), UnityEngine.Random.Range(0.6f, 1.0f));
                        uint cc = ((uint)255<<24) | ((uint)c.b << 16) | ((uint)c.g << 8) | ((uint)c.r << 0);

                        entityManager.AddComponentData(entity, new RendererUserValue_BaseValue { Value = cc });
                    }
                }
                m_done = true;
            }
        }
    }
}

Дополнительные ресурсы