我想在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中。任何帮助感谢!
1条答案
按热度按时间rdlzhqv91#
再多玩一点,我就找到了我的解决方案,我可能还没有测试够...好像AR已经提供了从0到1的
VFACE
,所以转换它会出错。我只是删除了转换部分,只剩下:float facing = i.facing;
这似乎做的工作!希望这有助于任何人试图剪辑的东西在AR与表面着色器。