【问题标题】:Spherical mapping球面映射
【发布时间】:2017-11-27 10:03:30
【问题描述】:

我无法将对象(例如平面)投影到球面上。

着色器只需获取顶点局部位置 (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
   }
}

现在的问题是,在场景中,我有一些带有这个着色器的平面,它们看起来是分裂的,而且比他们应该的要少得多。有什么想法吗?

编辑

以下是一些截图:

【问题讨论】:

  • 您可以发布来自 Unity 的输入和输出对象的快照吗?

标签: unity3d geometry shader hlsl vertex-shader


【解决方案1】:

您正在将 world_vertex 转换为方向 (X,Y,Z,0) 而不是位置 (X,Y,Z,1)。有关更多信息,请参阅this

所以这条线
v.vertex = mul(unity_WorldToObject, world_vertex);
应该是
v.vertex = mul(unity_WorldToObject, float4(world_vertex, 1) );

【讨论】:

  • 非常感谢,我会阅读您链接的教程至少八遍!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-05
  • 1970-01-01
  • 1970-01-01
  • 2012-12-27
  • 1970-01-01
  • 2011-03-19
  • 2013-07-03
相关资源
最近更新 更多