Используйте камеру в пользовательском шейдере URP
Чтобы использовать камеру в пользовательском шейдере Universal Render Pipeline (URP), выполните следующие действия:
- Добавьте
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"внутрьHLSLPROGRAMв вашем файле шейдера. ФайлCore.hlslимпортирует файлShaderVariablesFunction.hlsl. - Используйте один из следующих методов из файла
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
}
}
}