Unity3d 统一世界空间着色器渐变颜色

Unity3d 统一世界空间着色器渐变颜色,unity3d,kinect,Unity3d,Kinect,我正在做一个unity项目,从Microsoft Kinect获取深度数据,并用这些数据构建一个统一的地形。我使用世界空间着色器用渐变色给地形上色。我当前的问题是,只有在场景视图中放大时才能看到渐变。缩小时,所有颜色都会消失。请参见下面的屏幕截图。我和它斗争了很长时间。有人知道问题出在哪里吗?多谢各位 Shader“自定义/地形世界空间着色器”{ 性质{ _颜色(“基本颜色”,颜色)=(1,1,1,1)//白色 _高度0(“纹理0的最大高度”,浮动)=2.0 _Textre0(“纹理0(RG

我正在做一个unity项目,从Microsoft Kinect获取深度数据,并用这些数据构建一个统一的地形。我使用世界空间着色器用渐变色给地形上色。我当前的问题是,只有在场景视图中放大时才能看到渐变。缩小时,所有颜色都会消失。请参见下面的屏幕截图。我和它斗争了很长时间。有人知道问题出在哪里吗?多谢各位

Shader“自定义/地形世界空间着色器”{
性质{
_颜色(“基本颜色”,颜色)=(1,1,1,1)//白色
_高度0(“纹理0的最大高度”,浮动)=2.0
_Textre0(“纹理0(RGB)”,2D)=“表面”{}
_高度1(“纹理1的最大高度”,浮动)=4.0
_Textre1(“纹理1(RGB)”,2D)=“表面”{}
_高度2(“纹理1的最大高度”,浮动)=6.0
_纹理2(“纹理2(RGB)”,2D)=“表面”{}
_高度3(“纹理1的最大高度”,浮动)=8.0
_纹理3(“纹理3(RGB)”,2D)=“表面”{}
_高度4(“纹理1的最大高度”,浮动)=10.0
_纹理4(“纹理4(RGB)”,2D)=“表面”{}
_高度5(“纹理1的最大高度”,浮动)=12.0
_纹理5(“纹理5(RGB)”,2D)=“表面”{}
_高度6(“纹理1的最大高度”,浮动)=14.0
_纹理6(“纹理6(RGB)”,2D)=“表面”{}
_高度7(“纹理1的最大高度”,浮动)=16.0
_纹理7(“纹理7(RGB)”,2D)=“表面”{}
_高度8(“纹理1的最大高度”,浮动)=18.0
_纹理8(“纹理8(RGB)”,2D)=“表面”{}
_高度9(“纹理1的最大高度”,浮动)=20.0
_纹理9(“纹理9(RGB)”,2D)=“表面”{}
_高度10(“纹理1的最大高度”,浮动)=22.0
_纹理10(“纹理10(RGB)”,2D)=“表面”{}
_高度11(“纹理1的最大高度”,浮动)=24.0
_纹理11(“纹理11(RGB)”,2D)=“表面”{}
_高度12(“纹理1的最大高度”,浮动)=26.0
_纹理12(“纹理12(RGB)”,2D)=“表面”{}
_纹理13(“纹理13(RGB)”,2D)=“表面”{}
_比例(“纹理比例”,浮动)=1.0
}
子阴影{
标记{“RenderType”=“不透明”}
CGP程序
#布拉格面浪朗伯
结构输入{
浮动3正常;
第3世界邮政;
};
取样器2D_纹理0;
取样器2D_纹理1;
取样器2D_纹理2;
取样器2D_纹理3;
取样器2D_纹理4;
取样器2D_纹理5;
取样器2D_纹理6;
取样器2D_纹理7;
取样器2D_纹理8;
取样器2D_纹理9;
取样器2D_纹理10;
取样器2D_纹理11;
取样器2D_纹理12;
取样器2D_纹理13;
浮动高度0;
浮动高度1;
浮动高度2;
浮动高度3;
浮动高度4;
浮动高度5;
浮动高度6;
浮动高度7;
浮动高度8;
浮动高度9;
浮动高度10;
浮动高度11;
浮动高度12;
浮色;
浮标;
void surf(输入、输入、输出表面输出){
2紫外线;
固定4c;
UV=IN.worldPos.xz;
如果(在世界位置y中<_高度0){
c=tex2D(_纹理0,UV*_比例);
}
否则如果(IN.worldPos.y>=\u高度0和IN.worldPos.y<\u高度1){
c=tex2D(纹理1,UV*比例);
}
否则如果(IN.worldPos.y>=\u高度1和IN.worldPos.y<\u高度2){
c=tex2D(纹理2,UV*比例);
}
否则如果(IN.worldPos.y>=\u高度2和IN.worldPos.y<\u高度3){
c=tex2D(纹理3,UV*比例);
}
否则如果(IN.worldPos.y>=\u高度3和IN.worldPos.y<\u高度4){
c=tex2D(_纹理4,UV*_比例);
}
否则如果(IN.worldPos.y>=\u高度4和IN.worldPos.y<\u高度5){
c=tex2D(纹理5,UV*比例);
}
否则如果(IN.worldPos.y>=\u高度5和IN.worldPos.y<\u高度6){
c=tex2D(纹理6,UV*比例);
}
else if(IN.worldPos.y>=\u高度6和IN.worldPos.y<\u高度7){
c=tex2D(纹理7,UV*比例);
}
else if(IN.worldPos.y>=\u高度7和IN.worldPos.y<\u高度8){
c=tex2D(_纹理8,UV*_比例);
}
否则如果(IN.worldPos.y>=\u高度8和IN.worldPos.y<\u高度9){
c=tex2D(_纹理9,UV*_比例);
}
否则如果(IN.worldPos.y>=\u高度9和IN.worldPos.y<\u高度10){
c=tex2D(纹理10,UV*比例);
}
否则如果(IN.worldPos.y>=\u高度10和IN.worldPos.y<\u高度11){
c=tex2D(_纹理11,UV*_比例);
}
否则如果(IN.worldPos.y>=\u高度11和IN.worldPos.y<\u高度12){
c=tex2D(纹理12,UV*比例);
}
else if(IN.worldPos.y>=\u高度12){
c=tex2D(纹理13,UV*比例);
}
o、 反照率=c.rgb*\u颜色;
}
ENDCG
}
回退“顶点照明”
}

使用较大的数字设置地形“底图距离”设置,所有渐变颜色都会显示出来

由于似乎正在应用着色器,最可能的罪魁祸首是着色器本身。也许它使用的是相机空间而不是世界空间?如果你发了一篇文章,那会有帮助。@rutter谢谢你的回答。我附上了我的着色器代码,你能指出区别吗?谢谢你,我知道了。这是“底图距离”设置。
Shader "Custom/Terrain World Space Shader" {

   Properties{
  _Color("Basic Color", Color) = (1,1,1,1) // White colorr
  _Height0("Max Height for Texture 0", float) = 2.0
  _Textre0("Texture 0 (RGB)", 2D) = "surface" {}
  _Height1("Max Height for Texture 1", float) = 4.0
  _Textre1("Texture 1 (RGB)", 2D) = "surface" {}
  _Height2("Max Height for Texture 1", float) = 6.0
  _Texture2("Texture 2 (RGB)", 2D) = "surface" {}
  _Height3("Max Height for Texture 1", float) = 8.0
  _Texture3("Texture 3 (RGB)", 2D) = "surface" {}
  _Height4("Max Height for Texture 1", float) = 10.0
  _Texture4("Texture 4 (RGB)", 2D) = "surface" {}
  _Height5("Max Height for Texture 1", float) = 12.0
  _Texture5("Texture 5 (RGB)", 2D) = "surface" {}
  _Height6("Max Height for Texture 1", float) = 14.0
  _Texture6("Texture 6 (RGB)", 2D) = "surface" {}
  _Height7("Max Height for Texture 1", float) = 16.0
  _Texture7("Texture 7 (RGB)", 2D) = "surface" {}
  _Height8("Max Height for Texture 1", float) = 18.0
  _Texture8("Texture 8 (RGB)", 2D) = "surface" {}
  _Height9("Max Height for Texture 1", float) = 20.0
  _Texture9("Texture 9 (RGB)", 2D) = "surface" {}
  _Height10("Max Height for Texture 1", float) = 22.0
  _Texture10("Texture 10 (RGB)", 2D) = "surface" {}
  _Height11("Max Height for Texture 1", float) = 24.0
  _Texture11("Texture 11 (RGB)", 2D) = "surface" {}
  _Height12("Max Height for Texture 1", float) = 26.0
  _Texture12("Texture 12 (RGB)", 2D) = "surface" {}
  _Texture13("Texture 13 (RGB)", 2D) = "surface" {}
  _Scale("Texture Scale", Float) = 1.0
   }

  SubShader{
  Tags{ "RenderType" = "Opaque" }

  CGPROGRAM
  #pragma surface surf Lambert

  struct Input {
  float3 worldNormal;
  float3 worldPos; 
  };

  sampler2D _Texture0;
  sampler2D _Texture1;
  sampler2D _Texture2;
  sampler2D _Texture3;
  sampler2D _Texture4;
  sampler2D _Texture5;
  sampler2D _Texture6;
  sampler2D _Texture7;
  sampler2D _Texture8;
  sampler2D _Texture9;
  sampler2D _Texture10;
  sampler2D _Texture11;
  sampler2D _Texture12;
  sampler2D _Texture13;
  float _Height0;
  float _Height1;
  float _Height2;
  float _Height3;
  float _Height4;
  float _Height5;
  float _Height6;
  float _Height7;
  float _Height8;
  float _Height9;
  float _Height10;
  float _Height11;
  float _Height12;
  float4 _Color;
  float _Scale;

  void surf(Input IN, inout SurfaceOutput o) {
     float2 UV;
     fixed4 c;
     UV = IN.worldPos.xz;
     if (IN.worldPos.y < _Height0) {
        c = tex2D(_Texture0, UV* _Scale);
     }
     else if (IN.worldPos.y >= _Height0 && IN.worldPos.y < _Height1) {
        c = tex2D(_Texture1, UV* _Scale);
     }
     else if (IN.worldPos.y >= _Height1 && IN.worldPos.y < _Height2) {
        c = tex2D(_Texture2, UV* _Scale);
     }
     else if (IN.worldPos.y >= _Height2 && IN.worldPos.y < _Height3) {
        c = tex2D(_Texture3, UV* _Scale);
     }
     else if (IN.worldPos.y >= _Height3 && IN.worldPos.y < _Height4) {
        c = tex2D(_Texture4, UV* _Scale);
     }
     else if (IN.worldPos.y >= _Height4 && IN.worldPos.y < _Height5) {
        c = tex2D(_Texture5, UV* _Scale);
     }
     else if (IN.worldPos.y >= _Height5 && IN.worldPos.y < _Height6) {
        c = tex2D(_Texture6, UV* _Scale);
     }
     else if (IN.worldPos.y >= _Height6 && IN.worldPos.y < _Height7) {
        c = tex2D(_Texture7, UV* _Scale);
     }
     else if (IN.worldPos.y >= _Height7 && IN.worldPos.y < _Height8) {
        c = tex2D(_Texture8, UV* _Scale);
     }
     else if (IN.worldPos.y >= _Height8 && IN.worldPos.y < _Height9) {
        c = tex2D(_Texture9, UV* _Scale);
     }
     else if (IN.worldPos.y >= _Height9 && IN.worldPos.y < _Height10) {
        c = tex2D(_Texture10, UV* _Scale);
     }
     else if (IN.worldPos.y >= _Height10 && IN.worldPos.y < _Height11) {
        c = tex2D(_Texture11, UV* _Scale);
     }
     else if (IN.worldPos.y >= _Height11 && IN.worldPos.y < _Height12) {
        c = tex2D(_Texture12, UV* _Scale);
     }
     else if (IN.worldPos.y >= _Height12) {
        c = tex2D(_Texture13, UV* _Scale);
     }
     o.Albedo = c.rgb * _Color;
  }

  ENDCG
}

 Fallback "VertexLit"
}