Неверный индекс в единственном шейдере - PullRequest
0 голосов
/ 21 октября 2019

Я довольно новичок в кодировании шейдеров, но я сделал это, сгруппировав 2 неосвещенных шейдера. Когда я пытаюсь создать этот шейдер, который предназначен для создания контура и позволяет мне интерполировать 2 текстуры, единство говорит мне, что есть эта ошибка: недопустимаянижний индекс `vertex´ в строке 61

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

Shader "Unlit/Combined"
{
    Properties
    {
        _MainTex("Texture", 2D) = "white" {}
        _SecondaryTex("Secondary 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"  "Queue" = "Transparent"}
            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 outvertex : SV_POSITION;
                    float4 pos : POSITION;
                    float3 normal : NORMAL;
                };

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

                v2f vert(appdata v)
                {
                    v2f o;
                    v.vertex.xyz *= _OutlineWidth;
                    o.outvertex = UnityObjectToClipPos(v.vertex);
                    o.pos = UnityObjectToClipPos(v.vertex);
                    o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                    UNITY_TRANSFER_FOG(o,o.vertex);
                    return o;
                }

                fixed4 frag(v2f i) : SV_Target
                {
                    // sample the texture
                    fixed4 col = lerp(tex2D(_MainTex, i.uv),tex2D(_SecondaryTex, i.uv), _LerpValue);

                    return col;
                    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 Ответ

1 голос
/ 21 октября 2019

Строка с ошибкой - строка 61:

v.vertex.xyz *= _OutlineWidth;

Если вы посмотрите на тип, который v объявлен как, он объявлен как appdata:

v2f vert(appdata v)

Если вы посмотрите на определение appdata:

struct appdata
{
    //float4 vertex : POSITION;
    float2 uv : TEXCOORD0;
    float3 normal : NORMAL;
};

Вы увидите, что у него нет свойства vertex, только uv и normal.

Таким образом, строка, которая является проблемой, должна быть заменена на одну из них, вероятно, normal, так как вы пытаетесь изменить ее свойство с 3 значениями (и у uv есть только xy).

v.normal.xyz *= _OutlineWidth;

В качестве альтернативы вы можете изменить appdata, чтобы иметь свойство вершины, откомментировав закомментированный vertex:

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

или удалив строку 61, в зависимости от того, что вы пытаетесь сделать.

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