Unity中进入游戏对象内部时球体Shader消失问题求助
解决透明球体内部看不到轮廓的问题
非Shader快速方案
- 给球体加一个线框渲染器(Wireframe Renderer):在球体对象上添加
WireframeRenderer组件(Unity自带组件,或Asset Store免费资源如Wireframe Renderer Kit),调整线框颜色和粗细,无论相机内外都能看到球体轮廓线。 - 双球体嵌套:创建两个同球心球体,外层用原有透明材质,内层用低透明度纯色材质(比如半透白色),内层半径比外层小0.01左右。相机进入外层内部时,内层半透球体会呈现轮廓感,且不影响外层透明效果。
简易自定义Shader方案
Shader Graph可视化版本(适合新手)
- 创建新的Unlit Shader Graph并打开编辑器。
- 添加
Camera Position和Object Position节点,用Vector3 Distance节点计算相机到球心的距离。 - 添加
Sphere Mask节点,设置Radius为球体实际半径,将距离值输入到Distance端口。 - 用
One Minus节点反转Sphere Mask输出,使相机在球内时Mask值为1,球外为0。 - 将反转后的Mask值连接到
Color节点的Alpha通道,再把Color节点连到Master节点的Color端口。 - 调整Color的RGB为目标轮廓色(比如灰色),Alpha设为0.8左右。
- 将该Shader赋予材质,添加到球体的Materials数组中(和原透明材质叠加使用)。
手写极简Shader版本
创建新的Unlit Shader,替换为以下代码后赋予材质给球体:
Shader "Custom/InsideOutline" { Properties { _OutlineColor ("Outline Color", Color) = (0.5,0.5,0.5,0.8) _SphereRadius ("Sphere Radius", Float) = 1.0 } SubShader { Tags { "RenderType"="Transparent" "Queue"="Transparent" } LOD 100 Blend SrcAlpha OneMinusSrcAlpha Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; }; struct v2f { float4 vertex : SV_POSITION; float3 worldPos : TEXCOORD0; }; float4 _OutlineColor; float _SphereRadius; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz; return o; } fixed4 frag (v2f i) : SV_Target { float dist = distance(_WorldSpaceCameraPos, unity_ObjectToWorld._m03_m13_m23); float showOutline = step(dist, _SphereRadius); return _OutlineColor * showOutline; } ENDCG } } }
使用时调整_SphereRadius为球体实际半径,_OutlineColor设置轮廓颜色和透明度,将该材质与原透明材质一同添加到球体的Materials数组即可。
内容的提问来源于stack exchange,提问作者repinSlun
相关产品推荐
相关产品推荐

