Unity Surface Shader - 运行时UV映射

时间:2017-12-07 17:01:43

标签: unity3d textures shader procedural-generation uv-mapping

我想在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)它始终为零,但我不明白为什么。

请帮助我理解我做错了什么

1 个答案:

答案 0 :(得分:0)

在“ Surface Shader输入结构

下查看https://docs.unity3d.com/Manual/SL-SurfaceShaders.html

uv_MainTex 会自动生成,因此手动设置可能会产生一些问题。您可能希望在输入结构中使用另一个自定义名称。

旁注:您应该在顶点着色器中执行所有算术运算,因为无论如何它们都是线性变换。