着色器(Unity)中的系统值重复

问题描述 投票:0回答:1

我对脚本着色器非常陌生,我正尝试使未着色的着色器工作,因此它会在对象周围生成轮廓,并允许我在2种不同的纹理之间进行插值,但出现3个错误:

·'Unlit / Both'中的着色器错误:系统值语义定义重复:第38行的输出语义'POSITION'和输出语义'SV_POSITION'·“ Unlit / Both”中的着色器错误:系统值语义定义重复:在第39行输入语义“ SV_POSITION”和输入语义“ POSITION”·“ Unlit / Both”中的着色器错误:系统值语义定义重复:在行39处输出语义“ SV_POSITION”和输出语义“ POSITION”]

我想位置值有问题,但是如果有人知道如何解决,我不知道该怎么办,我将非常感激

{
     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
                }
            }
    }
}

我对脚本着色器非常陌生,我正尝试使未着色的着色器工作,因此它会在对象周围生成轮廓,并让我在2种不同的纹理之间进行插值,但出现3个错误:•...

c# unity3d shader
1个回答
0
投票
[当您要将数据从顶点着色器传递到像素着色器时,您需要使用TEXCOORD作为语义,在这种情况下,您应该将'POSITION'语义更改为'TEXCOORD2'(在v2f结构中)。

语义将指定您要传递的数据(实际上是如何解释数据)。管道的第一阶段是IA(输入汇编程序)将数据从IA传递到顶点着色器时使用知道您正在使用哪个属性的语义,例如,在“ appdata”结构中,顶点是POSITION,因此当数据(例如几何图形,3d对象)传递到IA阶段时,您需要知道正在使用哪个属性GPU,因此,通过使用语义,您可以轻松地找到每个对象的属性(每个对象必须具有位置,并且最好具有法线,切线,颜色等。)
© www.soinside.com 2019 - 2024. All rights reserved.