Шейдер Unity: синтаксическая ошибка: неожиданный токен '(' в строке 70 (на d3d11) help !!!! - PullRequest
0 голосов
/ 12 марта 2020

необъявленный идентификатор'phereHit 'в строке 82 (на d3d11)

(извините, шейдер) Мне нужна помощь, чтобы выяснить эти ошибки, спасибо ...

Shader "Unlit/VolSDFOne"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}

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



        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // make fog work
            #pragma multi_compile_fog

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                UNITY_FOG_COORDS(1)
                float4 vertex : SV_POSITION;

                float4 pos : SV_POSITION; // Clip space
                float3 wPos : TEXCOORD1; // World position
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;

            v2f vert (appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.wPos = mul(unity_ObjectToWorld, v.vertex).xyz; 
                return o;
            }

            float3 _Centre;
            float _Radius;

            fixed4 frag (v2f i) : SV_Target
            {
                // sample the texture
                fixed4 col = tex2D(_MainTex, i.uv);
                // apply fog
                UNITY_APPLY_FOG(i.fogCoord, col);
                return col;

                float3 worldPosition = i.wPos;
                float3 viewDirection = normalize(i.wPos - _WorldSpaceCameraPos);


                bool sphereHit (float3 p)
                {
                    return distance(p,_Centre) < _Radius;
                }

                #define STEP_SIZE 0.01
                #define STEPS 35

                bool raymarchHit (float3 position, float3 direction)
                {
                    for (int i = 0; i < STEPS; i++)
                    {
                        if ( sphereHit(position) )
                            return true;
                            position += direction * STEP_SIZE;
                    }

                    return false;
                }

                if ( raymarchHit(worldPosition, viewDirection) )
                    return fixed4(1,0,0,1); // Red if hit the ball
                else
                    return fixed4(1,1,1,1); // White otherwise
            }
            ENDCG
        }
    }
}

1 Ответ

0 голосов
/ 12 марта 2020

Вы определяете функции в части шейдера, который выполняется линейно. переместите определения функций за пределы области действия функции fixed4 frag, и она должна работать.

Shader "Unlit/VolSDFOne" { Properties { _MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
    Tags { "RenderType"="Opaque" }
    LOD 100



    Pass
    {
        CGPROGRAM
        #pragma vertex vert
        #pragma fragment frag
        // make fog work
        #pragma multi_compile_fog

        #include "UnityCG.cginc"

        struct appdata
        {
            float4 vertex : POSITION;
            float2 uv : TEXCOORD0;
        };

        struct v2f
        {
            float2 uv : TEXCOORD0;
            UNITY_FOG_COORDS(1)
            float4 vertex : SV_POSITION;

            float4 pos : SV_POSITION; // Clip space
            float3 wPos : TEXCOORD1; // World position
        };

        sampler2D _MainTex;
        float4 _MainTex_ST;

        v2f vert (appdata v)
        {
            v2f o;
            o.pos = UnityObjectToClipPos(v.vertex);
            o.wPos = mul(unity_ObjectToWorld, v.vertex).xyz; 
            return o;
        }

        float3 _Centre;
        float _Radius;

        float3 worldPosition = i.wPos;
        float3 viewDirection = normalize(i.wPos - _WorldSpaceCameraPos);


        bool sphereHit (float3 p)
        {
            return distance(p,_Centre) < _Radius;
        }

        #define STEP_SIZE 0.01
        #define STEPS 35

        bool raymarchHit (float3 position, float3 direction)
        {
            for (int i = 0; i < STEPS; i++)
            {
                if ( sphereHit(position) )
                    return true;
                    position += direction * STEP_SIZE;
            }
            return false;
        }

        fixed4 frag (v2f i) : SV_Target
        {
            // sample the texture
            fixed4 col = tex2D(_MainTex, i.uv);
            // apply fog
            UNITY_APPLY_FOG(i.fogCoord, col);
            //return col;

            if ( raymarchHit(worldPosition, viewDirection) )
                return fixed4(1,0,0,1); // Red if hit the ball
            else
                return fixed4(1,1,1,1); // White otherwise
        }
        ENDCG
    }
}
}

теперь в этом коде все еще могут быть ошибки, но они должны помочь вам в правильном направлении

...