unity3d 在增强现实中使用平面进行剪裁时,表面着色器出现问题

ncecgwcz  于 2023-02-19  发布在  其他
关注(0)|答案(1)|浏览(156)

我想在Unity中裁剪一个带有平面的3D模型,找到了this great tutorial,并让它在通常的Unity环境中轻松工作。本教程使用表面着色器来裁剪平面上方的所有部分,只显示平面下方的部分,这样你就有了切开3D模型的感觉(参见链接教程中的GIF)。表面着色器的代码如下:

Shader "Clippingplane" {
    Properties {
        _Color ("Tint", Color) = (0, 0, 0, 1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _Smoothness ("Smoothness", Range(0, 1)) = 0
        _Metallic ("Metalness", Range(0, 1)) = 0
        [HDR] _Emission ("Emission", color) = (0,0,0)

        [HDR]_CutoffColor("Cutoff Color", Color) = (1,0,0,0)
    }
    SubShader {
        Tags{ "RenderType"="Opaque" "Queue"="Geometry"}

        // render faces regardless if they point towards the camera or away from it
        Cull Off

        CGPROGRAM

        #pragma surface surf Standard fullforwardshadows
        #pragma target 3.0

        sampler2D _MainTex;
        fixed4 _Color;

        half _Smoothness;
        half _Metallic;
        half3 _Emission;

        float4 _Plane;

        float4 _CutoffColor;

        struct Input {
            float2 uv_MainTex;
            float3 worldPos;
            float facing : VFACE;
        };

        void surf (Input i, inout SurfaceOutputStandard o) {
            //calculate signed distance to plane
            float distance = dot(i.worldPos, _Plane.xyz);
            distance = distance + _Plane.w;
            //discard surface above plane
            clip(-distance);

            float facing = i.facing * 0.5 + 0.5; //convert facing from -1/1 to 0/1 for linear interpolation

            //normal color stuff
            fixed4 col = tex2D(_MainTex, i.uv_MainTex);
            col *= _Color;
            o.Albedo = col.rgb * facing;
            o.Metallic = _Metallic * facing;
            o.Smoothness = _Smoothness * facing;
            o.Emission = lerp(_CutoffColor, _Emission, facing); // lerp = linear interpolation

        }
        ENDCG
    }
    FallBack "Standard"
}

现在我想把在3D模型中移动剪切平面的整个交互转换成增强现实,我使用ARFoundation和ARCore来实现这一点。
由于某些原因,着色器在AR中不再像预期的那样工作了。“内部颜色”(红色)覆盖了整个模型本身,而不仅仅是模型被切开的部分。看起来着色器再也不能区分外部和内部了?然而,剪切部分工作了。
Screenshot of the whole 3D model showing in red
我玩了一会儿,但只是让它工作,以显示正确的颜色没有剪辑部分的工作。特别是与facing变量的一部分,它的转换似乎是一个混乱的结果。我真的不知道那么多关于着色器,所以我想知道,如果有人能指出我在正确的方向发生了什么与法线和东西?教程中的表面着色器在AR中工作正常,但省略了“显示内部”部分。超级奇怪,着色器在通常的Unity环境中工作,而不是在AR中。任何帮助感谢!

rdlzhqv9

rdlzhqv91#

再多玩一点,我就找到了我的解决方案,我可能还没有测试够...好像AR已经提供了从0到1的VFACE,所以转换它会出错。我只是删除了转换部分,只剩下:
float facing = i.facing;
这似乎做的工作!希望这有助于任何人试图剪辑的东西在AR与表面着色器。

相关问题