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

Используйте камеру в пользовательском шейдере URP

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

  1. Добавьте #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" внутрь HLSLPROGRAM в вашем файле шейдера. Файл Core.hlsl импортирует файл ShaderVariablesFunction.hlsl.
  2. Используйте один из следующих методов из файла ShaderVariablesFunction.hlsl.
Метод Синтаксис Описание
GetCameraPositionWS float3 GetCameraPositionWS() Возвращает пространственное положение камеры в мире.
GetScaledScreenParams float4 GetScaledScreenParams() Возвращает ширину и высоту экрана в пикселях.
GetViewForwardDir float3 GetViewForwardDir() Возвращает прямое направление вида в мировом пространстве.
IsPerspectiveProjection bool IsPerspectiveProjection() Возвращает true, если проекция камеры установлена на перспективу.
LinearDepthToEyeDepth half LinearDepthToEyeDepth(half linearDepth) Преобразует значение буфера линейной глубины в глубину изображения. Подробнее см. в Камера и текстуры глубины.
TransformScreenUV void TransformScreenUV(inout float2 screenSpaceUV) Переворачивает координату y позиции в пространстве экрана, если Unity использует перевернутое координатное пространство. Вы также можете ввести как uv, так и высоту экрана как float, так что метод выводит позицию, масштабированную до размера экрана в пикселях.

Пример

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

Shader "Custom/DirectionToCamera"
{
    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 viewDirection : TEXCOORD2;
            };

            Varyings vert(Attributes IN)
            {
                Varyings OUT;

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

                // Get the direction from the vertex to the camera, in world space
                OUT.viewDirection = GetCameraPositionWS() - positions.positionWS.xyz;

                return OUT;
            }

            half4 frag(Varyings IN) : SV_Target
            {
                // Set the fragment color to the direction vector
                return float4(IN.viewDirection, 1);
            }
            ENDHLSL
        }
    }
}

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