Accesarea intrării de vertex Input în surf direct fără parametrul vert’s out în Tessellation Shader (Dezvoltarea jocurilor, Unitate, Tessellation, Shaderlab)

Seyed Morteza Kamali a intrebat.
a intrebat.

Pot obține intrarea vertex Input în vertex shader după cum urmează:

   o.worldPos = v.vertex.xyz;

Dar cum pot obține direct worldPos fără a completa parametrul out în funcția vert. Întreb acest lucru deoarece shaderul este unul DX11 Tessellation și parametrul out din funcția vert nu este deloc disponibil.

Practic, vreau să inițializez Input shader-ul meu și să îl trec la surface shader-ul de suprafață în vertex shader.Pot să fac acest lucru, dar este diferit în Tessellation shader, așa că trebuie să accesez poziția vertex-ului în surf direct, fără parametrul out al funcției vert.

Shader "Tessellation Sample" {
        Properties {
            _EdgeLength ("Edge length", Range(2,50)) = 15
            _MainTex ("Base (RGB)", 2D) = "white" {}
            _DispTex ("Disp Texture", 2D) = "gray" {}
            _NormalMap ("Normalmap", 2D) = "bump" {}
            _Displacement ("Displacement", Range(0, 1.0)) = 0.3
            _Color ("Color", color) = (1,1,1,0)
            _SpecColor ("Spec color", color) = (0.5,0.5,0.5,0.5)
        }
        SubShader {
            Tags { "RenderType"="Opaque" }
            LOD 300

            CGPROGRAM
            #pragma surface surf BlinnPhong addshadow fullforwardshadows vertex:disp tessellate:tessEdge nolightmap
            #pragma target 4.6
            #include "Tessellation.cginc"

            float _EdgeLength;

            float4 tessEdge (appdata_full v0, appdata_full v1, appdata_full v2)
            {
                return UnityEdgeLengthBasedTess (v0.vertex, v1.vertex, v2.vertex, _EdgeLength);
            }

            float _Displacement;


            struct Input {
                float4 position  : POSITION;
                float3 worldPos  : TEXCOORD2;   // Used to calculate the texture UVs and world view vector
                float4 proj0     : TEXCOORD3;   // Used for depth and reflection textures
                float4 proj1     : TEXCOORD4;   // Used for the refraction texture
            };

            void disp (inout appdata_full v, out Input o){
            UNITY_INITIALIZE_OUTPUT(Input,o);
            o.worldPos = v.vertex.xyz;
            o.position = UnityObjectToClipPos(v.vertex);
            o.proj0 = ComputeScreenPos(o.position);
            COMPUTE_EYEDEPTH(o.proj0.z);

            o.proj1 = o.proj0;
            #if UNITY_UV_STARTS_AT_TOP
            o.proj1.y = (o.position.w - o.position.y) * 0.5;
            #endif
            }

            sampler2D _MainTex;
            sampler2D _NormalMap;
            fixed4 _Color;

            void surf (Input IN, inout SurfaceOutput o) {
                o.Albedo = float3(0,0,0);
            }
            ENDCG
        }
        FallBack "Diffuse"
    }

dar am o eroare:

Shader error in 'Tessellation Sample': 'disp': no matching 1 parameter function at line 173 (on d3d11)

1 răspunsuri
Jesse Farag

Este un bug

Pentru o soluție de rezolvare, aruncați o privire la Post #13Ideea din spatele acestui lucru este de a folosi atributele de vertex nefolosite pentru a trece datele tale personalizate.