Unity Surface Shader - 运行时UV映射

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

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

请帮我理解我做错了什么

unity3d textures shader procedural-generation uv-mapping
1个回答
0
投票

在“Surface Shader输入结构”下检查https://docs.unity3d.com/Manual/SL-SurfaceShaders.html

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

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

© www.soinside.com 2019 - 2024. All rights reserved.