Настройка и использование 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 Пользовательская функция узел.
Например:
-
В вашем проекте создайте файл HLSL со следующим содержимым:
``` lang-hlsl
ifndef (неопределённый) DECODE_RSUV_INCLUDED определить DECODE_RSUV_INCLUDEDvoid 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
```
Назовите файл
DecodeRSUV.hlsl, например.В течение Shader Graph рабочее место, добавить Пользовательская функция узел и выберите его.
В графе Inspector, в свойствах узла Пользовательская Функция:
Добавить Выход типа Вектор 4 и назвать его Выход.
Установите Тип на Файл.
Установите Имя на
DecodeRSUVColor.В поле Источник выберите
DecodeRSUV.hlsl, который вы создали ранее.В рабочей области 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;
}
}
}
}