Unity worldPos相对方向

时间:2016-03-27 18:46:10

标签: unity3d coordinates shader hlsl cg

我试图从Unity手册中编写类似于this one的着色器,它通过Clip()函数丢弃几乎水平环中的像素来“切片”对象。

  Shader "Example/Slices" {
    Properties {
      _MainTex ("Texture", 2D) = "white" {}
      _BumpMap ("Bumpmap", 2D) = "bump" {}
    }
    SubShader {
      Tags { "RenderType" = "Opaque" }
      Cull Off
      CGPROGRAM
      #pragma surface surf Lambert
      struct Input {
          float2 uv_MainTex;
          float2 uv_BumpMap;
          float3 worldPos;
      };
      sampler2D _MainTex;
      sampler2D _BumpMap;
      void surf (Input IN, inout SurfaceOutput o) {
          clip (frac((IN.worldPos.y+IN.worldPos.z*0.1) * 5) - 0.5);
          o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
          o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap));
      }
      ENDCG
    } 
    Fallback "Diffuse"
  }

而不仅仅是水平线,我希望能够以任意角度切片。我通过实验发现(因为我是编码着色器的新手),worldPos Z上的乘数确实改变了切片的角度,所以我为它设置了一个属性变量:

clip (frac((IN.worldPos.y+IN.worldPos.z*_MYANGLEVARIABLE) * 5) - 0.5);

然而,这有两个问题。 1)最多1.0的值将线条旋转最多45度,但超过此值,线条开始变为“波浪形”"并且卷入各种模式而不是整齐的线条; 2)这仅在面朝向正X轴或负X轴时才有效。当面对Z时,线条不会移动,当面向Y时,它们会变大但不会旋转。

IN.worldPos.y更改为IN.worldPos.x可以达到您所期望的效果 - 类似的情况,但在Z而不是X中按预期工作。

任何想法如何 1)实现任意角度? 2)无论面向哪个方向,他们都能工作吗?

我使用的是worlPos,因为我总是希望线条相对于对象而不是屏幕空间,但也许还有另一种方式?我的实际着色器是片段而不是表面着色器&我将worldPos从vert传递给了frag。

非常感谢

1 个答案:

答案 0 :(得分:0)

要获得任意角度,您可以使用法线向量和使用点积的剪辑定义平面。

Shader "Example/Slices" {
  Properties {
    _MainTex ("Texture", 2D) = "white" {}
    _BumpMap ("Bumpmap", 2D) = "bump" {}
    _PlaneNormal ("Plane Normal", Vector) = (0, 1, 0)
  }
  SubShader {
    Tags { "RenderType" = "Opaque" }
    Cull Off
    CGPROGRAM
    #pragma surface surf Lambert
    struct Input {
        float2 uv_MainTex;
        float2 uv_BumpMap;
        float3 worldPos;
    };
    sampler2D _MainTex;
    sampler2D _BumpMap;
    float3 _PlaneNormal;
    void surf (Input IN, inout SurfaceOutput o) {
        float d = dot(_PlaneNormal, IN.worldPos);
        clip (frac(d) - 0.5);
        o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
        o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap));
    }
    ENDCG
  } 
  Fallback "Diffuse"
}

这里法线向量越长,切片就越频繁。

如果希望切片相对于对象,则需要使用除worldPos之外的一组坐标。可能这个答案会有所帮助:http://answers.unity3d.com/questions/561900/get-local-position-in-surface-shader.html