Entwickeln
Entwickeln
Deine Plattform auswählen

Depth API-Referenz für Shader-Bibliotheken

API-Referenz für EnvironmentOcclusion-Shader-Bibliotheken


META_DEPTH_VERTEX_OUTPUT(number)

Beschreibung
Wird in der Fragment-Shader-Eingabestruktur verwendet. Entspricht:
float3 posWorld : TEXCOORD##number;
Parameter:
  • number-Typ: int. Wert, der auf TEXCOORD##number angewendet wird

META_DEPTH_INITIALIZE_VERTEX_OUTPUT(output, vertex)

Beschreibung
Wird im Vertex-Shader verwendet. Konvertiert vom Objektraum in den Weltenraum und übergibt ihn an die Vertex-Ausgabe.
Parameter:
  • output-Typ: struct. Stellt die Vertex-Ausgabe dar.
  • input-Typ: float3. Stellt die SV_POSITION der Vertex-Eingabe dar.

META_DEPTH_GET_OCCLUSION_VALUE_WORLDPOS(posWorld, zBias)

Beschreibung
Wird im Fragment-Shader verwendet. Berechnet den Wert der Verdeckung an der Position „posWorld“.
Parameter:
  • posWorld-Typ: float3. Stellt den Wert der Welt-Position des Fragments dar.
  • zBias-Typ: float. Stellt den Betrag der auf die Verdeckung angewendeten Umgebungs-Tiefenverzerrung dar.

META_DEPTH_GET_OCCLUSION_VALUE(input, zBias)

Beschreibung
Wird im Fragment-Shader verwendet. Berechnet den Wert für die Verdeckung, wenn angenommen wird, dass die Eingabe die Welt-Position „posWorld“ hat.
Parameter:
  • input-Typ: struct. Stellt die Eingabestruktur des Fragment-Shaders dar.
  • zBias-Typ: float. Stellt den Betrag der auf die Verdeckung angewendeten Umgebungs-Tiefenverzerrung dar.

META_DEPTH_OCCLUDE_OUTPUT_PREMULTIPLY_WORLDPOS(posWorld, output, zBias)

Beschreibung
Wird im Fragment-Shader verwendet. Ändert die Ausgabefarbe automatisch, um den Wert für die Verdeckung an Position „posWorld“ zu berücksichtigen.
Parameter:
  • posWorld-Typ: float3. Stellt den Wert der Welt-Position des Fragments dar.
  • output-Typ: float4. Stellt die endgültige Fragment-Shader-Farbe dar, die durch den Verdeckungswert geändert wird.
  • zBias-Typ: float. Stellt den Betrag der auf die Verdeckung angewendeten Umgebungs-Tiefenverzerrung dar.

META_DEPTH_OCCLUDE_OUTPUT_PREMULTIPLY(input, output, zBias)

Beschreibung
Wird im Fragment-Shader verwendet. Ändert die Ausgabefarbe automatisch, um den Wert für die Verdeckung an Position „posWorld“ zu berücksichtigen.
Parameter:
  • input-Typ: struct. Stellt die Eingabestruktur des Fragment-Shaders dar.
  • output-Typ: float4. Stellt die endgültige Fragment-Shader-Farbe dar, die durch den Verdeckungswert geändert wird.
  • zBias-Typ: float. Stellt den Betrag der auf die Verdeckung angewendeten Umgebungs-Tiefenverzerrung dar.

Verwendungsbeispiel

Shader "Depth/Unlit"
{
    Properties
    {
        [MainColor] _BaseColor("Base Color", Color) = (1, 1, 1, 1)
    }

    SubShader
    {
        Tags { "RenderType" = "Opaque" }

        // 0. It's important to have One OneMinusSrcAlpha so it blends properly against transparent background (passthrough)
        Blend SrcAlpha OneMinusSrcAlpha, One OneMinusSrcAlpha

        Pass
        {
            HLSLPROGRAM

            #pragma vertex vert
            #pragma fragment frag

            // 1. Keywords are used to enable different occlusions
            #pragma multi_compile _ HARD_OCCLUSION SOFT_OCCLUSION

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

            // 2. Include the file with utility functions
            #include "Packages/com.meta.xr.sdk.core/Shaders/EnvironmentDepth/URP/EnvironmentOcclusionURP.hlsl"

            // if your shaders are in a BiRP project, you would add this include instead:
            //#include "Packages/com.meta.xr.sdk.core/Shaders/EnvironmentDepth/BiRP/EnvironmentOcclusionBiRP.hlsl"

            struct Attributes
            {
                float4 vertex : POSITION;

                UNITY_VERTEX_INPUT_INSTANCE_ID
            };

            struct Varyings
            {
                float4 positionCS : SV_POSITION;

                // 3. This macro adds 'posWorld' to the varyings struct.
                //    The subsequent macros require this field to be named as such.
                //    The number has to be filled with the recent TEXCOORD number + 1
                //    Or 0 as in this case, if there are no other TEXCOORD fields
                META_DEPTH_VERTEX_OUTPUT(0)

                UNITY_VERTEX_INPUT_INSTANCE_ID
                // 4. The fragment shader needs to understand to which eye it's currently
                //    rendering, in order to get depth from the correct texture.
                UNITY_VERTEX_OUTPUT_STEREO
            };

            CBUFFER_START(UnityPerMaterial)
                half4 _BaseColor;
            CBUFFER_END

            Varyings vert(Attributes input)
            {
                Varyings output;

                UNITY_SETUP_INSTANCE_ID(input);
                UNITY_TRANSFER_INSTANCE_ID(input, output);

                output.positionCS = TransformObjectToHClip(input.vertex.xyz);

                // 5. World position is required to calculate the occlusions.
                //    This macro will calculate and set world position value in the output Varyings structure.
                META_DEPTH_INITIALIZE_VERTEX_OUTPUT(output, input.vertex);

                // 6. Passes stereo information to frag shader
                UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);

                return output;
            }

            half4 frag(Varyings input) : SV_Target
            {
                UNITY_SETUP_INSTANCE_ID(input);
                // 7. Initializes global stereo constant for the frag shader
                UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);

                half4 finalColor = _BaseColor;

                // 8. A third macro required to enable occlusions.
                //    It requires previous macros to be there as well as the naming behind the macro is strict.
                //    It will enable soft or hard occlusions depending on the current keyword set.
                //    finalColor value will be multiplied by the occlusion visibility value.
                //    Occlusion visibility value is 0 if virtual object is completely covered by environment and vice versa.
                //    Fully occluded pixels will be discarded
                META_DEPTH_OCCLUDE_OUTPUT_PREMULTIPLY(input, finalColor, 0);

                return finalColor;
            }
            ENDHLSL
        }
    }
}