在Unity中使用ShaderLab剪切椭圆形状的区域

问题描述 投票:1回答:1

我正在尝试在Unity中使用着色器绘制椭圆体

按照步骤1.我在一些互联网教程的帮助下编写了一个自定义着色器2.在材质上添加了着色器3.将该材料应用于对象

Shader "Custom/HoleMaker" {
    Properties{
            _Position("Position", Vector) = (0,0,0,0)
            _Radius("Radius", Range(0,1)) = 0.01
            _Color("Color", Color) = (1,1,1,1)
            _CutawayColor("Cutaway Color", Color) = (1,1,1,1)
    }
            SubShader{
                    Tags { "RenderType" = "Opaque"}
                    LOD 200
                    Cull Front

                    CGPROGRAMtypes
                    #pragma surface surf MonoColor fullforwardshadows vertex:vert

                    // Use shader model 3.0 target, to get nicer looking lighting
                    #pragma target 3.0

                    fixed4 _CutawayColor;

                    float4 _Position;
                    float _Radius;

                    struct Input
                    {
                            float2 uv_MainTex;
                            float3 worldPos;
                    };

                    void vert(inout appdata_full v, out Input o)
                    {
                            UNITY_INITIALIZE_OUTPUT(Input, o);
                            v.normal *= -1;
                    }

                    half4 LightingMonoColor(SurfaceOutput s, half3 lightDir, half atten) {
                            return _CutawayColor;
                    }

                    void surf(Input IN, inout SurfaceOutput o)
                    {

                            //spherical clipping
                            float dist = distance(IN.worldPos.xyz, _Position.xyz);
                            if (dist < _Radius)
                                    clip(-1);


                            o.Albedo = _CutawayColor.rgb;
                    }
                    ENDCG
            }
                    FallBack "Diffuse"
   }

此代码可用于制作圆,但是当我尝试使用功能clip()制作椭圆形时,它不起作用。根据文档,还可以使用clip(float4 x)来修剪表面。变量_Radius在世界空间中是一个完美的球体,但是当我尝试使用_Radius.x和_Radius.y时,代码不起作用。请参阅随附的图像。

enter image description here

unity3d glsl shader shaderlab
1个回答
2
投票
_Radius.x_Radius.y破坏了着色器,因为_Radiusfloat。它没有xy成员。它怎么可能有_Radius.y的值?

相反,请考虑添加Scale属性,然后将世界位置和_Position之间的差异缩放该数量,然后将差异的大小与_radius进行比较:

Shader "Custom/HoleMaker" { Properties{ _Position("Position", Vector) = (0,0,0,0) _Scale("Scale", Vector) = (1,1,1,0) _Radius("Radius", Range(0,1)) = 0.01 _Color("Color", Color) = (1,1,1,1) _CutawayColor("Cutaway Color", Color) = (1,1,1,1) } SubShader{ Tags { "RenderType" = "Opaque"} LOD 200 Cull Front CGPROGRAMtypes #pragma surface surf MonoColor fullforwardshadows vertex:vert // Use shader model 3.0 target, to get nicer looking lighting #pragma target 3.0 fixed4 _CutawayColor; float4 _Position; float4 _Scale; float _Radius; struct Input { float2 uv_MainTex; float3 worldPos; }; void vert(inout appdata_full v, out Input o) { UNITY_INITIALIZE_OUTPUT(Input, o); v.normal *= -1; } half4 LightingMonoColor(SurfaceOutput s, half3 lightDir, half atten) { return _CutawayColor; } void surf(Input IN, inout SurfaceOutput o) { //spherical clipping float dist = length(_Scale.xyz * IN.worldPos.xyz - _Position.xyz); if (dist < _Radius) clip(-1); o.Albedo = _CutawayColor.rgb; } ENDCG } FallBack "Diffuse" }

热门问题
推荐问题
最新问题