C# unity着色器中的下标无效
我对着色器编码相当陌生,但我通过将2个未发光着色器分组来实现这一点 当我尝试制作这个着色器时,它是为了创建一个轮廓并让我插值2个纹理,unity告诉我有一个错误:第61行的下标“vertex”无效 我试过一些方法,但我不能让这个着色器正常工作,如果有人知道我必须做什么,我会非常感激C# unity着色器中的下标无效,c#,visual-studio,unity3d,shader,C#,Visual Studio,Unity3d,Shader,我对着色器编码相当陌生,但我通过将2个未发光着色器分组来实现这一点 当我尝试制作这个着色器时,它是为了创建一个轮廓并让我插值2个纹理,unity告诉我有一个错误:第61行的下标“vertex”无效 我试过一些方法,但我不能让这个着色器正常工作,如果有人知道我必须做什么,我会非常感激 Shader "Unlit/Combined" { Properties { _MainTex("Texture", 2D) = "white" {} _Seconda
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
}
}
}
}
有问题的线路是第61行:
v.vertex.xyz *= _OutlineWidth;
如果查看v
声明为的类型,则其声明为appdata
:
v2f vert(appdata v)
struct appdata
{
//float4 vertex : POSITION;
float2 uv : TEXCOORD0;
float3 normal : NORMAL;
};
如果查看appdata
的定义:
v2f vert(appdata v)
struct appdata
{
//float4 vertex : POSITION;
float2 uv : TEXCOORD0;
float3 normal : NORMAL;
};
您将看到它没有vertex
属性,只有uv
和normal
因此,当您试图修改它的3值属性时(uv只有xy
),问题所在的行应该更改为其中一行,可能是normal
)
或者,您可以通过取消注释已注释掉的顶点来修改appdata
以具有顶点属性:
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
float3 normal : NORMAL;
};
或者通过删除第61行,根据您试图执行的操作。取消注释时的问题是我有3个错误:输出语义POSITION
和输出语义SV\u POSITION
输入语义SV\u POSITION
和输入语义POSITION
输出语义SV\u POSITION
和输出语义POSITION
你说了三个错误,列出了6行,但没有说是哪一行。我列出了其中的3行;它们是复制的系统值:1:输出语义位置和输出语义SV_位置//2:输入语义SV_位置和输入语义位置//3:输出语义SV_位置和输出语义位置//行位于结构v2f上,在代码请求处我道歉,我看不懂你把它们贴在一起的样子。无论如何,注释掉第45行和第62行。您已经复制了输出顶点位置(这两个字段都被设置为相同的值,因此您不需要两个字段,这正是错误告诉您的:“复制的语义”)。