Unity 6.3
0 онлайн 85 гостей 3 в системе
Вход

Transform позиции в пользовательском URP шейдере

Чтобы преобразовать позиции в пользовательском шейдере Universal Render Pipeline (URP), выполните следующие действия:

  1. Добавьте #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" внутрь HLSLPROGRAM в вашем файле шейдера. Файл Core.hlsl импортирует файл ShaderVariablesFunction.hlsl.
  2. Используйте один из следующих методов из файла ShaderVariablesFunction.hlsl.
Метод Синтаксис Описание
GetNormalizedScreenSpaceUV float2 GetNormalizedScreenSpaceUV(float2 positionInClipSpace) Преобразует позицию в пространстве клипа в пространство экрана.
GetObjectSpaceNormalizeViewDir half3 GetObjectSpaceNormalizeViewDir(float3 positionInObjectSpace) Преобразует положение в пространстве объекта в нормализованное направление к просмотрщику.
GetVertexNormalInputs VertexNormalInputs GetVertexNormalInputs(float3 normalInObjectSpace) Преобразует нормаль вершины в объектном пространстве в касательную, битангентную и нормаль в мировом пространстве. Также можно ввести как нормаль, так и касательную float4 в объектном пространстве.
GetVertexPositionInputs VertexPositionInputs GetVertexPositionInputs(float3 positionInObjectSpace) Преобразует положение вершины в пространстве объектов в положение в пространстве мира, пространстве представления, пространстве клипа и нормализованных координатах устройства.
GetWorldSpaceNormalizeViewDir half3 GetWorldSpaceNormalizeViewDir(float3 positionInWorldSpace) Возвращает направление от позиции в мировом пространстве к зрителю и нормализует направление.
GetWorldSpaceViewDir float3 GetWorldSpaceViewDir(float3 positionInWorldSpace) Возвращает направление от позиции в мировом пространстве к зрителю.

Структуры

VertexPositionInputs

Используйте GetVertexPositionInputs метод, чтобы получить эту структуру.

Полевая Описание
float3 positionWS Положение в мировом пространстве.
float3 positionVS Позиция в пространстве представления.
float4 positionCS Позиция в пространстве клипа.
float4 positionNDC Положение как нормализованные координаты устройства (NDC).

VertexNormalInputs

Используйте GetVertexNormalInputs метод, чтобы получить эту структуру.

Полевая Описание
real3 tangentWS Тангенс в мировом пространстве.
real3 bitangentWS Битангенс в мировом пространстве.
float3 normalWS Норма в мировом пространстве.

Пример

Следующий шейдер URP рисует поверхности объектов цветами, которые представляют их положение в экранном пространстве.

Shader "Custom/ScreenSpacePosition"
{
    SubShader
    {
        Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline" }

        Pass
        {
            HLSLPROGRAM

            #pragma vertex vert
            #pragma fragment frag

            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"

            struct Attributes
            {
                float4 positionOS : POSITION;
                float2 uv: TEXCOORD0;
            };

            struct Varyings
            {
                float4 positionCS  : SV_POSITION;
                float2 uv: TEXCOORD0;
                float3 positionWS : TEXCOORD2;
            };

            Varyings vert(Attributes IN)
            {
                Varyings OUT;
                OUT.positionCS = TransformObjectToHClip(IN.positionOS.xyz);

                // Get the position of the vertex in different spaces
                VertexPositionInputs positions = GetVertexPositionInputs(IN.positionOS);

                // Set positionWS to the world space position of the vertex
                OUT.positionWS = positions.positionWS.xyz;

                return OUT;
            }

            half4 frag(Varyings IN) : SV_Target
            {
                // Set the fragment color to the world space position vector
                return float4(IN.positionWS.xy, 0, 1);
            }
            ENDHLSL
        }
    }
}

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