Дублированные системные значения в неосвещенном шейдере (Unity) - PullRequest
0 голосов
/ 27 октября 2019

Я довольно новичок в скриптовых шейдерах, и я пытался заставить работать неосвещенный шейдер, чтобы он генерировал контур вокруг объекта и позволял мне интерполировать между 2 разными текстурами, но я получаю 3 ошибки:

· Шейдерошибка в 'Unlit / Both': дублирующее семантическое определение системного значения: выведите семантическое 'POSITION' и выведите семантическое 'SV_POSITION' в строке 38 · Ошибка шейдера в 'Unlit / Both': копируйте семантическое определение системного значения: введите семантическое 'SV_POSITION' ивведите семантическое 'POSITION' в строке 39 · Ошибка шейдера в 'Unlit / Both': дублирующее семантическое определение системного значения: выведите семантическое 'SV_POSITION' и выведите семантическое 'POSITION' в строку 39

Я думаю, что-то не таксо значениями позиции, но я понятия не имею, что делать, если кто-нибудь знает, как это исправить, я был бы очень благодарен

{
     Properties
    {
        _Color("Main Color", Color) = (0.5,0.5,0.5,1)
        _MainTex ("Texture", 2D) = "white" {}
        _SecondaryTex ("2nd Texture", 2D) = "white" {}
        _LerpValue("Transition float", Range(0,1))= 0.5
        _OutlineColor("Outline color", color) = (0,0,0,1)
        _OutlineWidth("Outline width", Range(1.0,5.0)) = 1.01
    }
    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;
                float3 normal : NORMAL;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                UNITY_FOG_COORDS(1)
                float4 vertex : SV_POSITION;
                float4 pos : POSITION;
                float3 normal : NORMAL;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;
            sampler2D _SecondaryTex;
            float4 _SecondaryTex_ST;
            float4 _LerpValue;
            float _OutlineWidth;
            float4 _OutlineColor;


            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                UNITY_TRANSFER_FOG(o,o.vertex);

                v.vertex.xyz *= _OutlineWidth;
                o.pos = UnityObjectToClipPos(v.vertex);
                return o;   
            }

            fixed4 frag(v2f i) : SV_Target
            {

                fixed4 col = lerp(tex2D(_MainTex, i.uv), tex2D(_SecondaryTex, i.uv),_LerpValue);

                return col;
            }
            ENDCG
        }
    }

    SubShader
    {
            Tags{"Queue" = "Transparent"}

            Pass//Render the Outline
            {
                ZWrite Off

                CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag

                half4 frag(v2f i) : COLOR
                {
                    return _OutlineColor;
                }
                ENDCG
            }

            Pass//Normal render
            {
                ZWrite On

                Material
                {
                    Diffuse[_Color]
                    Ambient[_Color]
                }

                Lighting On

                SetTexture[_MainTex]
                {
                    ConstantColor[_Color]
                }

                SetTexture[_MainTex]
                {
                    Combine previous * primary DOUBLE
                }
            }
    }
}

1 Ответ

0 голосов
/ 27 октября 2019

Если вы хотите передать данные из вершинного шейдера в пиксельный шейдер, вам нужно использовать TEXCOORD в качестве семантики, в этом случае вам следует изменить семантику 'POSITION' на 'TEXCOORD2' (в структуре v2f).

Семантика будет указывать, какие данные вы передаете (на самом деле, как интерпретировать данные). Первым этапом в конвейере является IA (Input Assembler), когда вы передаете данные из IA в вершинный шейдер, который вы используете семантическим, чтобы узнать, какое свойство вы используете, например, в своей структуре 'appdata', вершина - POSITION, поэтому, когда данные (как геометрия, 3d объекты) передается на этап IA, вам нужно знать, какие данные вы используете в графическом процессоре, поэтому с помощью семантики вы можете легко найти свойства каждого объекта (каждый объект должен иметь положение, и лучше иметь нормальный,касательная, цвет, ....)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...