球面映射

时间:2017-11-27 10:03:31

标签: unity3d geometry shader hlsl vertex-shader

我无法将物体(例如飞机)投射到球面上。

着色器只需要取本地位置(P0),将其转换为世界坐标(P1),然后找到从给定中心(C)到P1(P1-C)的向量。因此,将此向量标准化并乘以给定系数,最后转换回本地坐标。

我在Unity中使用表面着色器

Shader "Custom/testShader" {
   Properties {
      _MainTex("texture", 2D) = "white" {}
      _Center("the given center", Vector) = (0,0,0)
      _Height("the given coefficient", Range(1, 1000) = 10
   }
   Subshader {
      CGPROGRAM
      #pragma surface surf Standard vertex:vert
      sampler2D _MainTex;
      float3 _Center;
      float _Height;

      struct Input { float2 uv_MainTex; }

      // IMPORTANT STUFF
      void vert (inout appdata_full v) {
         float3 world_vertex = mul(unity_ObjectToWorld, v.vertex) - _Center;
         world_vertex = normalize(world_vertex) * _Height;
         v.vertex = mul(unity_WorldToObject, world_vertex);
      }
      // END OF IMPORTANT STUFF

      void surf (Input IN, inout SurfaceOutputStandard o) {
         o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;
      }
      ENDCG
   }
}

现在的问题是,在场景中,我有一些带有这个着色器的飞机,它们看起来分裂,而且它们应该是什么样的。有什么想法吗?

修改

以下是一些截图: The meshes without the shader The same meshes with the shader

1 个答案:

答案 0 :(得分:4)

您正在将List<T>转换为方向(world_vertex)而非位置(X,Y,Z,0)。有关详细信息,请参阅this

所以这一行
X,Y,Z,1
应该是 v.vertex = mul(unity_WorldToObject, world_vertex);