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