【发布时间】: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