【问题标题】:Unity Surface Shader - Runtime UV mappingUnity Surface Shader - 运行时 UV 映射
【发布时间】:2018-05-21 20:38:42
【问题描述】:

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

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

【问题讨论】:

  • 我想你的意思是说float2 _uv = float2(IN.uv_MainTex.x ...。您还可以编写组件乘法,例如 float2 _uv = IN.uv_MainTex*_Scale.xy +_Offset.xy
  • 谢谢,我不知道!

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


【解决方案1】:

在“Surface Shader input structure”下查看https://docs.unity3d.com/Manual/SL-SurfaceShaders.html

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-21
    • 2019-08-07
    • 2022-09-02
    • 2014-12-06
    • 2011-11-28
    • 2021-03-30
    相关资源
    最近更新 更多