我想在Unity中使用顶点局部位置将2D纹理映射到程序生成的平面上。这是代码:
Shader "Custom/planeTest"
{
Properties
{
_MainTex("Albedo (RGB)", 2D) = "white" {}
_Scale("Scale of texture", Vector) = (0.0, 0.0, 0.0)
_Offset("Offset of texture", Vector) = (0.0, 0.0, 0.0)
}
SubShader
{
CGPROGRAM
#pragma surface surf Standard vertex:vert
#pragma target 3.0
sampler2D _MainTex;
float3 _Scale;
float3 _Offset;
struct Input {
float2 uv_MainTex;
};
void vert(inout appdata_full v, out Input o)
{
UNITY_INITIALIZE_OUTPUT(Input, o);
o.uv_MainTex = mul(unity_ObjectToWorld, v.vertex).xz;
}
void surf(Input IN, inout SurfaceOutputStandard o)
{
float2 _uv = (IN.uv_MainTex.x * _Scale.x, IN.uv_MainTex.y * _Scale.y) + _Offset.xy;
o.Albedo = tex2D(_MainTex, _uv).rgb;
}
ENDCG
}
Fallback "Diffuse"
}
我不明白为什么,但这会使飞机的颜色变得均匀。我可以使用的唯一选项是_Offset,它可以改变整个平面的颜色。我认为(IN.uv_MainTex.x * _Scale.x,IN.uv_MainTex.y * _Scale.y)它总是为零,但我不明白为什么。
请帮我理解我做错了什么
在“Surface Shader输入结构”下检查https://docs.unity3d.com/Manual/SL-SurfaceShaders.html
uv_MainTex是自动生成的,因此手动设置可能会产生一些问题。您可能希望在输入结构中使用另一个自定义名称。
旁注:您应该在顶点着色器中执行所有算术运算,因为无论如何它们都是线性变换。